如何使用SX1278的中断控制发送和接收
中断寄存器
在SX1278中,中断寄存器的地址是0x12, 在数据手册中称为RegIrqFlag. 是一个非常重要的寄存器,利用这个寄存器可以控制芯片读取接收到的信息。
首先要介绍这个寄存器各个位的含义:
第7位: RxTimeout接收超时中断,要在接收状态等待,接收超过(博客中文章提及)定义的时间,产生超时中断。写入该位为1清除该中断位。 第六位: RxDone接收完成产生中断:写1清除该中断位。 第五位: 发送数据CRC错误中断。写1清除中断位。 第四位: Rx接收到正确的头数据中断。写1清除中断位。 第三位: Tx发送完成中断。FIFO中的数据发送完成中断。写1清除中断位。 第二位: CAD完成中断。写1清除该中断位。 第一位: FHHS变换通道中断。写1清除该中断位。 第零位: 在CAD期间检测到正确的LoRa信号中断,写1清除该中断位。
中断寄存器在程序中使用
在运行过程中,如果没有编写回调函数,要在程序中不断用程序来检测这个中断寄存器的数值,当数值大于1时,需要判断是哪个位被置1了。发送一组数据,然后等待应答的例子程序程序如下:
SX1278WriteBuffer(REG_LR_IRQFLAGS, 0xFF); // 清除所有的中断 FUN_RF_SENDPACKET(“my Message", 10); // 延时,等待发送完成,并清除中断 delayMS(1000); SX1278WriteBuffer(REG_LR_IRQFLAGS, 0xFF); sxStep = 1; if (sxStep == 1) { RF_EX0_STATUS = SX1278ReadBuffer(REG_LR_IRQFLAGS); if ( !bUnCnt && RF_EX0_STATUS > 0 ) { bUnCnt = true; if (( RF_EX0_STATUS & 0x08 ) == 0x08) { SX1278LoRaSetOpMode( Stdby_Mode ); // 设置standby mode SX1278WriteBuffer(REG_LR_IRQFLAGSMASK, IRQN_RXSIG_Value); // IRQN_RXSIG_Value = 0x1F // 屏蔽0-4位中断,打开5-7 // bit 7: RXTimeoutMask // bit 6: RxDoneMask // bit 5: PayloadCrcErrorMask SX1278WriteBuffer(REG_LR_HOPPERIOD, 0xFF); SX1278LoRaSetOpMode( receive_single); // 本次接收到TxDone中断,不再执行对发送中断的判断 } } if (RF_EX0_STATUS > 0) { if ( (RF_EX0_STATUS & 0x40 ) == 0x40) // RxDone 中断发生 { SX1278WriteBuffer(REG_LR_FIFOADDRPTR, 0x00); // 确定起始指针 SX1278_RLEN = SX1278ReadBuffer(REG_LR_NBRXBYTES); // 获取接收的字节数量 FUN_RF_READPACKET(RECV, SX1278_RLEN); // 接收应答完毕 } if (( RF_EX0_STATUS & 0x80 ) == 0x80 ) // RxTimeout 中断发生 { SX1278LoRaSetOpMode(Stdby_mode); SX1278WriteBuffer(REG_LR_IRQFLAGSMASK, 0xFF); // 屏蔽所有中断 SX1276LoRaSetOpMode(Sleep_mode); // 进入休眠状态 } sxStep = 0; } }
中断程序说明
简单总结发送和接收的过程即,当发送完一个信息后,如果是要等待应答的话,需要在接到了TxDone后进入接收等待的状态,在规定的时间内接收到回答信号就开始接收,如果发生了超时接收中断信号,就放弃。进入下一次的发送过程。
在程序中,使用0x08 即第3位,TxDone发送完成中断;0x40即第六位,RxDone接收完成中断;RxTimeout中断;通过这些中断位,控制发送和接收,在超时时退出接收过程。