当前位置: 代码迷 >> Wireless >> SI4432通讯有关问题
  详细解决方案

SI4432通讯有关问题

热度:9159   发布时间:2013-02-26 00:00:00.0
SI4432通讯问题
最近弄了一套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出来。 我不知道你用的哪里的程序不过我推荐你用 官方提供的那套。
  相关解决方案