物联网终端模块学习: Rola通信模块的学习(适合初学者 Rola学习深度理解)
首先可以到开源代码网站github下载源码,很方便的,里面的源码也有很多简化清晰易懂,或者如果在网上买了这种模块,会赠送源代码的。然后就是下载sx1278的芯片手册了,这个直接到网上搜索就ok了。最后我们一起来学习下这个模块的使用。
概述
概述:SX1276/77/78 系列产品采用了 LoRa TM 扩频调制解调技术,使器件传输距离远远超出现有的基于 FSK 或 OOK 调制方式的系统。在最大数据速率下,LoRa TM 的灵敏度要比 FSK 高
出8dB;此外,LoRa TM 在选择性和阻塞性能方面也具有显著优势,可以进一步提高通信可靠
度。同时,它还提供了很大的灵活性,用户可自行决定扩频调制带宽(BW)、扩频因子(SF)
和纠错率(CR)。扩频调制的另一优点就是,每个扩频因子均呈正交分布,因而多个传输信
号可以占用同一信道而不互相干扰,并且能够与现有基于 FSK 的系统简单共存。此外,
SX1276/77/78 还支持标准的 GFSK、FSK、OOK 及 GMSK 调制模式,因而能够与现有的
M-BUS 和 IEEE 802.15.4g 等系统或标准兼容。(这些属于发送接收器性质的无线通信基础知识,需加强认识,方便学习)还有对着数据手册了解sx1278器件的关键参数对后面代码的学习与设置有很大的帮助。
.对于sx1278芯片中的无线通信调制方式Rola和FSK技术的对比如下表格:
Rola | FSK |
---|---|
1.通信距离远 | 1.容易实现 |
2.Lora芯片兼容FSK模式 | 1.抗噪声与抗衰减较好 |
3.低功耗 | 3.传输速率较高 |
无线通信的应用要涉及到各种各样的参数,功耗、传输距离、传输数据量等等。而在远距离传输时,综合各项指标,LoRaTM调制方式为最佳选择,
使用流程
关于能看懂原代码以及自己写简化版的代码,了解其流程非常重要,以及各种设置,设置主要还是对于芯片的寄存器的位进行操作。所以了解寄存器的位的功能以及读写寄存器十分重要。比如:下面展示一些 定义寄存器地址映射
。
// 寄存器:RegModemConfig2,偏移地址:0x1E
#define REG_LR_MODEMCONFIG2 0x1E
/*
bit7-4 扩频因子设置(具体见数据手册)
bit3 :0 :正常模式 , 发送单个数据包
1 : 持续模式,通过FIFO发送多个数据包
bit2 : 发送端crc信息
0 : crc关闭
1 : crc开启
bit1-0 : RX超时最高有效值
*/
寄存器又包括:
1.LoRa TM 配置寄存器:配置寄存器可以通过SPI接口访问。寄存器在任何设备模式(包括睡眠模式)下均可读,但仅在睡眠和待机模式下可写。请注意:在LoRa TM 模式下,自动顶级定序(TLS模式)不可用, 配置寄存器映射关系变化可以参见数据手册。。
2.状态寄存器:状态寄存器在接收机运行过程中提供状态信息。
3.LoRa TM 模式 FIFO 数据缓存(具体操作原理可以参见数据手册,清晰易懂)
注意:以上对看懂源码以及形成自己风格简化非常重要!
LoRa TM 调制解调器状态机序列流程图:
在发送模式下,仅在需要发送数据包数据的时候才会启动射频模块、PLL模块及PA模块,
这样可以优化功率消耗率。下图介绍下典型的发送程序流程图
- 静态配置寄存器只有在睡眠模式、待机模式或FSTx模式下才可以访问。
- LoRa TM FIFO数据缓存只有在待机模式下才允许写入。
- 通过发送TX模式请求,开始数据发送。
- 一旦完成数据发送,则发出TxDone中断请求,芯片回到待机模式。
- 发送操作完成后,可以手动将无线设备设置为睡眠模式或重新向FIFO数据缓存写入数
据,以便稍后再次进行Tx操作。
再以学习者的角度解释一下此流程图,首先按要求设置待机模式(通过寄存器RegOpMode(0x01)),然后向数据缓冲区FIFO写数据,再把模式设置成发送模式,等待RegIrqFlags(0x12)状态寄存器中的状态位第三位TxDone置为1,接下来软件自动调整模式寄存器为待机模式,最后就是判断是否有新的要发送的数据。
其他的一般的流程均按照此方法可以分析! 之前全是基础知识,需掌握,接下来将讲述代码实现流程;
简化代码实现:
1.代码中首先要设置参数如发射功率434MHZ,扩频因子:12,纠错编码:4/6,带宽等,实现其最好使用函数封装方便调用,写函数时都是写相应寄存器的值进行设置。(参数根据实际情况设置)
2.笔者使用的是stm32驱动sx1278,通过spi总线与sx1278连接,在程序中做好spi读写的函数(sx1278寄存器为8位),然后在sx1278.c中写一个读写寄存器的函数,可以参照源码,这个函数至关重要,对于以下的设置都会调用。
3.Lora初始化中流程如代码:
初始化代码,可以参照数据手册中的规定设置
*********************************************************************************************************
* 函 数 名: SX1276LORA_Init
* 功能说明: SX1278初始化
* 形 参
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
void SX1276LORA_Init(void)
{
SX1276LoRaSetOpMode(Sleep_mode); /* 设置成睡眠模式 */
SX1276LoRaFsk(LORA_mode); /* 设置为Lora模式 */
SX1276LoRaSetOpMode(Stdby_mode); /* 设置为待机模式 */
SX1276WriteBuffer( REG_LR_DIOMAPPING1, GPIO_VARE_1); /* 写 0x40寄存器 ,DIO引脚映射设置 ,设为00*/
SX1276WriteBuffer( REG_LR_DIOMAPPING2, GPIO_VARE_2);
SX1276LoRaSetRFFrequency(); /* 频率设置 */
SX1276LoRaSetRFPower(PowerValue); /* 功率设置 */
SX1276LoRaSetSpreadingFactor(SpreadingFactor); /* 扩频因子设置 */
SX1276LoRaSetErrorCoding(CodingRate); /* 纠错编码设置 */
SX1276LoRaSetPacketCrcOn(True); /* 打开 CRC校验 */
SX1276LoRaSetSignalBandwidth( Bw_Frequency ); /* 设置扩频带宽 , 125khz */
SX1276LoRaSetImplicitHeaderOn(False); /* 同步头是显性模式 */
SX1276LoRaSetPayloadLength( 0xff); /* 设置有效负载长度 */
SX1276LoRaSetSymbTimeout( 0x3FF ); /* 设置超时时间 */
SX1276LoRaSetMobileNode(True); /*低数据率hua*/
// RF_CAD_RECEIVE();
RF_ContinuousReceive(); /*设置为连续接收模式 */
}
如上图代码所示,可以将设置函数分别封装成函数进行调用,函数的代码也十分简单,就是参照数据手册规定对sx1278中的寄存器进行设置,这里不再赘述。
4.发送与接收数据包的操作代码:
发送处理在上面已有介绍,接下来介绍下单一与连续接收处理如图:
简单以初学者的角度介绍下连续接收流程:首先设置为待机模式(手册中规定在进行接收初始化时必须为待机模式),接收初始化,然后初始化完成后模式设置为连续接收模式,接下来就判断RegIrqFlags(0x12)状态寄存器中的状态位第六位RxDone是否置为1和第七位的超时中断RxTimeout置为1,如果接收状态的RxDone为1,则接下来判断状态寄存器也是**RegIrqFlags(0x12)**中的第五位的负载crc效验的标志位,如果没有出错最后就是读取接收到的数据了。由于设置为连续接收模式,则接收完成后继续去等待判断状态寄存器的的相关位,
这里注意了,是不是大致看了这里的介绍对源码的理解上了一个层次,一定注意参照数据手册看源码,并注意寄存器的位的功能,以及读/写。这里只是宏观的介绍了下,有帮与读者理解以及入门,具体细节还望在实践操作中学习。