最近弄了一套SI4432模块玩,把2个模块连接到同一个单片机,一个作为发送另一个接收,从网上下载了一个RFtest51示例代码修改:
配置为FIFO CRC通讯模式,接收到有效数据包或CRC校验错误产生中断NIRQ 信号输入
- C/C++ code
while(1){ //当按键被按下就有一个数据包被发出; if(PB1_TX == 0)//(发送模块处理) { while( PB1_TX == 0 ); UART_Send_Str("按键按下,开始发送....\n"); RFFIFOSendData2(sendLen, str); //设置中断使能寄存器,这里设置为只有当有效的数据包被接收或者接收到的数据包数据CRC校验出错才来中断;具体设置参考0x05和0x06寄存器 SpiWriteRegister2(0x05, 0x03); //write 0x03 to the Interrupt Enable 1 register SpiWriteRegister2(0x06, 0x00); //write 0x00 to the Interrupt Enable 2 register //发射完毕后设置模块让它又工作在接收状态下; RFSetRxMode2(); UART_Send_Str("发送完毕,恢复到接收状态....\n"); } //check whether interrupt occured //查询中断是否到来,如果中断来了,根据我们前面中断使能寄存器的设置,说明有效数据包已经收到,或者收到的数据包CRC校验出错; //状态位进行处理 if( NIRQ == 0 ) { //设置模块处于空闲模式,处理收到的数据包,不继续接收数据 //RFSetIdleMode读取中断标志ItStatus1清中断标志,并设置接收模块为Idle模式 RFSetIdleMode(); UART_Send_Str("中断来了....\n"); /*CRC Error interrupt occured*/ //判断是否由于CRC校验出错引发的中断;在RFSetIdleMode中已经读出了中断状态寄存器的值 if( (ItStatus1 & 0x01) == 0x01 ) { //reset the RX FIFO //如果是CRC校验出错,那么接收FIFO复位; SpiWriteRegister(0x08, 0x02); //write 0x02 to the Operating Function Control 2 register SpiWriteRegister(0x08, 0x00); } /*packet received interrupt occured*/ //判断是否是数据包已经被正确接收。 if( (ItStatus1 & 0x02) == 0x02 ) { //数据判断处理 length = SpiReadRegister(0x4B); 。。。。。 } //reset the RX FIFO SpiWriteRegister(0x08, 0x02); //write 0x02 to the Operating Function Control 2 register SpiWriteRegister(0x08, 0x00); //write 0x00 to the Operating Function Control 2 register RFSetRxMode(); } }
********************************************************
现在问题是:每次按下按键后发送模块显示发送成功,接收模块也能接收产生NIRQ中断信号(即运行到了:中断来了....),但是ItStatus1为0,不能进入if数据处理。每次按键发送数据,接收模块都能正常产生中断信号,不知道问题出现在哪里?求高手指点!!!
------解决方案--------------------------------------------------------
看看你 RFSetIdleMode(); 是否正常返回 ItStatus1 变量。 我估计你在RFSetIdleMode()清中断的时候也把ItStatus1 赋值了。 你可以在 RFSetIdleMode()把 读到的中断 return出来。 我不知道你用的哪里的程序不过我推荐你用 官方提供的那套。