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.

[参考译文] ADS122U04:可以#39;t 计算 CRC

Guru**** 2529560 points
Other Parts Discussed in Thread: ADS122U04

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/670634/ads122u04-can-t-calculate-crc

器件型号:ADS122U04

您好、

几个小时后、我尝试以与 ADS122u04相同的方式计算 CRC16、但仍然无法使其正常工作。

例如、我的 ADS122u04配置为测量裸片温度、CRC16 ON -回答如下:

0xBA、0x21、0x0d、0x84、0xa0        [LSB_DATA、MID_DATA、MSB_DATA、lsb_CRC、MSB_CRC]

这在内部看起来几乎像是26.25°C (840*0.03125°C)。 但如何计算 c 代码中的 CRC?

在线计算器、如 www. zorc.breitbandkatze.de/crc.html 或以下代码可能会有所帮助、但对我来说却没有帮助。

unsigned short crc16(const unsigned char* data_p, unsigned char length){
    unsigned char x;
    unsigned short crc = 0xFF;

    while (length--){
        x = crc >> 8 ^ *data_p++;
        x ^= x>>4;
        crc = (crc << 8) ^ ((unsigned short)(x << 12)) ^ ((unsigned short)(x <<5)) ^ ((unsigned short)x);
    }
    return crc;
}

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

    您好、Florian、

    欢迎来到 E2E 论坛!  我最初也很难使用 ADS122U04进行 CRC 计算。  为了帮助了解计算的工作原理、我打算发布应用手册、但遗憾的是、我尚未完成该操作。  当数据从器件移出时、计算 CRC。  然后、您必须以与传输时相同的位顺序计算 CRC。  在这里、我发现这是最令人困惑的地方、因为 UART 外设首先将字节接受为 MSB、然后在读取缓冲区时交换顺序。  因此、计算值必须反转位顺序并正确排序字节。

    第二点是在计算 CRC 和  16位值的正确起始值时、必须使用正确的多项式。  下面是我的示例代码。

    /*-版权所有-、BSD
    *版权所有(c) 2017、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *--/copyrights-*/
    
    uint16_t crcADS122U04 (int32_t data)
    {
    uint8_t 校验 CRC[4];
    校验 CRC[0]= revByte ((DATA&0xFF));
    checkCRC[1]= revByte ((data>>8)&0xFF);
    checkCRC[2]= revByte ((data>>16)&0xFF);
    返回(calcCRC (checkCRC、3));
    }
    /**
    * 16位 CRC 的计算。
    *
    *\详细说明了基于发送到函数并计算为16位
    * CRC 的数据的 CRC 结果。 计算结果为无符号短整型。
    *
    *\paramu8数据捕获的数据。
    *\paramu8用于计算的数据长度(以字节为单位)。
    *
    *\返回16位计算出的 CRC 值。
    //
    uint16_t calcCRC (uint8_t * u8Data、uint8_t u8Length)
    {
    uint8_t u8i;
    uint16_t u16CRC= 0xFFFF;// CRC 寄存器的初始值*/
    uint16_t u16Poly= 0x1021;//* CRC polynomial (不包括 uint832/ uint32/ uint32/
    ut
    数据掩码= 0xuint8)//数据 MSB 的位置*/
    bool bDataMSb;//
    数据字节的 MSB */ bool bCrcMSb;// CRC 字节的 MSB*/
    //*从数据字节构造数据字*/
    for (u8i = 0;u8i < u8Length; u8i++)
    {
    u32Data ||(uint32_t)(u8Data[u8i]<< 8*(u8Length - u8i - 1));
    }
    //减少计算周期数(通过跳过任何未使用的字节)*/
    u32MsbMask >=8 *(4-u8Length);
    /* CRC 算法*/
    while (u32MsbMask > 0)
    {
    /*检查 MSB 值*/
    bDataMSb =(bool)(u32Data & u32MsbMask);
    bCrcMSb=(bool)(u16CRC & 0x8000);
    if (bDataMSb ^^ bCrcMSb){u16CRC =(u16ool)<*和 u16CRC
    <* uShift +* u16CRC = 1);if (u16* u16* u16COR)/*仅移位*/*
    
    移位 MSB 指针并确保右移始终产生0 */
    u32MsbMask =(u32MsbMask >> 1)和0x7FFFFFFF;
    }
    return (u16CRC);
    }/**
    
    *反转字节的位顺序。
    *
    *\details 按提交的字节的相反顺序重新排列位
    *并将字节作为无符号字节返回。 这是必需
    的、因为在比较 TX 和 RX 数据时、*始终首先从 UART MSB 发出数据。
    *
    *\paramu8Byte 要反转的数据字节。
    *
    *\返回字节的顺序相反。
    //
    uint8_t revByte (uint8_t u8Byte)
    {
    uint8_t u8i、u8revByte = 0;
    for (u8i=0;u8i<8;u8i++)
    {
    u8revByte ||(u8& 0x01);
    u8revByte >= 1;
    if (u8i++)
    }u8revByte < u8rebyte}
    ;return < u8u8u8revByte
    
    

    此致、

    Bob B