SX1276调试总结

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状态,完成收发实验。

四、代码仓库
  •     代码仓库地址(hg)
    说明:目前代码仓库使用的是FSK模式,需要Lora模式可以克隆后自 行修改,仅供参考。

你可能感兴趣的:(嵌入式)