NRF24L01+自组网(1对多)实现
本算法基于软件分配和判断从机地址的方式实现,模块不使用自动应答模式和自动重发模式,并且关闭发送中断和最大重发次数中断。故将NRF24L01+模块的代码部分发出来分享一下,算法算不上完美,大神轻喷:
算法注意点:
主机和从机共同使用同一个通道,所有从机的地址相同,所以主机发送指令时,要带上软件分配的从机地址
关闭发送中断和最大重发次数中断,防止发送完成或者超过重发次数引起中断,但不会影响读取标志位的值
从机采用中断接收模式,主机采用定时器定时查询NRF24L01+模块的STATU寄存器进行判断,也可用中断方式进行接收,但是要考虑到中断是下降沿触发,但是要考虑到单片机有没有可能在处理别的中断的时候,由于关闭了全局中断而此时有触发了接收中断而不能及时处理,从而错过了下降沿触发的时间,需根据具体情况具体分析。
由于屏蔽了发送中断,在发送时需要对CE管脚的高电平时间进行足够的延时,不然会引起发送乱码或者发送失败
由于采用的是非自动应答模式,所以需要切换发送和接收模式
为了保证通讯的质量,需要对发送的数据进行CRC校验
代码块
使用了PIC16F1876系列,发送和接收设置代码:
//发送模式配置字
void TX_Mode(void)
{
Clr_NRF24L01_CE;
//写TX节点地址
NRF24L01_Write_Buf(NRF24L01_WRITE_REG+TX_ADDR,(unsigned char*)TX_ADDRESS,TX_ADR_WIDTH);
//设置TX节点地址,主要为了使能ACK
NRF24L01_Write_Buf(NRF24L01_WRITE_REG+RX_ADDR_P0,(unsigned char*)RX_ADDRESS,RX_ADR_WIDTH);
//失能自动应答功能(广播模式)
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+EN_AA,0x00);
//使能通道0的接收地址
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+EN_RXADDR,0x01);
//失能自动重发功能
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+SETUP_RETR,0x00);
//设置RF通道为CHANNEL
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+RF_CH,CHANNEL);
//设置TX发射参数,0db增益,250kbps,低噪声增益开启
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+RF_SETUP,0x27);
//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,关闭发送和重发中断
NRF24L01_Write