前言
本篇主要介绍SX1278转到LLCC68和SX1268/SX1262的软件细节教程,首先和大家介绍一下这几款芯片的区别特点,我们先做一些归类。
SX127X类,包含我司的Ra-01,Ra-01H,Ra-02,为一个类别,分别对应两个版本芯片SX1278和SX1276,他们代码驱动通用,只是频率参数有区别;
SX126X和LLCC68,包含我司Ra-01S,Ra-01sc,Ra-01SCH,作为一个类别,分别对应芯片SX1268和LLCC68,他们代码驱动通用,参数值配置有一定区别;
综上所述,我们我们只要准备两份驱动代码就能将上述模组完全驱动起来,我们今天的目的是实现我司的127X和126x之间的通信。其中会涉及一些代码逻辑框架的讲解。
代码资源获取
ra-01驱动代码:链接
ra-0s、ra-01sc:链接
127芯片手册:链接
1268芯片手册:链接
LLCC68芯片手册:链接
SX127x系列驱动详解
我司封装到站点的代码使用的驱动MCU是STM32F103,只要使用同类MCU就可以完成直接驱动,代码中附详细接线文档,下面我们使用127x代码来介绍整个代码的流程框架
发射机的配置参数说明(SX127X)
RadioModems_t modem:无线电模块类型。
int8_t power:发射功率。
uint32_t fdev:频率偏移。
uint32_t bandwidth:带宽。
uint32_t datarate:数据速率。
uint8_t coderate:编码率。
uint16_t preambleLen:前导码长度。
bool fixLen:是否固定长度。
bool crcOn:是否开启CRC校验。
bool FreqHopOn:是否开启频率跳变。
uint8_t HopPeriod:频率跳变周期。
bool iqInverted:是否反转IQ信号。
uint32_t timeout:超时时间。
这部分是发射机的参数配置,源码.h文件内也有详细说明
接收机配置参数说明(SX127X)
RadioModems_t modem:无线电模块类型。
uint32_t bandwidth:接收带宽。
uint32_t datarate:数据速率。
uint8_t coderate:编码率。
uint32_t bandwidthAfc:AFC带宽。
uint16_t preambleLen:前导码长度。
uint16_t symbTimeout:符号超时。
bool fixLen:是否固定长度。
uint8_t payloadLen:有效载荷长度。
bool crcOn:是否启用CRC。
bool FreqHopOn:是否启用频率跳变。
uint8_t HopPeriod:频率跳变周期。
bool iqInverted:是否反转IQ。
bool rxContinuous:是否持续接收。
LoRa初始化配置(SX127X)
LoRa的初始化配置也是是重要的的一部分
SPI初始化配置(SX127X)
LoRa是SPI驱动的,所以在我们代码移植配置时一定要确保SPI的配置正常,时序和访问正常才能能正常使用,代码中用的是STM32的spi1
LoRa参数配置(SX127X)
这里的参数配置对应”接收机“和”发射机“的参数,他们是共用一个参数,这样才能够互相通信
- #define USE_BAND_433 //选择一个频率
- #define USE_MODEM_LORA //选择lora模式
- //#define USE_MODEM_FSK //选择FSK模式
- #define FSK_SINGLE_CARRIER 0 //单载波射频测试,注意:单载波模式必须在FSK模式下
- #define LORA_CONTINUE 0 //lora连续发射模式
- #if defined( USE_BAND_433 )
- #define RF_FREQUENCY 434000000 // Hz
- #elif defined( USE_BAND_780 )
- #define RF_FREQUENCY 780000000 // Hz
- #elif defined( USE_BAND_868 )
- #define RF_FREQUENCY 868000000 // Hz
- #elif defined( USE_BAND_915 )
- #define RF_FREQUENCY 915000000 // Hz
- #else
- #error "请在编译器选项中选择一个频段。"
- #endif
- #define TX_OUTPUT_POWER 20 // dBm(发射功率,1278芯片最大设置20dBm)
- #if defined( USE_MODEM_LORA )
- #define LORA_BANDWIDTH 0 // [0: 125 kHz,(带宽,带宽设置越宽,传输速率越快,但是传输距离越近)
- // 1: 250 kHz,
- // 2: 500 kHz,
- // 3: Reserved]
- #define LORA_SPREADING_FACTOR 7 // [SF7..SF12] (扩频因子,扩频因子设置越大,传输距离越远,但是传输速率越慢)
- #define LORA_CODINGRATE 1 // [1: 4/5, (编码率,编码率用于检验传输有无出错,默认使用4/5)
- // 2: 4/6,
- // 3: 4/7,
- // 4: 4/8]
- #define LORA_PREAMBLE_LENGTH 8 // 前导码长度,最常用的有8bit和16bit,这里使用8bit
- #define LORA_SYMBOL_TIMEOUT 5 // 帧超时,帧数为5
- #define LORA_FIX_LENGTH_PAYLOAD_ON false // 数据负载混合长度,默认不开启
- #define LORA_IQ_INVERSION_ON false // 默认不开启
- #elif defined( USE_MODEM_FSK )
- #define FSK_FDEV 25e3 // Hz
- #define FSK_DATARATE 50e3 // bps
- #define FSK_BANDWIDTH 50e3 // Hz
- #define FSK_AFC_BANDWIDTH 83.333e3 // Hz
- #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
- #define FSK_FIX_LENGTH_PAYLOAD_ON false
- #else
- #error "请在编译器选项中选择一个频段。"
复制代码 SX126X和LLCC68驱动详解
下面是我们126x系列的代码驱动包,他的驱动代码和LLCC68系列是通用的
发射机配置参数说明(SX126x&LLCC68)
RadioModems_t modem:无线电模块类型。
int8_t power:发射功率。
uint32_t fdev:频率偏移。
uint32_t bandwidth:带宽。
uint32_t datarate:数据速率。
uint8_t coderate:编码率。
uint16_t preambleLen:前导码长度。
bool fixLen:是否固定长度。
bool crcOn:是否开启CRC校验。
bool freqHopOn:是否开启Period`:频率跳变周期。
bool iqInverted:是否反转IQ信号。
uint32_t timeout:超时时间。
接收机配置参数说明(SX126x&LLCC68)
RadioModems_t modem:无线电模块类型。
uint32_t bandwidth:接收带宽。
uint32_t datarate:数据速率。
uint8_t coderate:编码率。
uint32_t bandwidthAfc:AFC带宽。
uint16_t preambleLen:前导码长度。
uint16_t symbTimeout:符号超时。
bool fixLen:是否固定长度。
uint8_t payloadLen:有效载荷长度。
bool crcOn:是否开启CRC校验。
bool freqHopOn:是否开启频率跳变。
uint8_t hopPeriod:频率跳变周期。
bool iqInverted:是否反转IQ。
bool rxContinuous:是否持续接收。
LoRa初始化配置(SX126x&LLCC68)
SX126X的代码,我们分开了,分为了两个配置文件,接收配置文件:sx126x_example_recive.c,发送配置文件:sx126x_example_recive.h
LoRa参数配置(SX126x&LLCC68)
参数配置区域我们配置接收和发送的频率,带宽功率等,还配置了SPI的引脚定义,另外此区域也是配置发送和接收。
- #ifndef __PROJECT_CONFIG_H__
- #define __PROJECT_CONFIG_H__
- //基于semtech官网驱动移植
- //官网驱动网址 https://github.com/Lora-net/LoRaMac-node/tree/master/src/radio 下载日期 2021/2/3
- #define SOFT_VERSION "sx126x driver for stm32f103 V0.0.0"
- //--------------------------------------------- 测试默认配置 ---------------------------------------------
- #define LORA_FRE 470000000 // 收发频率
- #define LORA_TX_OUTPUT_POWER 20 // 测试默认使用的发射功率,126x发射功率0~22dbm,127x发射功率2~20dbm
- #define LORA_BANDWIDTH 1 // [0: 125 kHz, 测试默认使用的带宽,sx126x:[0: 125 kHz,1: 250 kHz,2: 500 kHz,3: Reserved]
- #define LORA_SPREADING_FACTOR 9 // 测试默认使用的扩频因子范围7~12
- #define LORA_CODINGRATE 1 // 测试默认使用的纠错编码率[1: 4/5,2: 4/6,3: 4/7,4: 4/8]
- #define LORA_PREAMBLE_LENGTH 8 // 前导码长度
- #define LORA_SX126X_SYMBOL_TIMEOUT 0 // Symbols(sx126x用到的是0,127x用到的是5)
- #define LORA_FIX_LENGTH_PAYLOAD_ON false // 是否为固定长度包(暂时只是sx126x用到了)
- #define LORA_IQ_INVERSION_ON false // 这个应该是设置是否翻转中断电平的(暂时只是sx126x用到了)
- #define LORA_RX_TIMEOUT_VALUE 5000 // 接收超时时间
- #define LORA_DATA_SEND_AND_RECEIV_MODE 1 // 数据收发模式,1为发送模式,0为接收模式
- //--------------------------------------------- 发送配置 ---------------------------------------------
- #define BUFFER_SIZE 64 // 有效载荷大小
- /*!
- * Board MCU pins definitions
- */
- //SPI
- #define RADIO_NSS_PIN GPIO_Pin_4
- #define RADIO_NSS_PORT GPIOA
- #define RADIO_MOSI_PIN GPIO_Pin_7
- #define RADIO_MOSI_PORT GPIOA
- #define RADIO_MISO_PIN GPIO_Pin_6
- #define RADIO_MISO_PORT GPIOA
- #define RADIO_SCK_PIN GPIO_Pin_5
- #define RADIO_SCK_PORT GPIOA
- //RST复位脚
- #define RADIO_nRESET_PIN GPIO_Pin_1
- #define RADIO_nRESET_PORT GPIOB
- //DIO1 引脚
- #define RADIO_DIO1_PIN GPIO_Pin_11
- #define RADIO_DIO1_PORT GPIOB
- //BUSY 引脚
- #define RADIO_DIO4_BUSY_PIN GPIO_Pin_0
- #define RADIO_DIO4_BUSY_PORT GPIOA
- //下面这几个引脚没用用到,设置为浮空输入模式
- //TXEN
- #define RADIO_DIO0_TXEN_PIN GPIO_Pin_10
- #define RADIO_DIO0_TXEN_PORT GPIOB
- //DIO2
- #define RADIO_DIO2_PIN GPIO_Pin_8
- #define RADIO_DIO2_PORT GPIOB
- //DIO3
- #define RADIO_DIO3_PIN GPIO_Pin_9
- #define RADIO_DIO3_PORT GPIOB
- //RXEN
- #define RADIO_DIO5_RXEN_PIN GPIO_Pin_1
- #define RADIO_DIO5_RXEN_PORT GPIOA
- #endif // __PROJECT_CONFIG_H__
复制代码 sx127X切换sx126x或者LLCC68注意事项
对于前期使用SX127x的用户现在换成sx126x或者LLCC68的用户需要注意以下几点:
· 代码驱动,目前两个系列的代码驱动是不一样的,不管是原厂的封装接口或者是寄存器都是不一样的,切换意味着必须换代码驱动。
· 值得注意的是两个驱动代码的驱动逻辑和参数设置流程几乎都是大同小异,特别是接收机发送机和参数区域,只是定义名和寄存器值名称有区别,所以我们阅读代码切和换时就会容易很多。
· 封装脚位,我们知道sx127X系列切换sx126x或者LLCC68系列是从芯片上定义他们,但是我司的驱动是基于模块来开发的,那么两个系列模组的脚位也有一定区别,这个区别并不是不是SPI接口有差异,相反他们用的都是ST的SPI封装库,直接添加调用即可。
· BUSY脚,他们的差异是在于sx126x或者LLCC68系列上有一个BUSY脚位,用于提示主控当前芯片的工作状态,此脚位配合中断进程,可以简化代码编辑的复杂程度,提高运行效率。
spi通信接口测试
下述代码用于测试当前主控STM32与LoRa的SPI通信情况,通过读写某个寄存器的返回值来判断当前SPI驱动是否正常工作,同理SX126X和LL68模组也可以用同样方法测试.
- 1. 定义SX1278的寄存器地址和操作:
- ```c
- #define RegFifo_ADDRESS 0x00 // 寄存器地址(例如:SX1278的RegFifo寄存器)
- #define WRITE_VALUE 0x1234 // 要写入的值
复制代码
读写SX1278寄存器:
- void ReadWriteSX1278Register(void)
- {
- uint8_t cmd = 0x30; // 读写命令(0x30:读取,0x20:写入)
- uint8_t data[2] = {cmd, WRITE_VALUE};
- SpiBegin(SPI1);
- SpiTransmit(SPI1, &cmd, 1); // 发送读写命令
- SpiTransmit(SPI1, data, 2); // 发送寄存器地址和值
- SpiEnd(SPI1);
- uint8_t read_data[2];
- SpiBegin(SPI1);
- SpiTransmit(SPI1, &cmd, 1); // 发送读取命令
- SpiReceive(SPI1, read_data, 2); // 接收寄存器的值
- SpiEnd(SPI1);
- // 处理读取到的数据
- uint16_t reg_value = (read_data[0] << 8) | read_data[1];
- printf("Reg value: 0x%04X\n", reg_value);
- }
复制代码
在主函数中调用ReadWriteSX1278Register()函数:
- int main(void)
- {
- SPI1_Init();
- ReadWriteSX1278Register();
- while (1)
- {
- }
- }
复制代码 结束
本篇文章已经结束,以上就是关于SX1278转到LLCC68和SX1268/SX1262的软件细节教程,主要使用demo进行分解测试,demo代码中含有大量注释,并且使用的是STM32F103系列单片机,便于上手操作,有兴趣的朋友可以用于参考,有任何疑问欢迎在文章下方留言。
|