无线双工
其实NRF24L01+并没有这个模式,也可以说是“伪双工”,可是效果和正在的双工也差不了多少,思路是学习匿名的,有些地方他没有细讲,我自己查的数据手册,
采用的策略是其实无线接收端每收到数据都向发射端返回确认信号(ACK),然后呢,它有个功能,可以然你把接收端想发的数据先放到发射端的模块里,这样发送端对接收端发数据,接收端就能收到ACK,而这个ACK里面是带有你想要发送的数据的。
而在发射端是通过查询法来检测是否收到信号的,这里可以再优化。
接收端流程看数据手册如图
这是初始化的程序
/*
* 函数名:Nrf24l01_Init
* 描述 :初始化Nrf24l01,设置通信模式和通道
* 输入 :通信模式,通道
* 输出 :无
* 调用 :外部调用
*/
void Nrf24l01_Init(u8 model, u8 ch)
{
SPI_CE_L();
NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址
NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答
NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a); //设置自动重发间隔时间:500us;最大自动重发次数:10次
NRF_Write_Reg(NRF_WRITE_REG+RF_CH,ch); //设置RF通道为CHANAL
NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
//NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x07); //设置TX发射参数,0db增益,1Mbps,低噪声增益开启
/////////////////////////////////////////////////////////
if(model==1) //RX
{
NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); //选择通道0的有效数据宽度
NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断开启,16位CRC,主接收
}
else if(model==2) //TX
{
NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); //选择通道0的有效数据宽度
NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e); //IRQ收发完成中断开启,16位CRC,主发送
}
else if(model==3) //RX2 伪双工(应答数据中有数据)
{
NRF_Write_Reg(FLUSH_TX,0xff);
NRF_Write_Reg(FLUSH_RX,0xff);
NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断开启,16位CRC,主接收
/* 激活用于自动应答的一些指令所在的寄存器,是之可读
NRF_Write_Reg(ACTIVATE,0x73);//(好像24L01+不需要激活,数据手册没有这个命令)
*/
NRF_Write_Reg(NRF_WRITE_REG+0x1c,0x01);
NRF_Write_Reg(NRF_WRITE_REG+0x1d,0x07);
}
else //TX2 伪双工
{
NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断开启,16位CRC,主发送
NRF_Write_Reg(FLUSH_TX,0xff);
NRF_Write_Reg(FLUSH_RX,0xff);
/* 激活用于自动应答的一些指令所在的寄存器,是之可读
NRF_Write_Reg(ACTIVATE,0x73);//(好像24L01+不需要激活,数据手册没有这个命令)
// Spi_RW(0x50);
// Spi_RW(0x73);
*/
NRF_Write_Reg(NRF_WRITE_REG+0x1c,0x01);
NRF_Write_Reg(NRF_WRITE_REG+0x1d,0x07);
}
SPI_CE_H();
}
/* * 函数名:Nrf24l01_Check * 描述 :读写Nrf24l01,检测是否连接成功 * 输入 :无 * 输出 :无 * 调用 :外部调用 */ u8 Nrf24l01_Check(void) { u8 buf1[5]; u8 i; /*写入5个字节的地址. */ NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,5); /*读出写入的地址 */ NRF_Read_Buf(TX_ADDR,buf1,5); /*比较*/ for(i=0;i<5;i++) { if(buf1[i]!=TX_ADDRESS[i]) break; } if(i==5) return SUCCESS ; //MCU与NRF成功连接 else return ERROR ; //MCU与NRF不正常连接 }
接收端的发射函数和发射端的接收函数,让我设个回复可见
——回复可见内容——