好,还有发一个包和收一个包数据的代码,给大家帖出来.
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:发送完成状况
u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta;
NRF24L01_CE=0;
NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32个字节
NRF24L01_CE=1;//启动发送
while(NRF24L01_IRQ!=0);//等待发送完成
sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
NRF24L01_Write_Reg(WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&MAX_TX)//达到最大重发次数
{
NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
return MAX_TX;
}
if(sta&TX_OK)//发送完成
{
return TX_OK;
}
return 0xff;//其他原因发送失败
}
记住要记住有颜色的这几行.
然后是收一包数据.
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
u8 sta,sta1;
sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
NRF24L01_Write_Reg(WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
Clear_line(18,0,30);
sta1=NRF24L01_Read_Reg(STATUS);
Bit_show(18,11,sta1);
if(sta&RX_OK)//接收到数据
{
NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
return 0;
}
return 1;//没收到任何数据
}
看到没有,和发数据不同,这里不用 NRF24L01_CE=0和NRF24L01_CE=1.
如下几点在调试的时候总结出来的:
- 如果 TX FIFO 刚好够32个数时,状态寄存器都会显示 0 未满.如再丢进去就会说满了.
- 重启计算机时要记住重起一下NRF24 因为里边的数据还是之前的,除非重写一次.
- 中断位是要写1清0的.
- 如果地址都相同,读出来数据的是频道号数最大的那个频道.就是接收5通道. 大家可以做下实验,看对不对.
- 频道2~5只需写一个8位的地址就行.
- 有时中断产生了,但RX_FIFO会为0,要重读一次.
好了.大家如还发现什么都发到帖上去吧.
我丢上两个代码给大家试试.压缩的文件.
TX_COM_NRF2401_TEXT.rar (634.36 KB )
RX_COM_NRF2401_TEXT.rar (635.46 KB )