工具与软件:
这里我 列出了 Hercules 系列的小端字节序(例如 RM57Lx)和大端字节序(例如 TMS570LC43x)器件的循环冗余校验(CRC)控制器模块中的所有错误。
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.
工具与软件:
这里我 列出了 Hercules 系列的小端字节序(例如 RM57Lx)和大端字节序(例如 TMS570LC43x)器件的循环冗余校验(CRC)控制器模块中的所有错误。
问题1:
64位数据不会正确复制到 大端字节序器件(TMS570LC43x)中的签名或 CRC 值寄存器:
在大端字节序和小端字节序器件中、您可以看到较低寄存器和较高寄存器的顺序。
低位寄存器位于较低地址、后面高位寄存器位于较高地址。 68h 偏移处的 CRC_REGL1和 6Ch 偏移处的 CRC_REGH1示例。
例如、如果您看到下图:
我在这里尝试将0xAABBCCDDEEFF0011复制到大端字节序器件的64位模式 CRC 值寄存器、如果您仔细验证、我的高数据字0xAABBCCDD 被复制到 CRC_REGL1、低数据字0xEEFF0011被复制到 CRC_REGH1寄存器。
但我们希望反向、即较低的数据字传输到低位寄存器、较高的数据字传输到高位寄存器。 因此、在大端字节序器件中、每当您尝试使用 DMA 或直接方式将数据移动到这些寄存器时、都必须交换输入数据(较低的32位、较高的32位)。
如果您为一个小端字节序器件(例如、RM57Lx)验证同样的测试:
您可以看到数据移动正确、即64位数据的低位字(0xEEFF0011)移动到低位寄存器 CRC_REGL1中、而高位字(0xAABBCCDD)移动到高位寄存器 CRC_REGL1中。
因此、在小端字节序器件中、我们无需在写入上述寄存器之前交换数据。
结论:
在 用于自动模式或半 CPU 模式的大端字节序器件(例如 TMS570LC43x)中 、在向 DMA 提供数据之前、应在 DMA 开始将数据复制到 PSA 签名寄存器/CRC 值寄存器之前交换相应数据中的每个64位字(较低和较高的32位字)。
在大端字节序器件 (例如 TMS570LC43x)中 、在将 数据提供给 crcSignGen API 之前、相应数据中的每个64位字都需要交换(较低和较高的32位字)。
而这对于小端字节序器件(例如 RM57Lx)不是必需的。
有关更多详细信息、请参阅随附的示例。
问题2:
CRC 驱动程序中的 crcGetSectorSig 和 crcGetPSASig API 会在小端字节序和大端字节序器件中错误地返回压缩的签名:
如果您在 TMS570LC43x 和 RM57Lx 的驱动程序中验证这些函数的定义:
就在这些函数返回压缩 CRC 之前、它们会将较低的寄存器转换为较高的32位值、将较高的寄存器转换为较低的32位值。 这应该是正确的、较高的寄存器值应该是64位值的较高的32位、较低的寄存器值应该是64位值的较低32位。
结论:
无论如何、在自动模式下不需要这些函数、因为 CPU 无需读取和比较压缩的签名。
如果您在半 CPU 或全 CPU 模式下使用这些 API、则在从这些函数中获取64位值后、应在使用前交换相应的值。
有关更多详细信息、请参阅随附的示例。
示例:
您可以在以下常见问题解答中找到小端字节序器件和大端字节序器件(TMS570LCx 和 RM57Lx)的所有模式(Auto、Semi-CPU 和 full-CPU)的示例: