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.

[参考译文] TMAG5273:CRC 计算问题

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1200004/tmag5273-issue-with-crc-calculation

器件型号:TMAG5273
主题中讨论的其他器件: TMAG5173-Q1

我们使用的是 TMAG5273传感器。 我们希望使用 CRC 特性(CRC_EN=1)、并使用数据表(SLYS045A)的第7.5.1.3.6节中给出的算术来验证校验和。

校验和只是第一次显示正确;对于后续读取、我们无法验证校验和。

例如:

  1. 我们第一次收到0x00 0x09 0x00 0x18 0x00 0x2B 0xB1 0x52、其中最后一个字节是 CRC。 按照该算法计算命令字节(0x6B)和前七个字节的校验和、将为我们提供预期结果0x52。
  2. 我们第二次收到0x00 0x13 0x00 0x13 0x00 0x2F 0x91 0xDA。 使用相同算法、CRC 值为0xEF、这与发送的值0xDA 不匹配。
  3. 第三次收到0x00 0x0D 0x00 0x19 0x00 0x2A 0x31 0x49、CRC 也不匹配。

我们是否有任何可能忽视的地方?

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

    Frank:

    感谢您联系 E2E。 第7.5.1.3.6节中显示的公式仅适用于要读取的单字节数据。  您是否能够确认您正在对整个4字节读取应用 CRC 计算?

    谢谢。

    Scott

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

    Frank、您好!

    我们还提供了 TMAG5273的代码示例、其中包含如何计算 CRC、您可以确认这是在您的函数中实现的方式还是在您的微控制器中使用代码。

    下载链接如下: https://dr-download.ti.com/secure/software-development/firmware/MD-eOz9dMgxSG/1.0.0/TMAG5x73-EXAMPLE-CODE.zip

    此致!

    Isaac

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

    Scott、

    是的、我可以确认我们正在将此算法应用于我们认为校验和应涵盖的所有字节。 我们的 C 实现也获得了与我们用来进行比较的 Python CRC 模块相同的结果。 我们在上电后第一次接收到的测量结果始终是正确的。

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

    Scott、

    是的、我可以确认我们正在将此算法应用于我们认为校验和应涵盖的所有字节。 我们的 C 实现也获得了与我们用来进行比较的 Python CRC 模块相同的结果。 我们在上电后第一次接收到的测量结果始终是正确的。

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

    Isaac、

    感谢您提供该链接、但它对我不起作用。 尝试访问它时出现超时错误。 我今天晚些时候会继续尝试。 是否有机会在此提供不同的链接或粘贴代码?

    谢谢。

    弗兰克

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

    Frank:

    请参阅此处的示例计算:

    uint8_t TMAG5x73calculateCRC(uint8_t i2cRead, uint8_t numChannels, uint8_t data[])
    {
        if ((i2cRead > 0x02) || (numChannels == 0) || (numChannels > 0x04)) assert(1 == 0);
    
        int i = 0;
        uint8_t crc = 0xFF;
        uint8_t crcNew = 0x00;
        uint8_t d[8];
        uint8_t c[8];
        int j = 0;
    
        if (i2cRead == 0x01)
            numChannels = numChannels * 2;
        else if (i2cRead == 0x00)
            numChannels = 4;
    
        for (i = 0; i < numChannels; i++)
        {
            for (j = 0; j < 8; j++)
            {
                d[j] = (data[i] >> j) & 0x01;
                c[j] = (crc >> j) & 0x01;
            }
    
            crcNew = d[7] ^ d[6] ^ d[0] ^ c[0] ^ c[6] ^ c[7];
            crcNew |= (d[6] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[6]) << 1;
            crcNew |= (d[6] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[6]) << 2;
            crcNew |= (d[7] ^ d[3] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[3] ^ c[7]) << 3;
            crcNew |= (d[4] ^ d[3] ^ d[2] ^ c[2] ^ c[3] ^ c[4]) << 4;
            crcNew |= (d[5] ^ d[4] ^ d[3] ^ c[3] ^ c[4] ^ c[5]) << 5;
            crcNew |= (d[6] ^ d[5] ^ d[4] ^ c[4] ^ c[5] ^ c[6]) << 6;
            crcNew |= (d[7] ^ d[6] ^ d[5] ^ c[5] ^ c[6] ^ c[7]) << 7;
    
            crc = crcNew;
    
        }
    
        return crc;
    }

    谢谢。

    Scott

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

    Scott、感谢您发布代码。 我能够将代码编译到测试程序中。 但是、我无法使用该代码验证我们收到的 CRC。

    我们的 CRC 实现会生成与该代码相同的结果、给定相同的输入字节。 我想问题是、接收到的字节中应该包括在校验和计算中。

    我们在启用 CRC 的情况下对16位数据的三个通道(XYZ)使用1字节 I2C 读取命令、如图7-12的第三个子图所示。 因此、我从传感器接收8个字节:6个通道数据字节、1个数据字节[CONV_STATUS]和1个 CRC 字节。 这些是我在上面的初始帖子中引用的字节。

    现在,给定这些输入的上述代码只计算6个通道数据字节的校验和,因为循环将从0到3*2运行。 但是、使用此逻辑、我仍然无法验证所看到的结果。

    谢谢!

    弗兰克

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

    Frank:

    我希望确保根据您提供的数据正确计算 CRC。  您可以发送起始寄存器值吗?  即:

    0x6A、0x??、0x6B…… 数据

    谢谢。

    Scott

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

    Scott、

    我使用0x6B 作为 CRC 校验和的初始字节。 对于我初始帖子中的三个示例:

    1. CRC (0x6B、0x00、0x09、0x00、0x18、 0x00、0x2B、0xB1)= 0x52、符合接收到的 CRC 字节。
    2. CRC (0x6B、0x00、0x13、0x00、0x13、 0x00、0x2F、0x91)= 0xEF、与接收到的 CRC 字节0xDA 不匹配。
    3. CRC (0x6B、0x00、0x0D、0x00、0x19、 0x00、0x2A、0x31)= 0x7C、这与接收到的 CRC 字节0x49不匹配。

    谢谢。

    弗兰克

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

    Frank:

    您是否已将 I2C_RD 设置设置设置为01b?  如果尝试在标准3字节模式下读取这么多的寄存器、则大于4字节的读取不支持 CRC:

    谢谢。

    Scott

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

    Scott、

    是的、I2C_RD 设置为1。

    我们的传感器配置为:

    • DEVICE_CONFIG_1寄存器:
      • CRC_EN = 1
      • CONV_AVG = 5
      • I2C_RD = 1
    • DEVICE_CONFIG_2寄存器:
      • OPERATING_MODE = 2.
    • SENSOR_CONFIG_1寄存器:
      • MAG_CH_EN = 7

    所有其他寄存器保持复位值。

    谢谢。

    弗兰克

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

    Frank:

    感谢您的确认。  我在处理您提供的数据时会得到相同的 CRC 计算值。 您能否确认 START 和 STOP 命令之间的时钟速率和时序?  如果可能、如果您可以捕获 I2C 事务的示波器屏幕截图、则会有所帮助。

    谢谢。

    Scott

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

    Scott、

    这是逻辑分析仪的帧抓取。 I2C 配置为标准100kHz。 我们正在使用 ST 微控制器的内置 I2C 外设、因此定时应该不是问题。

    弗兰克

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

    Frank:

    我一直在努力向设计团队传达此问题、并确认数据表中存在勘误表。  要对此器件使用 CRC、它需要处于完整的3字节读取模式、并且采集的连续数据字节不得超过4个、如我在前面提到的注释中所示。  对于由此给您带来的不便、我深表歉意。  我们将更新数据表以反映这一点。   

    如果需要这种读取模式、对于8位和16位读取模式、TMAG5173-Q1会在1字节读取模式下以 CRC 运行。

    感谢您的耐心等待。

    Scott

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

    Scott、

    感谢您的答复。 这并不能完全解决问题、但可以肯定地对其进行了解释。 勘误表何时发布? 我能事先得到一份记录吗?

    我是否正确理解、此问题将在该器件的更新版本中得到解决? 我在其他地方找不到其他提及"TMAG5173-Q1"的地方。 此修订版本将在何时提供?

    弗兰克

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

    Frank:

    TMAG5173-Q1是与 TMAG5273功能相似的不同器件:

    https://www.ti.com/product/TMAG5173-Q1

    我不知道 TMAG5273会收到任何硅片更改、以提高 CRC 覆盖率并符合 TMAG5173-Q1。  

    数据表作者尚未开始起草对文档的更改、正在努力确定其时间表、但将进行此更新。

    谢谢!

    Scott

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

    啊、我明白了。 感谢您的澄清。