安信可Ra-01S切换到 Ra-01SC 软件教程,SX1278转到LLCC68和SX1268/SX1262的软件细节教

[复制链接]
查看1068 | 回复2 | 2024-3-7 14:25:35 | 显示全部楼层 |阅读模式
前言
本篇主要介绍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代码来介绍整个代码的流程框架
1.png
发射机的配置参数说明(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:超时时间。
2.png
这部分是发射机的参数配置,源码.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:是否持续接收。
3.png
LoRa初始化配置(SX127X)
LoRa的初始化配置也是是重要的的一部分
4.png
SPI初始化配置(SX127X)
LoRa是SPI驱动的,所以在我们代码移植配置时一定要确保SPI的配置正常,时序和访问正常才能能正常使用,代码中用的是STM32的spi1
5.png
LoRa参数配置(SX127X)
这里的参数配置对应”接收机“和”发射机“的参数,他们是共用一个参数,这样才能够互相通信
  1. #define USE_BAND_433        //选择一个频率
  2. #define USE_MODEM_LORA        //选择lora模式
  3. //#define USE_MODEM_FSK        //选择FSK模式

  4. #define FSK_SINGLE_CARRIER        0        //单载波射频测试,注意:单载波模式必须在FSK模式下
  5. #define LORA_CONTINUE        0        //lora连续发射模式

  6. #if defined( USE_BAND_433 )

  7. #define RF_FREQUENCY                                434000000 // Hz

  8. #elif defined( USE_BAND_780 )

  9. #define RF_FREQUENCY                                780000000 // Hz

  10. #elif defined( USE_BAND_868 )

  11. #define RF_FREQUENCY                                868000000 // Hz

  12. #elif defined( USE_BAND_915 )

  13. #define RF_FREQUENCY                                915000000 // Hz

  14. #else
  15.     #error "请在编译器选项中选择一个频段。"
  16. #endif

  17. #define TX_OUTPUT_POWER                             20        // dBm(发射功率,1278芯片最大设置20dBm)

  18. #if defined( USE_MODEM_LORA )

  19. #define LORA_BANDWIDTH                              0         // [0: 125 kHz,(带宽,带宽设置越宽,传输速率越快,但是传输距离越近)
  20.                                                               //  1: 250 kHz,
  21.                                                               //  2: 500 kHz,
  22.                                                               //  3: Reserved]
  23. #define LORA_SPREADING_FACTOR                       7         // [SF7..SF12] (扩频因子,扩频因子设置越大,传输距离越远,但是传输速率越慢)
  24. #define LORA_CODINGRATE                             1         // [1: 4/5,    (编码率,编码率用于检验传输有无出错,默认使用4/5)
  25.                                                               //  2: 4/6,
  26.                                                               //  3: 4/7,
  27.                                                               //  4: 4/8]
  28. #define LORA_PREAMBLE_LENGTH                        8         // 前导码长度,最常用的有8bit和16bit,这里使用8bit
  29. #define LORA_SYMBOL_TIMEOUT                         5         // 帧超时,帧数为5
  30. #define LORA_FIX_LENGTH_PAYLOAD_ON                  false     // 数据负载混合长度,默认不开启
  31. #define LORA_IQ_INVERSION_ON                        false     // 默认不开启

  32. #elif defined( USE_MODEM_FSK )

  33. #define FSK_FDEV                                    25e3      // Hz
  34. #define FSK_DATARATE                                50e3      // bps
  35. #define FSK_BANDWIDTH                               50e3      // Hz
  36. #define FSK_AFC_BANDWIDTH                           83.333e3  // Hz
  37. #define FSK_PREAMBLE_LENGTH                         5         // Same for Tx and Rx
  38. #define FSK_FIX_LENGTH_PAYLOAD_ON                   false

  39. #else
  40.     #error "请在编译器选项中选择一个频段。"
复制代码
SX126X和LLCC68驱动详解
下面是我们126x系列的代码驱动包,他的驱动代码和LLCC68系列是通用的
6.png
发射机配置参数说明(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:超时时间。
7.png
接收机配置参数说明(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:是否持续接收。
8.png
LoRa初始化配置(SX126x&LLCC68)
SX126X的代码,我们分开了,分为了两个配置文件,接收配置文件:sx126x_example_recive.c,发送配置文件:sx126x_example_recive.h
9.png
LoRa参数配置(SX126x&LLCC68)
参数配置区域我们配置接收和发送的频率,带宽功率等,还配置了SPI的引脚定义,另外此区域也是配置发送和接收。
  1. #ifndef __PROJECT_CONFIG_H__
  2. #define __PROJECT_CONFIG_H__

  3. //基于semtech官网驱动移植
  4. //官网驱动网址 https://github.com/Lora-net/LoRaMac-node/tree/master/src/radio  下载日期 2021/2/3
  5. #define SOFT_VERSION        "sx126x driver for stm32f103 V0.0.0"

  6. //--------------------------------------------- 测试默认配置 ---------------------------------------------
  7. #define LORA_FRE                                                                        470000000        // 收发频率
  8. #define LORA_TX_OUTPUT_POWER                        20          // 测试默认使用的发射功率,126x发射功率0~22dbm,127x发射功率2~20dbm
  9. #define LORA_BANDWIDTH                              1           // [0: 125 kHz,        测试默认使用的带宽,sx126x:[0: 125 kHz,1: 250 kHz,2: 500 kHz,3: Reserved]
  10. #define LORA_SPREADING_FACTOR                       9           // 测试默认使用的扩频因子范围7~12
  11. #define LORA_CODINGRATE                             1           // 测试默认使用的纠错编码率[1: 4/5,2: 4/6,3: 4/7,4: 4/8]
  12. #define LORA_PREAMBLE_LENGTH                        8           // 前导码长度
  13. #define LORA_SX126X_SYMBOL_TIMEOUT                  0           // Symbols(sx126x用到的是0,127x用到的是5)
  14. #define LORA_FIX_LENGTH_PAYLOAD_ON                  false            // 是否为固定长度包(暂时只是sx126x用到了)
  15. #define LORA_IQ_INVERSION_ON                        false                // 这个应该是设置是否翻转中断电平的(暂时只是sx126x用到了)
  16. #define LORA_RX_TIMEOUT_VALUE                       5000        // 接收超时时间
  17. #define LORA_DATA_SEND_AND_RECEIV_MODE              1                 // 数据收发模式,1为发送模式,0为接收模式

  18. //--------------------------------------------- 发送配置 ---------------------------------------------
  19. #define BUFFER_SIZE                                 64 // 有效载荷大小

  20. /*!
  21. * Board MCU pins definitions
  22. */
  23. //SPI
  24. #define RADIO_NSS_PIN       GPIO_Pin_4
  25. #define RADIO_NSS_PORT      GPIOA
  26. #define RADIO_MOSI_PIN      GPIO_Pin_7
  27. #define RADIO_MOSI_PORT     GPIOA
  28. #define RADIO_MISO_PIN      GPIO_Pin_6
  29. #define RADIO_MISO_PORT     GPIOA
  30. #define RADIO_SCK_PIN       GPIO_Pin_5
  31. #define RADIO_SCK_PORT      GPIOA
  32. //RST复位脚
  33. #define RADIO_nRESET_PIN    GPIO_Pin_1
  34. #define RADIO_nRESET_PORT   GPIOB
  35. //DIO1 引脚
  36. #define RADIO_DIO1_PIN      GPIO_Pin_11
  37. #define RADIO_DIO1_PORT     GPIOB
  38. //BUSY 引脚
  39. #define RADIO_DIO4_BUSY_PIN      GPIO_Pin_0
  40. #define RADIO_DIO4_BUSY_PORT     GPIOA


  41. //下面这几个引脚没用用到,设置为浮空输入模式
  42. //TXEN
  43. #define RADIO_DIO0_TXEN_PIN      GPIO_Pin_10
  44. #define RADIO_DIO0_TXEN_PORT     GPIOB
  45. //DIO2
  46. #define RADIO_DIO2_PIN      GPIO_Pin_8
  47. #define RADIO_DIO2_PORT     GPIOB
  48. //DIO3
  49. #define RADIO_DIO3_PIN      GPIO_Pin_9
  50. #define RADIO_DIO3_PORT     GPIOB
  51. //RXEN
  52. #define RADIO_DIO5_RXEN_PIN      GPIO_Pin_1
  53. #define RADIO_DIO5_RXEN_PORT     GPIOA

  54. #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. 1. 定义SX1278的寄存器地址和操作:

  2. ```c
  3. #define RegFifo_ADDRESS 0x00 // 寄存器地址(例如:SX1278的RegFifo寄存器)
  4. #define WRITE_VALUE 0x1234 // 要写入的值
复制代码

读写SX1278寄存器:
  1. void ReadWriteSX1278Register(void)
  2. {
  3.     uint8_t cmd = 0x30; // 读写命令(0x30:读取,0x20:写入)
  4.     uint8_t data[2] = {cmd, WRITE_VALUE};

  5.     SpiBegin(SPI1);
  6.     SpiTransmit(SPI1, &cmd, 1); // 发送读写命令
  7.     SpiTransmit(SPI1, data, 2); // 发送寄存器地址和值
  8.     SpiEnd(SPI1);

  9.     uint8_t read_data[2];
  10.     SpiBegin(SPI1);
  11.     SpiTransmit(SPI1, &cmd, 1); // 发送读取命令
  12.     SpiReceive(SPI1, read_data, 2); // 接收寄存器的值
  13.     SpiEnd(SPI1);

  14.     // 处理读取到的数据
  15.     uint16_t reg_value = (read_data[0] << 8) | read_data[1];
  16.     printf("Reg value: 0x%04X\n", reg_value);
  17. }
复制代码

在主函数中调用ReadWriteSX1278Register()函数:
  1. int main(void)
  2. {
  3.     SPI1_Init();
  4.     ReadWriteSX1278Register();
  5.     while (1)
  6.     {
  7.     }
  8. }
复制代码
结束
本篇文章已经结束,以上就是关于SX1278转到LLCC68和SX1268/SX1262的软件细节教程,主要使用demo进行分解测试,demo代码中含有大量注释,并且使用的是STM32F103系列单片机,便于上手操作,有兴趣的朋友可以用于参考,有任何疑问欢迎在文章下方留言。
用心做好保姆工作
回复

使用道具 举报

1084504793 | 2024-3-7 14:59:21 | 显示全部楼层
回复

使用道具 举报

hhz | 2024-4-29 11:23:38 来自手机 | 显示全部楼层
llcc68可以获取到信道是否拥堵吗
类似12768的0×32寄存器的功能
回复 支持 反对

使用道具 举报

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

本版积分规则