两个星期之前,我就完成了 nRF24l01的收发。但是可能正是由于太早出结果,导致了一些深层次的问题没有被发现。后来做声音引导的时候发现只能发送,不能接收数据。开一还以为是硬件坏了。真是晕。下面是我的nRF24L01中断处理程序
#pragma vector=PORT2_VECTOR//24L01中断
__interrupt void IRQ_ISP(void)
{
i++;
nRF24L01_Statues=SPI_Read(STATUS);
nRF24L01_Statues_Flag=0;
if(nRF24L01_Statues&RX_DR)/**接收正常**/
{
SPI_Read_Buf(RD_RX_PLOAD,RX_BUF,TX_PLOAD_WIDTH);
nRF24L01_Statues_Flag=1;
nRF24L01_CEL; //进入待机模式
}
else if(nRF24L01_Statues&TX_DR)//发送完毕
{
nRF24L01_Statues_Flag=2;
}
else if(nRF24L01_Statues&MAX_RT)//发送失败
{
nRF24L01_Statues_Flag=3;
}
P2IFG&=~BIT5;
SPI_RW_Reg(WRITE_REG+STATUS,nRF24L01_Statues);
}
然后再有
nRF24L01_Statues_Flag=0;
nRF24L01_Init(nRF24L01_TRA);//发送采样命令
while(nRF24L01_Statues_Flag!=2);//第一次发送
nRF24L01_Statues_Flag=0;
nRF24L01_Transmit(TX_BUF);//第二次发送
这么处理下,就解决了问题。
我一开始的设定的是发送端每次发送一次。结果接收端只能接收一次,但发送端却显示发送成功。
又来改成发送端发送两次以上。结果,正常接收了。问题是,为什么会这样?
可能是这样的,我们第一次时能够将PID(数据包识别)进行对比,但是我们没有在初始化时将数据包识别这个PID置零。而发送端如果只有发送一次,那么很有可能会使得接收端对比的两个PID值相同,使得nRF24L01误认为时重发的数据包。这时候,我们可以发现,只有在断电复位之后才能接收到一次值。
这儿的高手比较多。我大胆地把我的想法提了出来。不知道是不是这样。还请前辈们多多指教。