This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F67791A:使用 UniFlash BSL 时密码 CRC 验证失败

Guru**** 2382480 points
Other Parts Discussed in Thread: UNIFLASH, MSP430F67791A, MSP-FET
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1472243/msp430f67791a-password-crc-verification-fail-when-using-uniflash-bsl

器件型号:MSP430F67791A
主题中讨论的其他器件: UNIFLASHMSP-FET

工具与软件:

 在 BSL (引导加载程序)模式下使用 UniFlash 对 MSP430F67791A 进行编程时、我们遇到了一些密码 CRC 验证问题。

这与以下票证非常相似:

MSP430FR2433:使用 Uniflash 通过 BSL 对存储器进行编程时出现问题

使用的工具/设备

  • UniFlash 版本:8.1.1.4146和9.0.0.5086 (旧版本和最新版本也出现相同问题)
  • MSP-FET 调试器/编程器
  • MSP430F67791A

该设计的链接

希望以下示例突出显示了该问题:

  • 使用 UniFlash 通过 JTAG 接口对器件进行编程(无需密码)。
    • 程序的十六进制数据已知。
    • 0xFFE0处的密码数据是已知的。
    • 我们加载的软件是 V1.0
  • 断开 UniFlash 和 MSP-FET 编程器并检查程序运行
    • 没有问题、程序按预期运行。
  • 连接 MSP-FET 编程器并使用 UniFlash 再次对器件进行编程、但这次使用 BSL (引导加载程序)模式(需要密码)。
    • 程序的十六进制数据已知并且与 V1.0不同
    • 0xFFE0处的密码数据是已知的、并且与 V1.0不同
    • 我们加载的软件是 V1.1
  • 当 BSL 检查地址0xFE00 (密码数据的位置)时、验证失败。

密码

v1.0密码数据如下:

@FFE0
E0 C0 DE C0 FF FF FF DC C2 7E C2 DC C0 B0 C1
84 C0 38 C0 FF FF 20 C2 FF FF FF FF FF 00 C0

v1.1密码数据如下:

@FFE0
E0 C0 DE C0 FF FF E0 C2 82 C2 DC C0 B0 C1
84 C0 38 C0 FF FF 24 C2 FF FF FF FF FF 00 C0

正如预期的那样、2个密码之间有些字节是不同的。

UniFlash 设置

此时已加载"TEST_V1.0.txt"、我们选择 V1.0软件的密码文件。

选择要加载到器件中的"test_v1.1.txt"、这将覆盖 V1.0软件。

我的理解是、所选密码文件必须与当前编程到器件中的密码数据相匹配-在本例中、V1.0软件的密码数据就是这样。

CRC 故障

使用 V1.1软件对器件进行编程并验证后、地址0xFFE0 (即密码地址)出现故障:

[CRC、6:55:02 PM] [错误]:0xFFE0处的2025年2月10日 检查不匹配;预期值:从 BSL 获得的0xA366:0xFB55
[MSP430、6:55:02 PM] [信息] 2025年2月10日:[80][06][00][16][E0][FF][00][20][00][3C] EF
[MSP430、6:55:02 PM] [信息] 2025年2月10日:{00}{80}{03}{00}{3A}{55}{FB}{C6}{61}

UniFlash 期望密码 CRC 为0xA366、但器件的引导加载程序将计算并返回0xFB55。

我使用 MSP430闪存器件引导加载程序(BSL) 文档对进出器件的传输进行了解码、该文档显示了如下命令和响应:

  • 来自 UniFlash 的命令:[80][06][00][16][E0][FF][00][20][00][3C] EF
    • 80 =接头
    • 60 00 = 0x0006 (数据包中的字节)
    • 16 ="CRC 检查"
    • E0 FF 00 = 0x00FFE0 (地址)
    • 20 00 = 0x0020 (长度、即32字节、密码长度)。
    • 3C EF = 0xEF3C (数据包校验和)
  • 来自 MSP430的回复:{00}{80}{03}{00}{3A}{55}{FB}{C6}{61}
    • 00 =来自 MSP430的 ACK、指示命令数据包有效
    • 80 =接头
    • 03 00 = 0x0003 (数据包中的字节)
    • 3A ="CRC 值"
    • 55 FB = 0xFB55 (CRC 由 MSP430引导加载程序计算)
    • C6 61 = 0x61C6 (数据包校验和)。

因此、UniFlash 使用"TEST_V1.0.txt"软件(当前加载到 MSP430)的密码文件、并验证密码是否与当前加载的软件相匹配(PASS)。

然后将新软件"TEST_V1.1.txt"被编程到 MSP430 (PASS)中。

然后、验证(存储器检查)阶段发生(失败)、密码检查失败。

CRC 计算

我使用在线 crccalc 工具计算新旧密码的预期 CCITT CRC。

V1.0 (旧)密码= 0xA366

V1.1 (新)密码= 0xFB55

结论

我认为 UniFlash 工具使用提供的密码文件数据对照当前加载的软件进行检查(OK)、但也使用它来检查正在加载的新软件(不正常)。

这部分基于处于"详细"模式时 UniFlash 的控制台输出:

[CRC、6:55:02 PM] [错误]:0xFFE0处的2025年2月10日 检查不匹配;预期值:从 BSL 获得的0xA366:0xFB55

在验证新代码时、它预计 CRC 为0xA366 (但这是旧密码 CRC)并从器件获得0xFB55 (这是正确的新 CRC)。

UniFlash 是否使用旧密码的 CRC 来检查新编程的密码数据?

希望一切都有意义、

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Eric、您好!

    我将在内部检查 Uniflash 密码 CRC 验证逻辑。 有关您的应用的问题:

    是否有必要要求旧映像和新映像使用不同的密码?

    此致、

    Pengfei

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Pengfei:

    感谢您的快速响应。

    这取决于旧软件版本和新软件版本之间的差异。

    因为密码数据实际上是软件中中断矢量的地址、所以密码数据通常会根据在新软件版本中修改的值而改变。

    为了确保密码始终相同、我认为必须对每个中断矢量的地址进行硬编码、这不是我们首选的选项。

    此致、

    Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Eric、您好!

    感谢您提供的信息。 我将在内部进行检查。

    此致、

    Pengfei

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    然后验证(内存检查)阶段发生(失败)、密码检查失败。

    您是否 在第二次尝试下载时更改了 test_V1.1.txt 的密码?

    因此、如果为中断表下载的新固件通常已更改、则应确保密码位于中断表的地址、因此您需要使用不同的密码来访问 BSL

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Gary、

    感谢您的提问。

    我认为 UniFlash 表明已成功在 MSP430中"验证"已编程软件的唯一方法是:

    • 新软件的32字节密码与旧软件(中断矢量值)的32字节密码匹配。
      • 当 UniFlash 尝试对 MSP430进行编程时、它将  对照   MSP430中当前加载的32个字节来检查提供的密码文件。
      • 当 UniFlash 完成新软件的编程后、它将使用 相同的密码文件 来验证   MSP430中的新32个字节。
      • 如果32字节密码数据(中断矢量值)从未更改、则始终通过验证。
      • 如果32字节的密码数据在旧的和新的 MSP430软件之间发生变化、验证阶段将始终失败。
    • 对软件进行两次编程。 在以下示例中、我假设32字节密码数据在 V1.0和 V1.1  MSP430 软件之间发生变化。
      • MSP430中已加载 V1.0软件。
      • 为 UniFlash 提供 V1.0的密码文件(加载 V1.0软件时解锁 MSP430访问所需)。
      • 使用 UniFlash 将 V1.1软件编程到 MSP430中。
      • UniFlash 将 V1.1软件编程到 MSP430中 (PASS、因为密码与先前载入的软件(即 V1.0)相匹配)
      • UniFlash 根据提供的密码文件验证新加载软件(V1.1)的密码数据(失败-密码数据已更改)。
      • 现在向 UniFlash 提供新密码文件(用于 V1.1软件)。
      • UniFlash 将 V1.1软件  再次编程到 MSP430中(传递、因为密码与已经在 MSP430中的软件(即 V1.1)相匹配)
      • UniFlash 使用新密码(PASS)验证器件中新编程软件(V1.1)的密码数据

    第一点、我们不能真正假定中断矢量数据从未改变、因此我们不能假设密码从未改变。

    对于第二点、对软件进行两次编程(首先是对旧文件使用密码、其次是对新文件使用密码) 最终将 导致 UniFlash 不提供验证错误(第一次出现验证错误)、但这看起来非常像一种权变措施。 根据我的分析(原始文章)、UniFlash 将软件正确地编程到器件中、但"验证"检查失败、我认为检查失败了、因为它没有根据正确的32字节数据(新旧数据)进行验证。

    我认为这一过程应该是:

    • 将新软件文件提供给 UniFlash (V1.1)
    • 为目前加载到 MSP430的软件提供密码文件(版本1.0)
    • UniFlash 使用 V1.0软件的密码文件获取访问权限并将 V1.1软件编程到 MSP430中。
      • UniFlash 已正确实现了这一点。
    • 然后、UniFlash 确定新软件(V1.1)的密码数据。
      • 它可以从 V1.1软件文件中读取此内容。
      • (而不是使用旧密码文件来检查新加载的密码数据)
    • UniFlash 将根据新确定的密码数据验证新编程的软件(V1.1)。

    总之、这就是我对当前 UniFlash 行为以及我认为它应该实现的功能的理解。

    但我可能错了-我希望文章是有意义的。

    此致、
    Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为您是对的、因为更可靠的方法是您可以直接通过逻辑分析仪(如 saleae)捕获波形、这种分析仪将会更清晰。