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.

[参考译文] TPS929160-Q1:关于 TPS929160 CRC 计算的问题

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1601114/tps929160-q1-question-about-tps929160-crc-caculation

器件型号: TPS929160-Q1

您好!

我的公司生产程序员,我们希望当用户修改其他 EEPROM 区域时自动修改 CRC REG。 因此、我需要在不使用 Excel 工具的情况下生成 EEPCRC 值。  

在 UART 通信期间、我算法的 CRC 计算是正确的、芯片会给出响应。 但是、当我使用算法计算 EEPCRC(在 Excel 中输入所有数据)时、该值与工具的 TPS929160 计算值不同。 我的结果与 TPS929240 的结果相同、但与 TPS929160 的结果不同。

我注意到、即使工具 Excel 中的数据相同、TPS929240 和 TPS929160 的结果也不相同。 我想知道两个芯片的计算算法是否不同?  

#include"stdio.h" 
#include <string.h>
typedef unsigned char  BYTE;

BYTE EEPPWMMData[99] =
{
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x33, 0x33, 0x33, 0x33, 0x00,
  0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,  0x3F, 0x3F, 0x3F, 0x3F,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x30,
  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10
};

BYTE reserve(BYTE bData)
{
    int i = 0;
    BYTE bTemp = 0;
    for (i = 0; i < 8; i++)
    {
        bTemp |= ((bData >> i) & 0x01) << (7 - i);
    }
    return bTemp;
}

int TPS929_CRC8(BYTE wData[], BYTE bSize)
{
    BYTE reverse_polynom = 0x31;
    BYTE crc = 0xFF;
    int i, n;
    for (i = 0; i < bSize; i++)
    {
        crc = crc ^ reserve(wData[i]);
        for (n = 0; n < 8; n++)
        {
            if (crc & 0x80)
            {
                crc = (crc << 1) ^ reverse_polynom;
            }
            else
            {
                crc = (crc << 1);
            }
        }
    }
    return crc;
}

int main()
{
    int a;
    a = TPS929_CRC8(EEPPWMMData, 99);
    printf("a = 0x%08x\n", a);
    return 0;

}

运行代码、结果为“a=0x0000005a"</s>“
image.png

image.png

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

    我尝试了 Poly、init、OUTXOR、 REFIN 、REFOUT 的所有组合、但找不到。

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

     两个芯片的计算算法相同、并参考 EEPROM 中的数据、TPS929160 和 TPS929240 的计算算法相同。 但是、 TPS929160 的 PWM 寄存器地址与 TPS929240 的地址不同、因为 TPS929160 只有 16 个通道。  

    TPS929160:  

    TPS929240:  

    Thus, you need to adjust the byte order to meet same order as TPS929240. For example, 

    BYTE EEPPWMMData[99] = { 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00...

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

    非常感谢您的帮助。