曲曲折折一个月,终于找到具体原因了,中途虽然能接收到数据,但是总是感觉心里有个梗,不爽。。。
Nrf24L01接收端接收不到数据、接收数据不稳定、中断只触发一次等等,都可能是这个原因。
我们都知道,接收端接收到数据,处理完数据后要清空接收反冲区。FLUSH_RX:清空RX FIFO寄存器。
NRF2_SPI_WriteReg(FLUSH_RX,0xFF); //清除RX FIFO寄存器
但是关键的一点就是清空RX FIFO寄存器的时间。
官方数据手册中有一句话:
Flush RX FIFO, used in RX mode Should not be executed during transmission of acknowledge, that is, acknowledge package will not be completed.
在传输应答信号过程中不应执行此指令,也就是说,若传输应答信号过程中执行此指令的话将使得应答信号不能被完整传输。当接收端的应答信号不能返回到发送端的时候,就会一直处于发送模式,所以再也无法触发接收中断了。
解决办法:
当触发接收中断的时候,不立马清空RX FIFO,而延时一段时间,在读取接收数据和清空RX FIFO;
详细注解代码:
void
void EXTI9_5_IRQHandler(void) //触发中断服务函数
{
u8 state;
u8 rxbuf[32]; //接收缓冲区
Delay_ms(1);//重要,延时等待AKC发送完成,再处理数据,1ms是偏高的,时间自行调试和把握
if(EXTI_GetITStatus(EXTI_Line7) != RESET) //确保是否产生了EXTI Line中断
{
NRF2_CE_LOW(); //24l01进入待机状态,读取数据的时候CE要拉低
state=NRF2_SPI_ReadReg(STATUS);/*读取status寄存器的值 */
NRF2_SPI_ReadBuf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据 到rxbuf 中
... //数据处理代码
NRF2_SPI_WriteReg(NRF_WRITE_REG+STATUS,state);/* 清除24L01接收中断标志*/
NRF2_SPI_WriteReg(FLUSH_RX,0xFF); //清除RX FIFO寄存器
NRF2_CE_HIGH();//24l01回到接收模式
EXTI_ClearITPendingBit(EXTI_Line7); //清除stm32中断标志位
}
}
以上只是我自己碰到的问题的解决办法,每个人可能不一样。无线这种看不见摸不着的真能调到你怀疑人生,分享出来能救一个是一个,毕竟胜造七级浮屠。
另链接另一个同样问题的博主,虽然不太懂他怎么做的,但也许你需要参考:http://blog.csdn.net/lonerzf/article/details/6645551
|