si446使用记录(四):调试遇到的问题、读取芯片版本、传输速率慢

一、概述

本节记录下调试过程中遇到的问题。

二、异常发热

更换平台,飞线MCU开发板和原平台的si4463部分电路验证。上电后过一会板子明显发热严重,查看电流,从原来平台的20mA直接增加到90mA左右。
拆掉屏蔽壳,确定是PA器件在发热。查看硬件电路,分析是将GPIO0和SDN作为PA的控制管脚。不是由MCU端直接控制PA的开关,而是根据WDS3的配置,GPIO0在发送期间为高(此时PA开启),其他时间为低(PA关闭)。
这样若si4463初始化失败,则GPIO输出电平是不可控的,为高则PA一直开启,功耗陡增。

2.1 初始化失败未正确识别

si446使用记录(一)一文中提到,发送指令后要读取CTS(0xFF)。初始化中以此来判断是否失败:

int8_t siWaitForCTS(void) {
    uint8_t value_t = 0;
    uint16_t cnt = 0;

    while (value_t != 0xFF) {
        clrCSPin();
        siDelayUs(3);
        siSendByte(0x44);               // CMD_READ_CMD_BUFF,Read command buffer; send
                                        // command uint8_t
        value_t = siReadByte();         // Read command buffer; get CTS value
        siDelayUs(3);       
        setCSPin();                     // If CTS is not 0xFF, put NSS high and stay in waiting
                                        // loop
        siDelayUs(1);
        if (cnt++ > MAX_CTS_RETRY) {
            rtt_print_log("si4463 init failed\n");
            return -1;                  // Error handling; if wrong CTS reads exceeds a limit
        }
    }
    return 0;
}

调试过程中发现,初始化执行完了,没有打印si4463 init failed,但实际并没有成功。
也就是说即使si4463没有正常响应,MCU也可能也会读到0xFF。所以并不能作为初始化成功与否的判断。
最终确认,这里初始化失败的原因是,宏定义CS的管脚定义错误,驱动底层没有修改完全。

另一种初始化失败

在网关调试过程中,同样初始化失败。示波器测量波形使用解码功能,可以看到正确发出了初始化指令。MISO始终为高,si4463没有响应。使用开发板飞线验证时正常的,最终确认是硬件上CS预留了了上拉电阻,应该为NC,贴片时给贴了电阻。
示波器抓波形时直接抓了CLK、MOSI、MISO,忽略了CS。。。。。

2.2 增加初始化获取芯片版本

为了明确初始化结果,增加一个读取si4463版本信息的函数,正好也可以作为生产检测环节的一项。
在《AN625_Si446x API Descriptions.pdf》中查找,有3.2.2. PART_INFO、3.2.3. FUNC_INFO指令:
在这里插入图片描述
在这里插入图片描述
对应增加接口:

uint8_t si446x_Get_Part_Info(void)
{
    uint8_t para_info[9];
    
    memset(para_info, 0, sizeof(para_info));
    
    abApi_Write[0] = 0x01;
    siSendData(abApi_Write, 1);
    siWaitForCTS();
    siReadResp(para_info, 9);
    siDelayUs(1);
    
    si4463_debug("si446x_Get_Part_Info:");          // FF  22  44  63  00  86  00  00  06  
    for(uint8_t i = 0; i < 9; i++)
    {
        si4463_debug("%02x  ", para_info[i]);
    }
    si4463_debug("\n");
    
    if((para_info[2] != 0x44) && (para_info[3] != 0x63))
    {
        return 0xFF;
    }
    return 0;
}


uint8_t si446x_Get_Func_Info(void)
{
    uint8_t func_info[7];
    
    memset(func_info, 0, sizeof(func_info));
    
    abApi_Write[0] = 0x10;
    siSendData(abApi_Write, 1);
    siWaitForCTS();
    siReadResp(func_info, 7);
    siDelayUs(1);
    
    si4463_debug("si446x_Get_Func_Info:");      // FF  06  00  02  CA  90  01  
    for(uint8_t i = 0; i < 7; i++)
    {
        si4463_debug("%02x  ", func_info[i]);
    }
    si4463_debug("\n");
    
    if((func_info[5] != 0x90) && (func_info[6] != 0x01))
    {
        return 0xFF;
    }
    return 0;    
}

仿真结果:
在这里插入图片描述
00> si446x_Get_Part_Info:FF 22 44 63 00 86 00 00 06
00> si446x_Get_Part_Info:FF 06 00 02 CA 90 01

参考链接

在网上搜到了一篇文章:Silicon Labs无线收发芯片Si4463如何区分芯片版本号?,文中可以看到:

如果Si4463芯片丝印第一行字符为“44631B”,则芯片为B1版本;如果Si4463芯片丝印第一行字符为“44632A”,则芯片为C2版本;
通过CHIPREV或ROMID来判断Si4463芯片的版本号,如果读到的CHIPREV为0x11,或者ROMID为0x03,则Si4463芯片为B1版本;如果读到的CHIPREV为0x22,或者ROMID为0x06,则Si4463芯片为C2版本;

si446x_Get_Part_Info:FF 22 44 63 00 86 00 00 06 中第二个字节0x22,最后一个字节0x06,可以得到我用的是C2版本。
区分版本就是通过第三、四字节的PART + 最后一个字节的ROMID,表格说明如下:
在这里插入图片描述

2.3 基本功能正常仍然发热各种异常

在进行多样品测试时,发现一些板子发热异常,但实际基本通信功能是正常的。一并还有其他异常情况:

  1. 板子用于指示充电状态的RGB灯,会异常亮红灯。
  2. 通信很不稳定(下文3.2节)导致轮询、配网期间的各种异常。

在前面有提到,初始化失败导致PA发热。但是现在功能已经正常了呀,感觉初始化没问题了才是。一时也没有好的思路,想着能解决哪个bug就先解决哪个吧。

从红灯异常起

分析异常亮红灯现象,正常情况应该是黄灯(绿+红),分析问题是绿灯状态会被异常修改。仿真时发现,在初始化完4463后,有一定概率绿灯会“自己”亮。顺着这个方向查找。初始化SPI后,会写入si446使用记录(二)一文中生成的整个头文件。绿灯问题一般就发生在写这个头文件的过程。
刚开始还怀疑是不是MCU设计有bug,或者4463初始化以后产生了什么影响。为了准确定位现象,逐步修改程序,不写入完整的头文件,死循环写入一个字节,就会出现绿灯错误闪烁情况。继续修改spi写函数,确定了不是写spi的问题,而是操作cs管脚导致的。
在主循环中直接while循环操作CS管脚,绿灯一样错误闪烁。这样就简单多了,在SDK操作GPIO的接口中,打印信息,发现经常出现PA2和PA12两个IO。硬件连接如下:

FSK_SPI_CS			PB12    片选
NET_Config_SW		PA2     按键
Charge_LED_CTRL_2	PA12    绿灯

也就是确实操作了绿灯。而PA2则是按键。在初版程序中,两个按键采用了在系统定时器内轮询检测的方式。只要去除PA2按键的检测,则绿灯不再异常。将主循环操作IO的方式,直接替换为N32的库函数,也不会异常。最终确定是程序底层使用的SDK有问题。在操作SPI的CS和读取按键的IO,频繁交替执行,导致了底层操作IO出错。PB12和PA2搞混了port和pin,组成了PA12?(出错原因???)

根据原因再去看板子发热的现象,应该就是连续写入头文件的过程中,CS没能正确操作成功,导致SPI通信不稳定,有一定概率导致RF_GPIO_PIN_CFG未正常写入,GPIO0无法如期望输出,最终PA异常。CS操作异常,通信很不稳定,也能解释通了。

三、通信不稳定

3.1 始终无法接收

在开始飞线调试阶段,始终无法接收。看驱动程序,抓SPI波形,都没有什么异常。咨询FAE,反馈仍然是程序肯定存在异常。最终坚持重新飞线,更换硬件后正常。
应该是飞线的FSK部分,不知道在什么时候坏掉了。

3.2 接收端不稳定

使用网关轮询节点时,一段时间后常现通信断开。重启节点,则恢复正常。
查看节点端,存在多种异常:

  1. 异常时查询状态 REQUEST_DEVICE_STATE 3 = Ready state ,不再接收;
  2. 发送完成后,未进入发送中断,无法恢复接收;
  3. 使用取消MATCH功能的割草机设备做监听,虽然节点显示响应发送成功,但实际没有发出来;

问题同2.3节 - - SPI出现异常。

四、传输速率慢

调试过程发现网关和节点之间的传输很慢,网关发出读指令到4463给出发送成功的中断,在27ms左右;发送成功的中断到接收节点的ACK数据,在140ms。
经过查找,是节点程序在最初调试阶段,解析完指令增加了100ms延时,没有去除。这样,去除后的优化重点就是在27ms。
查看配置文件的注释,选择的Data rate 是20Kbps。这个速率很低,看下如何修改。

修改Data rate

在《AN625_Si446x API Descriptions.pdf》或si446使用记录(一)6.1节下载的压缩包文件中查看DATA_RATE相关寄存器:
在这里插入图片描述
程序头文件中

#define RF_MODEM_MOD_TYPE_12 0x11, 0x20, 0x0C, 0x00, 0x03, 0x00, 0x07, 0x0E, 0x09, 0xC0, 0x05, 0xC9, 0xC3, 0x80, 0x00, 0x02

查看20-03开始,为0x0E, 0x09, 0xC0,转换为0x0E09C0 = 920000。实际并不是头文件开头注释的20K。

可以在WDS3中分别设置两个速率(如23K和25K),对比生成的头文件,快速找到头文件中速率相关的寄存器。同时,也可以验证到底是不是如注释所说,Data rate = 20K。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值