Part Number:CC2642R
我的产品中使用了CC2642,生产了几万套产品运行良好。最近一个批次由于更换了晶振,出现了一些奇怪的问题:大约10%的产品在使用一段时间(几小时到几天不等)后,不再工作。既无蓝牙信号,也无法打印串口信息,IO管脚也没有任何变化,犹如死机一般。或者也可以认为进入了某种自我保护状态。我暂且称之为无响应状态。
这种无响应状态并非是普通的程序异常,因为无论使用硬件复位管脚,或是完全断电,都无法使其恢复正常工作。
但是只要重新下载一次固件(固件与生产时完全相同),就可以重新恢复正常工作。
进一步,在无响应状态下,通过Flash Programmer2读取CC2642内部Flash中的程序,发现程序是完整的,与下载的固件程序比较,数据一致。
除了0x48000-0x4A0000区域出现了一些奇怪的数据,在我原来下载的固件hex中并没有对这些地址写入任何数据。
更进一步,我发现关键的地方,是在0x4A000地址的一个字节。这个字节在正常工作的芯片中,读取的值是0xFE;而在无响应状态下,读取的值是0x70
当我使用Flash Programmer2将这个字节的值从0x70修改为0xFE,芯片立刻恢复了正常工作;而如果从0xFE修改为0x70,芯片立刻进入无响应状态。
为了排除硬件设计和固件设计的差异,我使用TI评估板CC26X2R1_LAUNCHXL,烧录了SDK中的例程程序simple_peripheral_oad_offchip
我同样在0x4A0000看到了这个0xFE字节,而将其修改成0x70时,同样将芯片置为了无响应状态。
我的问题是:
1. 在内部Flash的0x48000-0x4A000这个区域的数据是做什么用的,并没有在任何资料中找到说明,尤其是位于0x4A000的这个字节的作用是什么?
2. 在什么情况下,会导致位于0x4A000的字节发生变化,并导致芯片自动进入无响应状态?
Kevin Qiu1:
更换的是高频晶振还是低频晶振,0x4A000是内部flash的:
The user application pictured above is responsible for the following:
Implementing the protocol stack specific implementation of the OAD transportFinding a suitable location in external flash for the image and storing its image header in the table.
,
Tao Wu:
更换的是高频48MHz晶振,晶振品牌型号没有改动,只是使用新生产批次的晶振,晶振指标也都正常。
检查了配置,确实0x48000-0x4BFFF是配置为内部SNV区域。如果程序并没有使用SNV的话,其内容为什么也会持续发生改变呢,什么情况下其内容会自动发生永久改动,并且改动进一步导致芯片进入无响应的状态呢?
芯片是否存在某类保护模式,例如检测到时钟、电源不稳定的话,触发这种保护机制,并永久禁止芯片运行程序?直到人为清除SNV中的记录,才能恢复正常?
,
Kevin Qiu1:
只是更换了晶振后就无响应,有没有测过频偏,测一下供电电压是否稳定
NV会在低电压是损坏
,
Tao Wu:
晶振在测试时,指标都是正常的
,
Tao Wu:
原因找到了,确实是由于SNV区域导致,并且发现了SDK中的一个设计问题。
SNV区域可能由于重启等原因,出现了错误数据。具体表现为:两个page的SVN,分别处于(PGNACT和PGXSRC)状态
在SDK(版本simplelink_cc13x2_26x2_sdk_3_40_00_02)文件nvocmp.c中
一旦遇到这种case,会直接执行while(1),将其修改后,不再出现芯片无响应问题
,
Kevin Qiu1:
感谢分享,这个问题在新的SDK中已经解决了,最新的SDK中没有上述代码
你也可以选择升级到最新的SDK来解决此问题
,
Tao Wu:
是的看了simplelink_cc13x2_26x2_sdk_5_20_00_52版本SDK,应该没有此问题。因此产品是两年前开发,所以还是用的老版本SDK。
谢谢您的支持和答复!
,
Kevin Qiu1:
好的