|
一、引言
本文档介绍 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
|