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.

[参考译文] DAC8760:CRC-8-ATM 计算算法

Guru**** 2512415 points
Other Parts Discussed in Thread: DAC8760

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/748586/dac8760-crc-8-atm-calculation-algorithm

器件型号:DAC8760

如何为 DAC8760计算 CRC? 请提供源代码"C"或足够的信息、以便我完成工作吗?

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

    欢迎使用 E2E、感谢您的提问。 我们没有任何 CRC C 代码实现。 但我发现一些第三方来源可能有助于:

    www.rajivchakravorty.com/.../crc8_8c-source.html

    https://crccalc.com/

    此致、
    Uttam Sahu
    精密 DAC 应用工程师
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    除了我还没有使用表之外、我几乎像您提供的链接一样做得非常好。 在创建表之前、我想验证我是否可以使用 CRC 与 DAC 通信。

    以下是代码:

    字节 CalcCRC8 (int count、字节*pdata)

     INT 位、I = 0;
     字节 CRC = 0x00;

     while (i < count)//对于每个字节
     {
      CRC ^=*pdata;//获取数据字节
      for (bit = 0;bit < 8;bit++)
      {
       if ((CRC & 0x80)!= 0x00)
        CRC =(CRC << 1)^ CRC8_ATM; // CRC8_ATM = 0x07
       其他
        CRC <<= 1;
      }//结束
      pdata +;//下一个字节
      i++;
     }//结束 while

     返回 CRC;
    }/*结束 CalcCRC8 */

    下面是调用函数:

    void DAC8760_OUT_CRC (const int ch、const uint 值)

     W2B 评估;
     UINT 垃圾;
     内部时间;
     字节 msg[3];
     字节 CRC;

     Val.w =值;

     //地址字节= DAC 寄存器
     MSG[0]= DAC8760_DAC_REG;
     MSG[1]= vL.b[1];// MSB
     MSG[2]= val.b[0];// LSB
     CRC = CalcCRC8 (3、msg);

     //地址字节
     DAC_SPI_OUT_BUF = DAC8760_DAC_REG;
     时间= DAC_SPI_WAIT_TM;
     WAIT4_SPI2_Xmit;
     while (!DAC_SPI_RBF)&&(time->0);//等待完成
     垃圾= DAC_SPI_IN_BUF;
     DAC_SPI_OUT_BUF = val.b[1];// MSB
     时间= DAC_SPI_WAIT_TM;
     WAIT4_SPI2_Xmit;
     while (!DAC_SPI_RBF)&&(time->0);//等待完成
     垃圾= DAC_SPI_IN_BUF;
     DAC_SPI_OUT_BUF = val.b[0];// LSB
     时间= DAC_SPI_WAIT_TM;
     WAIT4_SPI2_Xmit;
     while (!DAC_SPI_RBF)&&(time->0);//等待完成
     垃圾= DAC_SPI_IN_BUF;
     DAC_SPI_OUT_BUF = CRC;// CRC
     时间= DAC_SPI_WAIT_TM;
     WAIT4_SPI2_Xmit;
     while (!DAC_SPI_RBF)&&(time->0);//等待完成
     垃圾= DAC_SPI_IN_BUF;

     ENTER_CRITICAL_SECTION (50);

     DAC8760_Latch_Low (ch);
     DAC8760_Latch_High (ch);

     exit_critical SECTION ();

     返回;
    }//结束 DAC8760_OUT_CRC */

    您可以看到、我发送的32位包含 CRC、DAC 没有相应地设置输出。

    当我不在 DAC 中启用 CRC、因此仅发送24位(来自不附加 CRC 的其他函数)时、它会很好地工作!! 除了 SPI 总线上的其他器件、它们在通过 SPI 总线或其他一些会导致 DAC 降低其输出的 Phenom 接收数据时、很可能会导致数据"不对齐"、 但这是我需要处理的另一个问题...首先是 CRC??

    上面的代码是否看起来应该正常工作?

    此致、

    Mike

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    既然您有特定于器件的查询、我将把该主题分配给负责此部件的同事 Garrett。

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

    我很难判断该代码是否能够根据 SPI 帧正确生成 CRC。 您能否提供您正在写入的 SPI 帧以及您的代码正在生成的相应8位 CRC? 如果您在一个图中提供了具有 SDO、SCLK 和 LATCH 的整个32位帧的示波器捕获、也会有所帮助。

    其他一些问题:

    1.您是否在配置寄存器中设置了 CRCEN 位?
    2.在写入32位帧后警报引脚是否变为低电平?
    3.您是否能够从 DAC 获得输出?

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

    对此进行了任何更新?

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

    您好、Garrett、是的、我在 DAC 中设置了 CRC 使能位、一旦该位被设置、我似乎就无法再与 IC 通信。 只要不启用 CRC、我就会获得输出并在通信方面没有任何问题。 我们对电路(SPI)进行了一些修改、从而使其他器件之一无法与 DAC 共享 SPI。 此后、我没有时间尝试 CRC。 也许我今天会有一些时间。 我会告诉你。 感谢你的帮助。 Mike

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

    您是否有机会在修改后再次尝试 CRC?

    谢谢、
    Garrett