查看: 873|回复: 0

[应用笔记] RF模组之SX127X的标志位问题

[复制链接]

74

主题

169

帖子

573

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
573
发表于 2023-1-4 09:29:00 | 显示全部楼层 |阅读模式
  背景

  本文旨在便于LORA模组的标志位加深印象和理解。必须注意的是本文讲述的仅仅是SX27X模组的LoRa模式下的标志位的注意事项。

  过程

  一、SX127X的DIOx提示的中断来源与哪里?

  SX127X的DIOx提示的中断源不是正交随意分配的

  如下图为SX127X的各个DIOx的中断源,可知SX127X的DIO0-DIO5中没有任何一个DIO能够提示所有的中断源,都是有不同的可以承担的工作的。

  最常用的最基础的是DIO0,可以承担RxDone、TxDone和CadDone的IO提示工作。
  但是DIO0某个时刻,到底提示的是RxDone、TxDone和CadDone中的那一种则需要由RegDioMapping里的配置的值决定的。
  所以按照这个理解的话,我们在操作模块进入每个不同状态时,想让DIO0提示出不同的中断源,软件上就需要对RegDioMapping的值进行变更来实现对DIO0提示不同中断源。

  看软件上的如下红色加粗的代码上也可以加以印证。

void SX127X_TxPacket(uint8_t*data)
{
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
SX127X_Write( REG_LR_PREAMBLEMSB, 0);
SX127X_Write( REG_LR_PREAMBLELSB, 10);
SX127X_Write( REG_LR_PAYLOADLENGTH, G_LoRaConfig.PayloadLength);

SX127XWriteRxTx(true);//

SX127X_Write( REG_LR_FIFOADDRPTR, 0x80);
SX127X_WriteBuffer(REG_LR_FIFO, data, G_LoRaConfig.PayloadLength);
SX127X_Write(REG_LR_IRQFLAGS, 0xff);
SX127X_Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_TXDONE));
SX127X_Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_01 );
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_TRANSMITTER );
}

void SX127X_StartRx(void)
{
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
SX127X_Write( REG_LR_PREAMBLEMSB, 0);
SX127X_Write( REG_LR_PREAMBLELSB, 10);
SX127X_Write( REG_LR_PAYLOADLENGTH, G_LoRaConfig.PayloadLength);

SX127XWriteRxTx(false);//LSD4RF-2F717N10

SX127X_Write( REG_LR_FIFOADDRPTR, 0x00);
SX127X_Write(REG_LR_IRQFLAGS, 0xff);
SX127X_Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_RXDONE));
SX127X_Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_00 );
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_RECEIVER );
}

  DIO0某个时刻,到底提示的是RxDone、TxDone和CadDone中的那一种则需要由RegDioMapping里的配置的值决定,但是最终输出的值是对应中断源的中断标志位的值。

  二、SX127X的中断源中断源的中断标志位有那些?

  SX127X的中断源的对应的中断标志位主要有如下这8个。
  比如说RxDone这个中断标志位里的数值是能够在数据包接收成功时变成1提示接收到了数据包的,但是是否允许这个标志位拥有提示的权力却在中断标志屏蔽开关寄存器中。

  如下图就是中断标志屏蔽开关寄存器。
  比如即使RegDioMapping中的DIO0的提示源指向了RxDone源,但是下图中的RxDoneMask写入了1,屏蔽了RxDone源,那么SX127X即使收到了一个数据包,DIO0上也不会有任何提示MCU接收到数据包的中断的IO的电平变化。

  对应到如下软件红色加粗的代码上也会有印证。

void SX127X_TxPacket(uint8_t*data)
{
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
SX127X_Write( REG_LR_PREAMBLEMSB, 0);
SX127X_Write( REG_LR_PREAMBLELSB, 10);
SX127X_Write( REG_LR_PAYLOADLENGTH, G_LoRaConfig.PayloadLength);

SX127XWriteRxTx(true);//

SX127X_Write( REG_LR_FIFOADDRPTR, 0x80);
SX127X_WriteBuffer(REG_LR_FIFO, data, G_LoRaConfig.PayloadLength);
SX127X_Write(REG_LR_IRQFLAGS, 0xff);
SX127X_Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_TXDONE));
SX127X_Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_01 );
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_TRANSMITTER );
}
void SX127X_StartRx(void)
{
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
SX127X_Write( REG_LR_PREAMBLEMSB, 0);
SX127X_Write( REG_LR_PREAMBLELSB, 10);
SX127X_Write( REG_LR_PAYLOADLENGTH, G_LoRaConfig.PayloadLength);

SX127XWriteRxTx(false);//

SX127X_Write( REG_LR_FIFOADDRPTR, 0x00);
SX127X_Write(REG_LR_IRQFLAGS, 0xff);
SX127X_Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_RXDONE));
SX127X_Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_00 );
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_RECEIVER );
}

  结论

  DIOx的IO上要想成功提示出一个正确需要的中断源,RegIrqFlagsMask(0x11)--中断标志屏蔽开关寄存器必须不能屏蔽对应的中断源,而且RegDioMapping里的配置的DIOx提示来源的值必须也要指定到对应的中断源,这时如果对应的中断源被触发,DIOx的IO上才会产生正确对应中断源的中断信号。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表