SX1278中断详解
中断寄存器
在SX1278中,中断寄存器的地址是0x12, 在数据手册中称为RegIrqFlag. 是一个非常重要的寄存器,利用这个寄存器可以控制芯片读取接收到的信息。
首先要介绍这个寄存器各个位的含义:
Name(Address) | Bits | Variable Name | Mode | Reset | LoRa Description |
---|---|---|---|---|---|
RegIrqFlag | 7 | RxTimeout | rc | 0x00 | Timeout interrupt, write a 1 clears the IRQ |
6 | RxDone | rc | 0x00 | Packet receive complete interrupt, write a 1 clears the IRQ | |
5 | PayloadCrcError | rc | 0x00 | Payload CRC error interrupt, write a 1 clears the IRQ | |
4 | ValidHeader | rc | 0x00 | Valid header received in RX: write a 1 clears the IRQ | |
3 | TxDone | rc | 0x00 | FIFO payload transmission complete interrupt: write a 1 clears the IRQ | |
2 | CadDone | rc | 0x00 | CAD complete: write a 1 clears the IRQ | |
1 | FhhsChangeChannel | rc | 0x00 | FHHS change channel interrupt: write a 1 clears the IRQ | |
0 | CadDetected | rc | 0x00 | Valid LoRa signal detected during CAD operation: write a 1 clears the IRQ |
第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中断;通过这些中断位,控制发送和接收,在超时时退出接收过程。