您好!
标题:运行 BLE Stack 1.4.0的 OAD 的 CC2540器件的组 A CRC 不匹配
背景
在我们的系统中、BLE 器件具有一个工作波特为115、200的串行端口 UART、用作主机设备的管理端口。 另一个以9600波特运行的串行 UART、用于不同的应用。
TI BLE Stack 版本为1.4.0。
在我们的 CC2540上、闪存不对称、Bank A 占据88KB、Bank B 占据160KB。 闪存的物理分区如下:
|
分区 |
大小(以 KB 为单位) |
存储器范围 |
|
BIM |
2. |
0x00000 - 0x007ff |
|
银行_A |
88 |
0x00800 - 0x03fff |
|
组_B |
160 |
0x04000 - 0x2bfff |
|
SNV (2组) |
4. |
0x3e800 - 0x3f7ff |
|
最后一个扇区(锁定位等) |
2. |
0x3f800 - 0x3FFFF |
Bank_B 包含生产映像、而组 A 中映像的唯一目的是升级组 B。 要升级组 B、我们首先切换到组 A、升级组 B、然后切换到组 B
我们的系统还提供了在银行 B 之外运行时升级银行 A 的功能、但这一功能很少使用。
所有升级均使用 TI 提供的 OAD 设计进行、无论是无线还是串行端口。
这是 BIM (TI 的引导加载程序)和 OAD 工作方式的重新散列: 每个图像的标头包含一个2字节的主 CRC、该 CRC 在编译期间计算并插入到标头中、而接下来的两个字节、即影子 CRC、由默认的初始化程序0xFFFF 单独保留(因为它位于闪存中)。
启动时、BIM 首先尝试通过比较 Bank_B 的主 CRC 和影子 CRC 从 Bank_B 引导 如果影子 CRC 为0xFFFF、BIM 会计算组 B 映像的实际 CRC、将其与组 B 映像标题中的主 CRC 进行比较、如果两者匹配、则将 CRC 写入组 B 的影子 CRC、并将器件复位。 另一方面、如果主 CRC 和计算出的 CRC 不匹配、BIM 为组 A 执行相同的序列
由于升级到组 B 需要切换到组 A、因此切换请求首先检查主 CRC 和影子 CRC 是否匹配。 如果是、则会发生切换。 如果它们不匹配、且影子 CRC 为0xFFFF (意味着我们从未在组 A 中执行过)、我们首先计算 Bank_A 映像的 CRC、将其写入影子 CRC、如果这两个匹配、 我们切换到 Bank A。 这可确保我们绝不会使系统砖墙、因为根据 TI 的 OAD 设计规则、切换到 Bank A 涉及使 Bank B 无效。
另一点值得注意:当器件从组 A 或组 B 引导时、仅以二进制形式提供的 TI BLE 堆栈会写入我们被告知位于组中间的"校准数据"。 这种情况的一个严重后果是、在发生"写入校准数据"之后、图像的 CRC 会导致组的计算 CRC 永远不匹配主 CRC、至少直到组升级。
问题说明
我们实施了一个系统、在该系统中、升级通过串行端口进行、有时使用 OAD。 在我们的 Scale tested 中的60% BLE 器件上、没有问题。 在大约40%的器件上、我们发现 Bank_A 主 CRC 和影子 CRC 不匹配。
系统是如何进入这种情况的?
结果显示影子 CRC 包含该值,就好像 CRC 是在写入“校准数据”之后计算的。 但是、TI 堆栈的工作方式是、只有当器件从组中引导时、才能将校准数据写入相应的组。
但是、在本例中、我们会将校准数据写入 A 组、这意味着我们在 A 组之外执行了、但主 CRC 与影子 CRC 不匹配、因此我们不可能在 A 组之外执行
我们不知道如何解释这种矛盾。 感谢 TI 在解决此问题方面的帮助。
此致、
KK
