nRF24L01 发送数据完毕后,状态寄存器读出来的数据都是0xff,为什么?
我在nRF24L01调试过程中,发现发送数据完毕后,IRQ中断信号有效后,读状态寄存器值是0xff。判断TX_DS比特为1,导致误判断发送成功。由于只有发送模块工作,接收...
我在nRF24L01调试过程中,发现发送数据完毕后,IRQ中断信号有效后,读状态寄存器值是0xff。判断TX_DS比特为1,导致误判断发送成功。由于只有发送模块工作,接收模块没有上电,在配置发送等ACK时实际并没有发送成功。
1) 但是串口却能输出TX OK.当时以为发射已经调通了。在2014/02/04最后才明白,调通其实是假象,原来是单片机发送完后读STATUS寄存器的值为0xff,其与任何为与都非0,所以程序误以为TX_DS比特为1.
由此继续调试接收模块却始终调不通。原因是发送并没有真正调通。
nRF24L01 发送数据完毕后,状态寄存器读出来的数据都是0xff,为什么? 展开
1) 但是串口却能输出TX OK.当时以为发射已经调通了。在2014/02/04最后才明白,调通其实是假象,原来是单片机发送完后读STATUS寄存器的值为0xff,其与任何为与都非0,所以程序误以为TX_DS比特为1.
由此继续调试接收模块却始终调不通。原因是发送并没有真正调通。
nRF24L01 发送数据完毕后,状态寄存器读出来的数据都是0xff,为什么? 展开
1个回答
展开全部
我没有资料在 旁边,但我去年刚完成了一个nRF24L01
无线收发的项目,客户已验收
记得一点是这样写的,希望有帮助
#define tx sta^5 //位定义,状态寄存器的第5位
#define max sta^4
wtb(0xa0,mode);//向TX FIFO 写入一个值mode
ce=1;
for(n=43;n>0;n--);//进入接受模式130us,然后下面的是校验说明书上的STATUS内容
sta=wob(0xff); //读状态,wob函数 是write one byte,自己编的程序向24L01寄存器写1个命令
if(tx) //若状态寄存器的第5位 被置1
{
wtb(0x27,0xff); //些入1 清除标志位
wob(0xe1); //清除TX fifo
sta=wob(0xff); //再读一次STATUS,看tx是否被成功清零,成功清0就闪灯,tmp是一个临时 char型变量,前面已定义,
if(tx==0)
{
while(tmp--)
{led1=1;delay(20000);led1=0;delay(20000);} //灯闪烁的次数是为了测试程序是否成功用
}
}
nRF24L01在中断标志置位后,必须写1清零,不然可能死机
发送接收成功,硬件会自动清FIFO,不必手动清0 FIFO,希望有所帮助,
if(max) //达到最大重发次数,清中断标志,清FIFO
{
wtb(0x27,0xff);
wob(0xe1);
sta=wob(0xff);
}
无线收发的项目,客户已验收
记得一点是这样写的,希望有帮助
#define tx sta^5 //位定义,状态寄存器的第5位
#define max sta^4
wtb(0xa0,mode);//向TX FIFO 写入一个值mode
ce=1;
for(n=43;n>0;n--);//进入接受模式130us,然后下面的是校验说明书上的STATUS内容
sta=wob(0xff); //读状态,wob函数 是write one byte,自己编的程序向24L01寄存器写1个命令
if(tx) //若状态寄存器的第5位 被置1
{
wtb(0x27,0xff); //些入1 清除标志位
wob(0xe1); //清除TX fifo
sta=wob(0xff); //再读一次STATUS,看tx是否被成功清零,成功清0就闪灯,tmp是一个临时 char型变量,前面已定义,
if(tx==0)
{
while(tmp--)
{led1=1;delay(20000);led1=0;delay(20000);} //灯闪烁的次数是为了测试程序是否成功用
}
}
nRF24L01在中断标志置位后,必须写1清零,不然可能死机
发送接收成功,硬件会自动清FIFO,不必手动清0 FIFO,希望有所帮助,
if(max) //达到最大重发次数,清中断标志,清FIFO
{
wtb(0x27,0xff);
wob(0xe1);
sta=wob(0xff);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询