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.

[参考译文] CCS/BQ76940:BQ76940的示例代码

Guru**** 2526700 points
Other Parts Discussed in Thread: BQ76940

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/907791/ccs-bq76940-example-code-of-bq76940

器件型号:BQ76940

工具/软件:Code Composer Studio

尊敬的专家:

我的客户对 BQ76940 CRC 示例代码有一些疑问。  请参阅下面的蓝色粗体部分、CRC 和 PTR 之间将存在直接计算关系。 下面的红色粗体部分是否与下面的蓝色粗体部分具有相同的功能? (在此 CRC 示例代码中、CRC 是独立运行的、我找不到 CRC 与要发送 ptr 的数据之间的异或关系、或者这是我误解的吗?) 感谢您的支持。

  • CRC 示例代码:

unsigned char CRC8 (unsigned char * ptr、unsigned char len、unsigned char key)

           unsigned char i;

           unsigned char crc=0;

           while (len--!=0)

           {

                       对于(i=0x80;i!=0;i/=2)

                       {

                                   if ((CRC & 0x80)!= 0)

                                   {

                                               CRC *= 2;

                                               CRC ^= KEY;

                                   }

                                   其他

                                               CRC *= 2;

 

                                   if ((* ptr & i)!=0)//  

                                               CRC ^= KEY;

                       

                       PTR++;   

           }

           return (CRC);

  • 正常 CRC 二极管:

unsigned char CRC8 (unsigned char * ptr、unsigned char len、unsigned char key)

           unsigned char i;

           unsigned char crc=0;

      while (len-)

      {

        CRC ^=*PTR++; // 每次对需要计算的数据执行异或运算,计算将指向下一个数据*/  

         对于(i=8;i>0;--i)/*  ,以下计算过程与计算一个字节 CRC */相同  

         {  

           IF (CRC 和0x80)

             CRC =(CRC << 1)^ 0x31;

           其他

             CRC =(CRC << 1);

          }

      }

 

返回(CRC);  

----------------------

 

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

    您好、Minqi、

    此行将对键执行异或操作:

    CRC ^= KEY;

    它等效于 CRC = CRC ^ KEY;  

    "正常 CRC 代码"来自哪里? 我不确定这些函数将返回相同的结果。 我尝试使用此在线编译器在同一数据上同时使用这两种方法、结果不同。  https://www.onlinegdb.com/online_c_compiler

    以下是我用于在在线编译器中测试的代码:

    #include 
    unsigned char CRC8 (unsigned char * ptr、unsigned char len、unsigned char key)
    {
    unsigned char i;
    unsigned char crc=0;
    while (len--!=0)
    {
    对于(i=0x80;i!=0;i/=2)
    {
    if ((CRC & 0x80)!= 0)
    {
    CRC *= 2;
    CRC ^= KEY;
    }
    其他
    CRC *= 2;
    if ((* ptr & i)!=0)//
    CRC ^= KEY;
    }
    PTR++;
    }
    return (CRC);
    }
    
    unsigned char CRC8_norm (unsigned char * ptr、unsigned char len、unsigned char key)
    {
    unsigned char i;
    unsigned char crc=0;
    while (len-)
    {
    CRC ^=*PTR++;//每次对需要计算的数据执行异或运算,计算将指向下一个数据*/
    对于(i=8;i>0;--i)/*,以下计算过程与计算一个字节 CRC */相同
    {
    IF (CRC 和0x80)
    CRC =(CRC << 1)^ 0x31;
    其他
    CRC =(CRC << 1);
    }
    }
    返回(CRC);
    }
    
    int main()
    {
    
    unsigned char data1[6];
    Data1[0]= 0x31;
    Data1[1]= 0x49;
    Data1[2]= 0x55;
    unsigned int key = 0x107;
    
    printf ("data = 0x%.2x \n"、data1[0]);
    
    unsigned char crc1 = CRC8 (data1、3、key);
    
    printf ("crc1 = 0x%.2x \n"、crc1);
    
    unsigned char CRC2 = CRC8_NORM (data1、3、key);
    
    printf ("CRC2 = 0x%.2x \n"、CRC2);
    返回0;
    } 

    此致、

    Matt