查看: 409|回复: 0

[应用笔记] SX1208系列模组异常问题排查应用指导

[复制链接]

67

主题

100

帖子

570

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
570
发表于 2023-12-6 13:44:37 | 显示全部楼层 |阅读模式
  一、引言

  本文档介绍 SX1208 系列模组的应用中经常会遇到的初始化异常、状态切换异常、通信异常等问题的排查思路、方法和技巧,旨在帮助用户在出现相关问题时尽快独立完成相应的定位与解决。

  二、程序移植

  SX1208 系类模组分为小功率(13dBm) 和大功率(20dBm) 两类。大功率模组有LSD4RF-2X717N10 和LSD4RF-2X817N10。
图 2.1 大功率模组对比示意图

  LSD4RF-2X717N10 和LSD4RF-2X817N10 封装相同,硬件替换时只需更换天线,并在软件上更改频点即可。

  小功率模组有LSD4RF-2S313N10、LSD4RF-2S313N20 和LSD4RF-2S813N10。
图 2.2 小功率模组对比示意图

  其中 LSD4RF-2S313N10 和 LSD4RF-2S313N20 可以直接替换,软件和天线无需任何改动。

  LSD4RF-2S313N10(LSD4RF-2S313N20)和 LSD4RF-2S813N10 封装相同,硬件替换时只需更换天线,并在软件上更改频点即可。

  备注:SX1208 系类5 款模组的RST、NSS、MOSI、MISO、SCK 和DIO0 为必须使用的引脚,如果应用中需实现大数据包发射或 WOR 低功耗模式,需要使用的对应的 I/O,其他 DIO 引脚不用可悬空。

  2.1 IO检查

  产品硬件设计时需要仔细核对 MCU 的 IO 口和模组的 IO 口是否连接正常,并且原理图和PCB 的IO 口是否一一对应。

  以LSD4RF-2S313N20 为例:
图2.3 LSD4RF-2S313N20示意图

  使用万用表或者示波器测试 MCU 的输出 IO 口(RST、SCK、MOSI、NSS)是否能输出高低电平,并测试MCU 的输入IO 口(DIO0、MISO)是否能识别高低电平。

  万用表或者示波器表笔连接到模组的焊盘上,以确认原理图和PCB 的接线是否真实一一对应。

  2.2 软件移植

  2.2.1 通信协议选择

  由于硬件 SPI 配置时参数较多,所以程序移植时建议优先使用软件 SPI,待模组收发调通成功后再切换为硬件 SPI。SX1208 的软件 SPI 时序示意代码,以及详细移植过程请参考如下连接:https://lierda.feishu.cn/wiki/PDtTwOhuVi1ovbkNnqbcpB4vnxf

  2.2.2 模组选择

  SPI 读写调试完成后,在LSD_RFregsetting.h 文件中选则模组版本。
  #define LSD4RF_2X717N10  1
  #define LSD4RF_2S313N10  2
  #define VERSION  LSD4RF_2S313N10
  小功率模组(13dBm):选择VERSION值为LSD4RF_2S313N10。
  大功率模组(20dBm):选择VERSION值为LSD4RF_2X717N10。
  频点配置:确定版本值后,在 static const unsigned char Freq_Cal_Tab[]数组中配置适配各款模组的频点。

  2.2.3 SPI 验证

  软件移植时先检查SPI 读写是否正常,检查方法参考如下流程:
  uint8_t test = 0;
  SX1208_InitIo();  // IO 口初始化
  SX1208_Reset();  //复位
  SX1208_SPI_Init();  //SPI 初始化
  //模组刚刚复位在standby 中,这时读取SYNCVALUE8 应为0x01
  SX1208_Read(REG_SYNCVALUE8, &test);
  //然后对SYNCVALUE8 写不同值,读取值和写入值相同则SPI 读写正常
  SX1208_Write(REG_SYNCVALUE8, 0x00);
  SX1208_Read(REG_SYNCVALUE8, &test);
  SX1208_Write(REG_SYNCVALUE8, 0xFF);
  SX1208_Read(REG_SYNCVALUE8, &test);
  SX1208_Write(REG_SYNCVALUE8, 0xAA);
  SX1208_Read(REG_SYNCVALUE8, &test);
  SX1208_Write(REG_SYNCVALUE8, 0x55);
  SX1208_Read(REG_SYNCVALUE8, &test);
  此时如果SPI 读写异常,需要检查SPI 时序,待读写调试正常后再进行其他调试。

  2.2.4 RF 初始化

  SPI 通信正常后,调用如下函数对于模组进行初始化。
  if(SX1208_Fsk_init() != NORMAL)
  {
   while(1){ __NOP(); }
  }

  2.2.5 接收调试

  调试接收时建议先不要打开MCU 和SX1208 模组连接的 DIO0 中断(并关闭所有模组的其他DIO 的中断),把MCU 连接模组的DIO 都定义为输入状态。

  在完成初始化后,调用 LSD_RF_RXmode_FSK();让模组进入接收状态。并在 while(1)中不停地扫描DIO0 引脚,并使用如下代码调试接收功能。
  while (1)
  {
   while (1)
   {
    if(DIO0_GetState() == GPIO_PIN_SET)
    {
     uint8_t flag;
     SX1208_Read(REG_IRQFLAGS2, &flag);
     if(flag & 0x04) //communication_states = RX_DONE;
     {
      LSD_RF_RxPacket_FSK(data_buffer, &data_len);
      __NOP();
      LSD_RF_RXmode_FSK();
     }
     else
     {
      __NOP();
      LSD_RF_RXmode_FSK();
     }
    }
   }
  }

  备注
  ●如果收到数据则代码一定会进入if(flag & 0x04)中。
  ●如果持续接收不到数据则建议测试模组电流是否为16mA 左右。

  2.2.6 调试发送函数

  将2.2.5 中的接收调试函数修改如下:
  while (1)
  {
   LSD_RF_SendPacket_FSK(data_buffer,data_len);
   while (1)
   {
    if(DIO0_GetState() == GPIO_PIN_SET)
    {
     uint8_t flag;
     SX1208_Read(REG_IRQFLAGS2, &flag);
     if(flag & 0x08) //communication_states = TX_DONE;
     {
      __NOP();
      break;
     }
     else
     {
      __NOP();
     }
    }
   }
   delayms(4000);
  }

  备注:如果正常发送完毕则代码一定会进入到if(flag & 0x08)中。

  三、软件问题故障分析

  3.1 初始化异常

  初始化异常时需要先检查寄存器读写,再检查能否进入STANDBY 模式。

  3.1.1 寄存器读写检查


  初始化失败时大部分体现在读写寄存器异常,即读取值和写入值不同,排查顺序如下:
  1.检查模组VCC 电压是否正常。
  2.检查RST 电平是否正常。
  3.使用软件SPI 读写寄存器。
  4.检查SPI 时序是否正确。
  5.检查片选等输出IO 的电平输出是否正常。
  6.检查MISO 和DIO 等输入IO 是否能正确读取到高低电平。
  7.检查原理图和PCB 是否真实对应。
  8.检查SPI 的PCB 走线是否因为速率过高产生了相互干扰。可将SPI 速率降低到1Mhz以下做对比验证。
  9. 检查NSS 引脚时序是否与图3.1 对应。
图3.1 SPI时序图

  上图对应的软件SPI 代码参考如下连接:https://lierda.feishu.cn/wiki/PDtTwOhuVi1ovbkNnqbcpB4vnxf

  3.1.2 STANDBY 模式检查

  初始化失败时,要注意检查模组能否正常进入STANDBY。检查方法为调用进入STANDY模式函数后,读取模组状态寄存器,确认模组是否在STANDBY 状态中,并测试模组的电流是否为几百uA。

  3.2 无法进入发送或者接收状态

  模组无法进入发送或者接收状态的主要原因有如下几种:
  ●复位异常
  ●软件问题
  ●硬件问题

  3.2.1 复位异常

  SX1208 复位方式有上电 POR 复位和 RST 引脚手动复位两种,复位异常时会导致模组无法进入发送和接收状态。

  RST 引脚手动复位异常时,读取SYNCVALUE8 寄存器值不等于0x01。

  检查模组上电POR 复位

  模组上电POR 复位的时序如下:
图3.2 上电POR复位时序图

  验证上电POR 复位是否正常需要关注3 个方面:
  1.分别是电源上电后供电能力和纹波
  2.RST 引脚是否真的拉低了
  3.是否RST 引脚拉低后10ms 后再开始操作模组的

  根据如上情况可以生成如下检测模组上电POR 复位是否正常的软件程序。

  unsigned char SX1208_Fsk_init(void)
  {
   uint8_t test = 0;
   SX1208_InitIo();  // 所有IO 都做好初始化口初始化使用软件SPI
   MCU 拉低模组的RST 引脚;
   延时10ms;
   while(1)
   {
    LSD_RF_RXmode_FSK();
    while(1);
    //测试接收电流是否为16mA
   }
  }

  POR 上电测试时,需要反复进行断电-上电操作,所以不能连接仿真器,并测量模组的电流是否为16mA。

  模组上电POR复位异常时需检查:
  ●模组上电后RST 引脚的电平是否拉低
  ●检查RST拉低延时是否≥10ms 再操作模组
  ●检查VCC纹波是否≤±100mV
  ●更换模组确认模组是否已经损坏

  检查手动RST 复位

  确定模组上电POR 复位正常后,如果依然无法进入接收模式,需检查模组RST 引脚手动复位是否正常。

  模组RST 引脚手动复位时序图如下:
图3.3 手动RST复位时序图

  RST 手动复位需要一个大于100us 的正脉冲,并在RST 引脚产生正脉冲后延时5ms再操作模组。可使用如下代码验证RST 手动复位是否正常。

  unsigned char SX1208_Fsk_init(void)
  {
   uint8_t test = 0;
   SX1208_InitIo();  // 初始化所有IO
   MCU 拉低RST 引脚;
   while(1)
   {
    延时10ms;
    SX1208_Reset();  // 手动RST 复位
    LSD_RF_RXmode_FSK();
    延时30 秒;  // 该30 秒时间用来测量电流
   }
  }

  如果测量电流不是16mA 则RST 引脚手动复位异常,此时需要检查:
  ●RST引脚是否产生正脉冲
  ●正脉冲保持时间是否≥100us
  ●正脉冲后是否≥5ms 操作模组
  ●更换模组确认模组是否损坏

  备注:模组上电POR 复位时间为11ms,手动RST 复位时间为6ms。

  3.2.2 软件检查

  模组无法进入收发状态时,若复位正常,则需检查软件:
  ●使用模拟SPI 对比验证
  ●检查SPI 时序
  ●检查能否读取DIO 电平
  ●检查片选信号时序
  详细检查过程参考“3.1.1 寄存器读写检查”中的软件SPI 检查方法。

  备注:要保证软件库移植时,不要改动或者删减我司已经封装好的函数逻辑

  3.2.3 硬件检查

  如果复位正常,软件正常,则需要再检查硬件。
  检查晶振是否起振:吹掉模组屏蔽罩,给模组上电,测试晶振频率是否为32Mhz。
  出现以下几种情况说明模组可能损坏,可更换模组做对比测试:
  ●晶振不起振
  ●复位后电流不是几百uA
  ●接收电流与规格书不符

  3.3 无法发送数据

  调试发送和接收时要把天线接到模组上。

  3.3.1 TXDONE 标志检查

  当模组发送数据失败时,先关闭MCU 的总中断,并将DIO0 对应的IO 改为普通输入模式,将示波器接到DIO0 上,确保DIO0 对应的IO 能读取到高低电平变化,然后在主循环内做如下代码检测TXDONE 标志:
  while (1)
  {
   LSD_RF_SendPacket_FSK(data_buffer,data_len);
   while (1)
   {
    if(DIO0_GetState() == GPIO_PIN_SET)
    {
     uint8_t flag;
     X1208_Read(REG_IRQFLAGS2, &flag);
     if(flag & 0x08)//communication_states = TX_DONE;;
     {
      __NOP();
      break;
     }
     else
     {
      __NOP();
     }
    }
   }
   delayms(4000);
  }

  如上代码可以排除发送过程被打断的情况,如果发送成功则代码一定会运行到 if(flag & 0x08)中。调试过程中注意是否出现示波器上能看到 DIO0 出现高电平但是软件却不进入if(DIO0_GetState()==GPIO_PIN_SET)的情况,如果有这种情况则排查MCU 自身原因。

  如果发送板模组有TXDONE 产生,但是接收板的模组收不到数据,可使用我司的EVK接收板做交叉对比测试。

  3.3.2 发送电流测试

  测试发送电流可以辅助判断模组是否启动发送模式。
  测试发送电流常用的方法有:
  (1)把模组VCC 割断接入功率测试仪器直接测试电流;
  (2)把模组VCC 割断串入检流电阻,利用示波器间接测试电流。

  小功率模组频谱仪传导测试(13dBm)发射电流 35mA 左右,大功率模组频谱仪传导测试(20dBm)发射电流135mA 左右。因为模组接50R 负载、接天线、不接负载,电流会有差异,一般测试到发送时有较大电流产生就代表进了发射模式了。

  3.4 无法接收数据

  3.4.1 RXDONE 标志检查

  当模组就收不到数时,先关闭MCU 的总中断,并将DIO0 对应的IO 改为普通输入模式,将示波器接到DIO0 上,确保DIO0 对应的IO 能读取到高低电平变化,然后在主循环内做如下代码检测RXDONE 标志:
  while (1)
  {
   while (1)
   {
    if(DIO0_GetState() == GPIO_PIN_SET)
    {
     uint8_t flag;
     SX1208_Read(REG_IRQFLAGS2, &flag);
     if(flag & 0x04) //communication_states = RX_DONE;
     {
      LSD_RF_RxPacket_FSK(data_buffer, &data_len);
      __NOP();
      LSD_RF_RXmode_FSK();
     }
     else
     {
      __NOP();
      LSD_RF_RXmode_FSK();
     }
    }
   }
  }

  如上代码可以排除接收过程被打断的情况,如果接收成功则代码一定会运行到 if(flag & 0x04)中。调试过程中注意是否出现示波器上能看到 DIO0 出现高电平但是软件却不进入if(DIO0_GetState() == GPIO_PIN_SET)的情况,如果有这种情况则排查MCU 自身原因。

  如果接收板模组有无RXDONE 产生,可使用我司的EVK 发送板做交叉对比测试。

  3.4.2 接收电流测试

  测试接收电流可以辅助判断模组是否进入接收模式。
  测试接收电流常用的方法有:
  (1) 把模组VCC 割断接入功率测试仪器直接测试电流;
  (2) 把模组VCC 割断串入电流表测试电流。
  小功率模组(13dBm)和大功率模组(20dBm)接收电流都为15mA 左右。

  3.5 通信距离近

  通信距离近时需要检查如下五点:
  ●检查收发两端射频参数配置是否一致
  ●将发送端和接收端天线紧紧靠近观察RSSI 是否大于0
  ●(频谱仪)检查传导发射功率
  ●(网络分析仪)检查天线适配性是否良好
  ●(频谱仪+探头)检查是否底板上有干扰

  3.6 SLEEP 异常

  当模组SLEEP 状态电流>2uA 时可认定为SLEEP 异常,此时可通过电流值排查。

  电流为十几或者几十uA:用万用表检查实际IO 与配置是否一致、连接是否正确。检查MCU 的IO 口是否有漏电流。将已经连接到MCU 上但是不使用的DIO 的管脚配置为模拟输入或者高阻态对比测试。

  电流为几百 uA:检查模组是否处于 STANDBY 状态。可以在模组进入 SLEEP 前关闭MCU 总中断做对比测试。

  该问题常常是 MCU 配置模组进入 SLEEP 后,又有其他状态转换的命令操作(如定时器中)将模组重新设置为STANDBY 状态。

  电流为十几mA:检查模组是否处于RX 状态。可以在模组进入RX 前关闭MCU 总中断做对比测试。

  该问题常常是 MCU 配置模组进入 SLEEP 后,又有其他状态转换的命令操作(如定时器中)将模组重新设置为RX 状态。

  四、硬件造成的异常及排查

  SX1208 遇到的硬件异常相对较少,主要有如下几种情况:
  1.供电不足:将SX1208 的VDD 隔断,使用数字电源或者功率测试仪对比验证
  2.原理图和PCB 没有真实对应
  3.未接天线
  4.电磁干扰:板子上只保留MCU 和模组来验证是否有电磁干扰。模组应尽量远离线圈、蜂鸣器、磁铁、大面积金属、大体积电容电感和液晶的 IO。具体测试方法为:将模组飞线到离底板较远的位置做交叉验证。使用排线飞线时,必须将排线撕开,防止SPI 线串扰导致读写异常。
  5. 通信距离异常:使用频谱仪测试传导功率是否正常,使用网络分析仪排查天线是否匹配。

  五、常见排查流程

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表