3,846
社区成员
发帖
与我相关
我的任务
分享
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();
}
}
void RFSetIdleMode(void)
{
//The radio will work in idle mode
SpiWriteRegister(0x07, 0x01);
//write 0x09 to the Operating Function Control 1 register
SpiWriteRegister(0x0E, 0x01);
//Read interrupt status regsiters. It clear all pending interrupts and the nIRQ pin goes back to high.
ItStatus1 = SpiReadRegister(0x03); //read the Interrupt Status1 register
ItStatus2 = SpiReadRegister(0x04); //read the Interrupt Status2 register
}