|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2012-12-19 13:53:50
|
显示全部楼层
下文选自tianyuhui 在本论坛发的帖子::NRF24L01+ 调试问题
http://www.amobbs.com/thread-5489550-1-2.html
tianyuhui,如果涉及版权问题,请联系楼主删除该楼。![](static/image/smiley/default/lol.gif)
=================================================================
解决了,主要的四个函数代码:
void NRF24L01_Set_TxMode(void)
{
NRF24L01_CE_L();
/* 写TX节点地址 */
NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, TX_ADDRESS, TX_ADDR_WIDTH);
/* 写接收端地址 */
NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0, RX_ADDRESS, RX_ADDR_WIDTH);
/* 使能通道0的自动应答 */
NRF24L01_Write_Reg(WRITE_REG+EN_AA, 0x01);
/* 使能通道0的接收地址 */
NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR, 0x01);
/* 设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次 */
NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR, 0x1a); // 0x1a
/* 设置信道工作为2.4GHZ,收发必须一致 */
NRF24L01_Write_Reg(WRITE_REG+RF_CH, 40);
/* 设置TX发射参数,0db增益,1Mbps,低噪声增益开启 */
NRF24L01_Write_Reg(WRITE_REG+RF_SETUP, 0x07);
/* 配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断 */
NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0e);
NRF24L01_CE_H(); //CE为高,需10us后启动发送
Delay_nus(10);
}
void NRF24L01_TxPacket(u8 *tx_buf)
{
u8 status; //状态变量
/* 发送一次数据 */
NRF24L01_CE_L();
NRF24L01_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLD_WIDTH); //写数据到TX_BUF
NRF24L01_CE_H();
Delay_nus(500); //延时确保数据发送完成(注意!)
status = NRF24L01_Read_Reg(STATUS);
printf("\r\n %d ", status);
printf("\r\n %d ", NRF24L01_Read_Reg(FIFO_STATUS));
NRF24L01_Write_Reg(WRITE_REG+STATUS, status); //清除TX_DS或MAX_RT中断标志
NRF24L01_Write_Reg(FLUSH_TX, 0xff); //清除TX_FIFO寄存器
}
void NRF24L01_Set_RxMode(void)
{
NRF24L01_CE_L();
/* 写RX节点地址 */
NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0, RX_ADDRESS, RX_ADDR_WIDTH);
/* 使能通道0的自动应答 */
NRF24L01_Write_Reg(WRITE_REG+EN_AA, 0x01);
/* 使能通道0的接收地址 */
NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR, 0x01);
/* 设置信道工作为2.4GHZ,收发必须一致 */
NRF24L01_Write_Reg(WRITE_REG+RF_CH, 40);
/* 选择通道0的有效数据宽度 */
NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0, RX_PLD_WIDTH);
/* 设置TX发射参数,0db增益,1Mbps,低噪声增益开启 */
NRF24L01_Write_Reg(WRITE_REG+RF_SETUP, 0x07);
/* 配置基本工作模式的参数;PWR_UP, EN_CRC, 16BIT_CRC, 接收模式 */
NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);
NRF24L01_CE_H(); //CE为高,进入接收模式
Delay_nus(130);
}
u8 NRF24L01_RxPacket(void)
{
u8 status; //接收状态变量
status = NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
/* 接收到数据 */
if(RX_OK == status)
{
/* 读取数据 */
NRF24L01_Read_Buf(RD_RX_PLOAD, RX_BUF, RX_PLD_WIDTH);
/* 清除STATUS */
NRF24L01_Write_Reg(WRITE_REG+STATUS, 0xff);
/* 清除RX_FIFO寄存器 */
NRF24L01_Write_Reg(FLUSH_RX, 0xff);
return 1;
}
else return 0; //没收到任何数据
}
============================== |
|