nrf24l01双向通讯问题

2024-12-03 07:54:59
推荐回答(3个)
回答1:

给你看一下我的程序。设置标志位,来回切换,不过有个问题,运行几秒钟后就会卡住,重启任意一方的单片机,恢复正常,又是需要重启master恢复,有时重启slave恢复。我将一方设置为单一发送,一方设置为单一就收,结果不卡。说明卡住的原因是在某一时刻双方都切换到接收,或都切换为发射。但是我怎么分析,都觉得不会碰撞。还请您帮我看看问题出在哪。互相学习,共同提高嘛!谢谢!
我的邮箱:huayueyx@163.com
我的qq:1037234643

void Transmission(void)
{
switch(rt_flag)
{
case 0://接收
{
while(PINB&(1< irq_sta=Read_IRQ();
if(irq_sta&(1< {
Clr_IRQ(1< Read_Rx();//发送读RX_FIFO指令,并将数据写入Rx_Data[]
SpiRW(0xE2);//清空RX FIFO
z_post_site.b[1]=RxData[5];
z_post_site.b[0]=RxData[4];
y_post_site.b[1]=RxData[3];
y_post_site.b[0]=RxData[2];
x_post_site.b[1]=RxData[1];
x_post_site.b[0]=RxData[0];
rt_flag=1;
//DisplayData(0,3,3,rt_flag);

}
break;
}
case 1://发送
{
TxData[11]=z_pre_site.b[1];
TxData[10]=z_pre_site.b[0];
TxData[9]=y_pre_site.b[1];
TxData[8]=y_pre_site.b[0];
TxData[7]=x_pre_site.b[1];
TxData[6]=x_pre_site.b[0];
W_Send_Data();
Tx_Exe();
while(PINB&(1< irq_sta=Read_IRQ();
if(irq_sta&(1< {
Clr_IRQ(1< SpiRW(0xE1);//清空TX FIFO
Rx_Exe();
rt_flag=0;
}
else if(irq_sta&(1< {
Clr_IRQ(1< SpiRW(0xE1);//清空TX FIFO
}
break;
}
}
}

回答2:

设置标志位,来回切换,不过有个问题,运行几秒钟后就会卡住,重启任意一方的单片机,恢复正常,又是需要重启master恢复,有时重启slave恢复。将一方设置为单一发送,一方设置为单一就收,结果不卡。说明卡住的原因是在某一时刻双方都切换到接收,或都切换为发射。但是怎么分析,都觉得不会碰撞。

回答3:

我最近也再做这个设计。我是这样解决的,看看对你有没有帮助?
你这样,两个模块都置为接收模式。
对于A,可以一直置为接收模式,当A要发数据的时候再转成发送模式。接收模式时间要长一点比较稳定。比如,接收模式下延时1秒,发射模式不需要延时。直接发送,发送数据完毕等待ACK好了就置为接收模式。一直这样循环就行了。
对于B,也是用一样的原理。一直置为接收模式,当需要发送数据的时候再转模式就好了。