查看: 644|回复: 0

[应用笔记] 二代LORA模组前导码中断标志详解

[复制链接]

67

主题

100

帖子

570

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
570
发表于 2023-4-4 10:22:10 | 显示全部楼层 |阅读模式
背景
二代LORA模组中有个标志位叫做前导码检测到中断标志(PreambleDetected)平时不怎么用,包括包头有效标志位(HeaderValid)也不怎么使用。

本文讲解这两个标志位的使用注意的事项,比如:每次检测只启动了一次进入RX模式;PreambleDetected   HeaderValid置位并不能使模组退出RX模式;只有RXDONE置位了模组才退出RX模式;PreambleDetected   HeaderValid置位时是读取不到数据包的,只有RXDONE置位了才能读取到数据包;接收端要用PreambleDetected   HeaderValid的话接收端配置的前导码长度要大于等于发送端的前导码长度。

过程
一、主机端测试包制作
首先我们要做一个主机端发射的数据包。
为了方便区分PreambleDetected   HeaderValid  和 RXDONE标志位的置位顺序,我们故意做一个前导码很长的包,该包使用显性包头,有效数据用10字节。
我们先以如下配置为例:
G_LoRaConfig.LoRa_Freq = Fre[0];
G_LoRaConfig.BandWidth = LORA_BW_125;    //BW = 125KHz  BW125KHZ
G_LoRaConfig.SpreadingFactor = LORA_SF9;  //SF = 9
G_LoRaConfig.CodingRate = LORA_CR_4_6;     //CR = 4/6
G_LoRaConfig.PowerCfig = 22;               
G_LoRaConfig.HeaderType = LORA_PACKET_EXPLICIT;       //包头格式设置,显性包头:LORA_PACKET_EXPLICIT;隐性包头:LORA_PACKET_IMPLICIT
G_LoRaConfig.CrcMode = LORA_CRC_ON;             //CRC校验开启:LORA_CRC_ON,关闭:LORA_CRC_OFF
G_LoRaConfig.InvertIQ = LORA_IQ_NORMAL;         //IQ信号格式,LORA_IQ_NORMAL:标准模式,LORA_IQ_INVERTED:反转模式;
G_LoRaConfig.PreambleLength = 2500;    //前导码长度
G_LoRaConfig.PayloadLength = 10;      //数据包长度
然后用如下网址
Air time calculator | LoRaTools
先计算一下包的总时间:

可知总时间位10.4秒左右

然后做每隔20秒发一包的代码:



然后用功率测试仪测试一下时间是否正确:


可以看到实测的时间长度都能对的上。
到这里发送测试包就做好了

二、接收端测试代码
按照另外一篇文档中的LORA帧格式来来说可知:前导码在前,包头在中间,然后事负载数据,最后事CRC

在看标志位寄存器值:

可知:
PreambleDetected标志为BIT2(0x0004)   HeaderValid标志为BIT4(0x0010)   RXDONE标志为BIT1(0x0002)
然后我们做一个接收端测试代码:

接收端测试代码比较简洁:就是每次先进RX,然后不停的读取标志寄存器,再把读取到的值串口打印出来,直到PreambleDetected   HeaderValid   RXDONE三个标志都检测到后再重新进入接收,再如此循环,这样在配合上发送端的测试代码就可以完成测试了。

然后我们让测试环境跑起来:


根据测试信息会发现:红箭头之前主机没法包时标志寄存器一直为0x00,然后到红箭头和绿色箭头之间标志寄存器为0x04,然后到绿色箭头附件开始变为0x14,直到主机包发完变为0x16。
所以可知PreambleDetected   HeaderValid   RXDONE三个标志位的置位顺序和数据包帧格式的先后顺序一致,就是PreambleDetected先置位 然后HeaderValid置位   然后RXDONE置位。

结论
需要注意:
1、每次检测只启动了一次进入RX模式
2、PreambleDetected   HeaderValid置位并不能使模组退出RX模式
3、只有RXDONE置位了模组才退出RX模式
4、PreambleDetected   HeaderValid置位时是读取不到数据包的,只有RXDONE置位了才能读取到数据包
5、接收端要用PreambleDetected   HeaderValid的话接收端配置的前导码长度要大于等于发送端的前导码长度。
例如本测试发送端用2000前导码长度,接收端我用了0xFFFF(否则会很容易丢包甚至根本收不到包)


6、千万注意要给前导码标志检测留余量,下图中红色箭头位置是前导码检测的最后截止点,一旦错过这个点,再开启前导码标志检测将检测不到。


测试代码如下:


本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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