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.

[参考译文] MSP430F6659:需要有关 CRC-16计算 ACC 的帮助。 以通过 TMS3705与 TMS37157进行通信

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/692903/msp430f6659-need-help-with-crc-16-calculation-acc-to-ccitt-to-communicate-via-tms3705-to-tms37157

器件型号:MSP430F6659
主题中讨论的其他器件:TMS3705TMS37157

您好!

我想计算 CRC-16 ACC。 以通过 TMS3705与 TMS37157进行通信。

我有一个使用移位运算的工作代码。

我 采用了这种方法: https://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks、代码片段5、基于移位寄存器的除法、LSB 优先、它的工作方式非常完美。

MSP430F6659具有一个硬件 CRC 模块、我想使用它、因为它是更快、更巧妙的解决方案。

这是我迄今为止测试过的代码、但与软件解决方案相比、它未提供正确的结果:

unsigned int i、crc_result、crc_Init = 0x3791;

CRCRESR = CRC_Init;// CRCINIRES = CRC_Init;
for (i=0;i <length; i++)   {

CRCDIRB = STRING[i];
}
CRC_RESULT = CRESR;

return (CRC_RESULT); 

我尝试使用反向(见上文)和非反向寄存器、但非反向版本似乎起作用。

请帮助

此致

格尔德

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在 CRCINIRES 寄存器上看不到任何"实际"初始化(您的代码注释为 OUT)!
    您是否在代码中的其他位置执行此操作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mike:

    我使用(我希望) MSP430寄存器的所有可能组合进行了演示、但没有一个组合会返回正确的 CRC16。

    目前、我正在使用 软件 CRC16计算 、它的工作效果非常完美。 我可以看到 TMS37157接受 CRC16。

    这是软件 CRC16代码:


    unsigned int funcTMS3705_sw_CRC16 (unsigned char*字符串、unsigned char 长度) { unsigned int i、j、crc = 0x3791; for (i=0;i <length; i++) { CRC = CRC ^ STRING[i]; for (j=0;j<8;j++)//假设每字节8位 { if (CRC & 0x0001) CRC =(CRC >> 1)^ 0x8408;//如果最右边(最高有效)位被置位 否则 CRC = CRC >> 1; } } 返回(CRC); }

    但这不是它应该是怎样的。

    这是硬件 CRC16的当前版本:

    unsigned int funcTMS3705_CRC16 (unsigned char* string、unsigned char length)
    {
    unsigned int i;
    
    CRCINIRES = 0x3791; //用0x3791初始化 CRC 初始化和结果寄存器 CRCINIRES
    
    对于(i=0;i 
    

    正如我之前说过的,我在所有的寄存器中都玩得很好,而不是组合的组合也做得很好。

    我希望您能够找到解决方案。

    此致

    格尔德

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

    在我看来、您的 C 代码示例计算 CRC-XMODEM (Polynom:0x8408)、而 MSP430F5xx 系列的硬件 CRC 模块计算 CRC-CCITT (Polynom:0x1021)。 两个 CRC 不匹配是有意:-)


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

    您好、Christoph、

    现在我完全困惑了。 ;-)

    在 TMS37157数据表的第39页中、它明确地说:
     
    在接收和传输数据期间、TMS37157中使用循环冗余校验(CRC)发生器
    要生成16位块检查字符(BCC)、请应用 CRC-CCITT 算法
     
    我的软件版本肯定会生成正确的 CRC16。 否则、TMS37157将不会做出正响应。

    正如我在原始帖子中所说、我在 Wikipedia 中找到了软件版本、它非常适合 TMS37157。

    如何使用 MSP430F6659硬件 CRC 引擎实现同样的功能?

    顺便说一下、多项式:0x8408只是多项式:0x1021的相反

    此致
    格尔德

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

    您好、Gerd、

    你是对的,CRC-CCITT 也经常让我感到困惑:-)  

    但我认为记录的方式是 CRC-CCITT 的正确方法:

    <srecord.sourceforge.net/crc16-ccitt.html

    Lammert Bies 在描述 CRC-CCITT 的不同"风味"方面做得很出色

    www.lammertbies.nl/.../crc-calculation.html>

    考虑到这些信息、我认为应该能够找出 TMS37157的 CRC 算法是否会反转 数据/CRC 和/或结果 是否需要执行一个人的补码。

    希望这对您有所帮助

    Christoph

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

    您好、Christoph、

    非常感谢您提供这些背景信息。

    现在、我更了解 CRC16-CCITT。

    但很抱歉,这不是我原来的问题。

    我寻求帮助以了解如何 使用 MSP430F6659硬件 CRC 模块实现正确的 CRC16-CCITT

    你可以帮帮我吗?

    此致

    格尔德

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

    您好!

    仍然没有解决。

    有什么想法吗?

    此致

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

    从您的源代码中可以看到、您正在计算 CRC 字节(字符串中的8位字符)值。

    我使用的是具有正常和反向位顺序的5xx CRC 硬件模块。 在计算之前、 CRCINIRES 被设定为0xFFFF。 在计算期间、每个字(16位)被写入 CRCDI 或 CRCDIRB (取决于位顺序)。 最后、结果位于 CRCINIRES 中。 通过 micro 计算的值与 PC 端计算的值进行比较。  

    
    D:\MSP430>FLASH -f test_msp430f5510.txt -e -ws -crc -crcr
    
    文件:"test_msp430f5510.txt"
    地址:08000字:16384
    大小: 在
    
    COM4
    
    获取器
    件# JTID 保险丝器件核心硬软 LotWafer DieX Diey0
    91 OK 3180 1104 12 013BB046 2A00 2100
    1 91 OK 3080 1104 30 10 B15B9446 2000 1700
    2 91 OK 3180 1104 12 013BB046 1200 1E00
    3 91找到32768字节 SBW+ OK 3881 1106 10 219CA446 1800 0F00
    
    擦除
    
    智能写入
    时间:208ms 速度:153、8KB/s
    
    CRC
    文件#0 #1 #2 23B1
     23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1 23B1时间
    :33B1时间:33ms 速度:942、9KB/s
    
    CRC 反向
    文件#0 #1 #1
    
    937,9kB/s
    
    发布器件
    
    总时间:406ms
    
    D:\MSP430>