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.
我必须首先说明、我完全了解 CC3220 (和其他 TI 物联网板)的无线功能。
我正在处理的项目的总体目标是使用 ESP32触发 MSP430上的引导加载序列、然后通过其透视 UART 通道传输在 CSS 中生成的固件。
我现在面临的最大问题是计算校验和值(CKL | CKH)
唯一提到如何计算校验和值的地方是 下面列出的校验和部分2.4.2 (第10页)中的 MSP430闪存器件引导加载程序(BSL) PDF。
当我跳转至 MSP430 FRAM 器件引导加载程序(BSL) PDF 至4.1.5.3节:整体擦除(第18页)并向下滚动至 UART PI 示例以了解需要遵循的内容时, 与我在上面屏幕截图中使用 CKL 和 CKH 公式计算的0x7F 和0xEB 字节相比、我不理解它们是如何获得用于校验和字节的0x64和0xA3的。
下面是刚才提到的 UART PI。
为了实现完全透明、我在这里计算了我之前提到的校验和字节(0x7F 和0xEB)
CKL = INV [ 0x80 XOR 0x00]--> INV [ 1000 0000 XOR 0000 ]--> INV [ 1000 0000 ]--> 0111 111 --> 0x7F
CKH = INV [ 0x01 XOR 0x15]--> INV [ 0000 0001 XOR 0001 0101]--> INV [ 0001 0100 ]--> 1110 1011 --> 0xEB
如果就此事项提供任何指导,将不胜感激
FRAM BSL 计算 CRC-16/CCITT-false 校验和。 请参阅 FRAM 器件 BSL 文档的4.1.5.4 CRC 校验。 灰色字段是用于计算 CRC 的字节。
转到 https://www.crccalc.com、 将输入设置为十六进制、将"15"插入输入、然后单击"CRC-16"按钮。 您将在页面上看到"CRC-16/CCITT-false"的结果为"0xA364";FRAM BSL 将 CRC 输出为小端字节序。
感谢您的回答 Seth、但您能否进一步详细说明您在将15与 UART PI 示例相关的内容输入到您提到的 CRC 计算器中?
我在阅读您的回答后假设您使用了以橙色突出显示的校验和公式?
下面是我希望获得相同结果的步骤、但我做得不好、我不确定我做了什么错误。
校验和= INV [(0x80 + 256 * 0x01) XOR (0x00 + 256 * 0x15)](以十六进制形式写出)
校验和= INV [(128 + 256 * 1) XOR (0 + 256 * 21)]( 以十进制表示)
校验和= INV [384 XOR 5376]
校验和= INV [5244]
校验和= INV [ 0001 0100 1000 0000]
校验和= 1110 1011 0111 1111 = 75BF (十六进制)= 30143 (十进制)
将75BF 输入 crccal.com -> 0xBC97后的结果
不、该公式与您用橙色突出显示的公式完全不同。 您在 MSP430 闪存器件引导加载程序(BSL) PDF 中找到的公式 不适用于 您的器件。
FRAM 器件上的 CRC 是使用 CRC-16/CCITT-false 算法计算的、而不是用橙色突出显示的公式。 FRAM BSL 只需使用 MCU 内部的 CRC 模块进行计算。 您可能希望阅读有关 CRC 模块的器件用户指南、了解如何计算该模块。
在 UART PI 示例中、以深灰色阴影显示的所有字段都是输入到 CRC 计算中的字节。 因此、对于"批量擦除"命令、只有 CMD 字节为灰色。 将 CMD 字节(0x15)传递到有效的 CRC-16/CCITT-false 计算器将产生0xA364。 因此、BSL 的响应会计算具有两个灰阶字节的 CRC、即 CMD (0x3B)和 MSG (0x00)。 将这两个字节放入 CRC-16/CCITT-false 计算器将导致校验和为0xC460。
下面是一个通用函数、可用作如何计算 FRAM 器件的 CRC 的示例。 字节或位顺序会更改结果、因此需要对其进行定制以匹配目标器件和主器件的正确字节序。
uint16_t calculateCRC16CCITTFALSEChecksum(unsigned char *byteBuffer, unsigned int numChars) { int i = 0; int j = 0; uint16_t checksum = 0xFFFF; for(i = 0; i < numChars; i++) { checksum ^= (byteBuffer[i] << 8); for(j = 0; j < 8; j++) { if(checksum & 0x8000) { checksum <<= 1; checksum ^= 0x1021;//Represents the x^15 + x^12 + x^5 + 1 polynomial } else checksum <<= 1; } } return checksum; }
你是我的英雄 Seth
这是我第一次编写任何类型的引导加载程序、您的回答帮助我最终完成了这个在过去一个月半时间里死于水中的项目
不用客气! 不久前我也在那里。 请务必仔细阅读 SLAU550AA、尤其是在您希望通过 BSL 对目标进行编程时。 更重要的是、每个"RX 数据块"事务的最大有效负载大小为256字节、因此、如果 MSP430目标的程序大于256字节、则需要进行多个事务。