SX1276调试总结
前言:
sx1276为Semtech公司推出的具有新型LoRa扩频技术的RF芯片,具有功耗低、容量大、传输距离远、抗干扰能力强的优点,下面对SX1276的使用进行总结,主要是驱动层面上的整理和总结。
这篇博文主要是在调研时进行简单试用后的总结,简单测量Lora模式和FSK模式下的一些调试参数,没有进行深入研究,代码仓库中的代码可以实现收发操作,仅供参考,有问题还请及时指出,也欢迎大家一起讨论。希望调试SX1276的朋友们可以多多总结出更好的博文分享给大家!—— 2016.1.19更新
平台介绍
- 编译环境:IAR7.10
- 硬件平台:STM32F103+LoRa模块
一、阅读datasheet
1.1 基本工作参数
移植之前,我们需要对芯片有一个整体的概念,对参数和工作模式要有一定的解,下面的表格为几款不同的RF模块的基本参数的比较。
|
SI4432 |
SI4463 |
SX1276 |
输出功率 |
<= +20dbm(100mw) |
<= +20dbm(100mw) |
<= +20dbm(100mw) |
波特率 |
<= 256Kbps |
<= 1Mbps |
<= 300Kbps |
接收灵敏度 |
<= -121dbm |
<= -129dbm |
<= -148dbm(LoRa) |
调制方式 |
(G)FSK/OOK |
(G)FSK/(G)MSK/OOK |
(G)FSK/(G)MSK/OOK/LoRa |
频率范围 |
240-930(MHz) |
142-1050(MHz) |
137-1020(MHz) |
FIFO |
64Byte |
64Byte |
256Byte(LoRa) |
中断引脚 |
nirq |
nirq |
Diox |
寄存器 |
128 |
298 |
113 |
SPI操作 |
1位读/写命令+ 7位地址+ 8位数据 |
先发送8位读写指令 等待SDO输出CTS信号为0XFF 读取/写入数据 |
1位读/写命令+ 7位地址+ 8位数据 |
工作状态 |
关闭/挂起/TX/RX |
关闭/挂起/TX/RX |
关闭/挂起/TX/RX/CAD |
附加功能
|
ADC(8位)/温度传感器/ 欠压检测/空中唤醒 |
温度传感器/欠压检测/ 空中唤醒 |
温度传感器/欠压检测/ 空中唤醒 |
1.2 工作模式
SX1276大体分为关闭/挂起/TX/RX/CAD状态,FSK/OOK与LoRa模式之间切换时必须处于SLEEP状态才可以完成,我们调试时暂时完成收发工作即可。
1.3 寄存器操作
Sx1276有0x00-0x70 共113个寄存器,通过SPI接口进行操作,SPI数据格式为1bit的读写指令+7bit地址+8bit数据,当需要连续对多个寄存器进行读写操作时,只需要保证时钟输出,寄存器地址会自动加1来完成读写操作,需要注意在FSK和LoRa模式下寄存器的用法有些不同。
1.4 其他
由于初次接触RF芯片,阅读的手册也没有中文版本,对一些名词不是很清楚,读起来真的有些吃力,整理了一些RF相关的知识,仅供参考,请点击 这里。
二、 准备工作
2.1 下载源码
从Semtech官网下载最新固件(
Firmware Drivers V2.1.0),解压到工作目录。
2.2 准备文件
SX12xxDrivers-V2.1.0文件夹下只有src为我们需要使用的文件夹,将其拷贝至工作目录并打开,子文件夹为platform/radio,打开platform文件夹,里面包含不同的硬件平台,我们只保留sx12xxEiger文件夹和platform.h头文件。
2.3 修改BSP代码
为了适应不同的硬件平台,代码中有大量的选择编译语句,根据自己实际使用的硬件平台进行修改,主要包括SPI的初始化,片选/中断/复位/中断等引脚的初始化。其中复位引脚低电平有效,工作时悬空或拉高。
2.4 建立工程并添加源文件
建立IAR工程,将修改好的源文件添加至工程,编译并修改相关错误。官方提供的代码总体还是比较容易修改并运行的,保持耐心。
2.5 硬件连接
LoRa模块有八个引脚,分别为VCC/GND/MISO/MOSI/SCK/NSS/RES/DIO,连接时VCC/GND连接3.3V电源,MOSI/MOSI/SCK/NSS连接STM32的SPI端口,RES/DIO连接单片机的普通IO口,其中RES为复位引脚,DIO为中断输入引脚。
三、分析源码
3.1 寄存器配置
主要配置参数在sx1276-LoRa.c文件中:
// Default settings
tLoRaSettings LoRaSettings =
{
434000000, // RFFrequency
20, // Power
7, // SignalBw [0: 7.8kHz, 1: 10.4 kHz, 2: 15.6 kHz, 3: 20.8 kHz, 4: 31.2 kHz,
// 5: 41.6 kHz, 6: 62.5 kHz, 7: 125 kHz, 8: 250 kHz, 9: 500 kHz, other: Reserved]
11, // SpreadingFactor [6: 64, 7: 128, 8: 256, 9: 512, 10: 1024, 11: 2048, 12: 4096 chips]
1, // ErrorCoding [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
true, // CrcOn [0: OFF, 1: ON]
false, // ImplicitHeaderOn [0: OFF, 1: ON]
1, // RxSingleOn [0: Continuous, 1 Single]
0, // FreqHopOn [0: OFF, 1: ON]
4, // HopPeriod Hops every frequency hopping period symbols
100, // TxPacketTimeout
100, // RxPacketTimeout
21, // PayloadLength (used for implicit header mode)
};
其中SpreadingFactor为扩频因子,表示码片速率(扩频后的速率)与进入扩频调制之前的信号的比值,扩频倍数越大,信噪比则越高。ErrorCoding为循环纠错的一种机制。
3.2 流程分析
- 硬件和模块初始化
- 进入Sleep模式
- 进入LoRa模式
- 配置寄存器
- 准备发送数据(设置发送功率,中断等操作)
- 发送数据
- 等待发送完成。
初始化过程先对硬件进行初始化,然后执行Radio = RadioDriverInit( );将函数入口地址赋值给tRadioDriver结构体中的函数指针。通过Radio->Init( );调用初始化函数。初始化结束后进行发送和接收的相关任务,具体查看驱动代码。
3.3 测试
可以先在SPI初始化后,读取寄存器操作来查看SPI及相关控制引脚/复位引脚连接是否正确,也可以用来查询寄存器配置是否正确。
SX1276Read(0x42,test);//返回0x12
SX1276Read(0x44,test);//返回0x2D
读取正确后可以在发送完成处加入断点,查看是否会进入发送完成中断,如果进入不了中断很有可能是RF频率配置不正确导致,代码中默认晶振频率为32MHz,所以当我们想要使用434M作为RF频率时,根据公式(
P81)向寄存器写入的值为0x6c8000,如果晶振频率为30M则应向寄存器写入0x73BBBB,所以要明确所用模块的外部晶振频率。
3.4 收发
启动定时器,每隔一秒发送一帧数据,发送完成后翻转LED状态,接收侧收到数据后翻转LED状态,完成收发实验。
四、代码仓库
说明:目前代码仓库使用的是FSK模式,需要Lora模式可以克隆后自
行修改,仅供参考。