0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

TPS929120的CRC校驗(yàn)的三種實(shí)現(xiàn)方法

冬至子 ? 來源:Auto FAE進(jìn)階之路 ? 作者:Yingming ? 2023-05-30 10:39 ? 次閱讀

最近在幫客戶編寫基于S32K144編寫TPS929120的軟件驅(qū)動時(shí),需要在發(fā)送數(shù)據(jù)的末端增加8bit的CRC校驗(yàn)碼。因?yàn)橹笆褂肊522.49時(shí),其數(shù)據(jù)手冊直接提供了自身CRC校驗(yàn)算法的代碼,而TPS929120的手冊只告知了算法的CRC多項(xiàng)式為 ,初始值為0xFF,所以代碼部分需要自己實(shí)現(xiàn)。

我查閱了TLD7002,BD18331,MPQ7225等LED Driver的數(shù)據(jù)手冊,都是采用的CRC校驗(yàn)算法,其中MPQ7225的CRC校驗(yàn)算法和TPS929120是一樣的。因?yàn)橹敖佑|CRC校驗(yàn)不多,特定將相關(guān)的學(xué)習(xí)過程記錄下來,方便后面有需要時(shí)快速完成其他廠家的LED Driver軟件驅(qū)動。

CRC基礎(chǔ)知識

這一章節(jié)主要介紹CRC概念和參數(shù)模型(來源于網(wǎng)絡(luò)

CRC概念

CRC(Cyclic Redundancy Checksum)是一種糾錯(cuò)技術(shù),代表循環(huán)冗余校驗(yàn)和。

數(shù)據(jù)通信領(lǐng)域中最常用的一種差錯(cuò)校驗(yàn)碼,其信息字段和校驗(yàn)字段長度可以任意指定,但要求通信雙方定義的CRC標(biāo)準(zhǔn)一致。主要用來檢測或校驗(yàn)數(shù)據(jù)傳輸或者保存后可能出現(xiàn)的錯(cuò)誤。它的使用方式可以說明如下圖所示:

在數(shù)據(jù)傳輸過程中,無論傳輸系統(tǒng)的設(shè)計(jì)再怎么完美,差錯(cuò)總會存在,這種差錯(cuò)可能會導(dǎo)致在鏈路上傳輸?shù)囊粋€(gè)或者多個(gè)幀被破壞(出現(xiàn)比特差錯(cuò),0變?yōu)?,或者1變?yōu)?),從而接受方接收到錯(cuò)誤的數(shù)據(jù)。

為盡量提高接受方收到數(shù)據(jù)的正確率,在接收方接收數(shù)據(jù)之前需要對數(shù)據(jù)進(jìn)行差錯(cuò)檢測,當(dāng)且僅當(dāng)檢測的結(jié)果為正確時(shí)接收方才真正收下數(shù)據(jù)。檢測的方式有多種,常見的有 奇偶校驗(yàn)因特網(wǎng)校驗(yàn)循環(huán)冗余校驗(yàn)等。

CRC參數(shù)模型

一個(gè)完整的CRC參數(shù)模型應(yīng)該包含以下信息WIDTH,POLY,INIT,REFIN,REFOUT,XOROUT 。

  • NAME :參數(shù)模型名稱。
  • WIDTH :寬度,即生成的CRC數(shù)據(jù)位寬,如CRC-8,生成的CRC為8位
  • POLY :十六進(jìn)制多項(xiàng)式,省略最高位1,如 ,二進(jìn)制為 1 0000 0111 ,省略最高位1,轉(zhuǎn)換為十六進(jìn)制為0x07。
  • INIT :CRC初始值,和WIDTH位寬一致。
  • REFIN :true或false,在進(jìn)行計(jì)算之前,原始數(shù)據(jù)是否翻轉(zhuǎn),如原始數(shù)據(jù):0x34 = 0011 0100 ,如果REFIN為true,進(jìn)行翻轉(zhuǎn)之后為0010 1100 = 0x2c
  • REFOUT :true或false,運(yùn)算完成之后,得到的CRC值是否進(jìn)行翻轉(zhuǎn),如計(jì)算得到的CRC值:0x97 = 1001 0111 ,如果REFOUT為true,進(jìn)行翻轉(zhuǎn)之后為11101001 = 0xE9。
  • XOROUT :計(jì)算結(jié)果與此參數(shù)進(jìn)行異或運(yùn)算后得到最終的CRC值,和WIDTH位寬一致。

通常如果只給了一個(gè)多項(xiàng)式,其他的沒有說明則: **INIT=0x00,REFIN=false,REFOUT=false,XOROUT=0x00** 。

TPS929120的CRC值計(jì)算方式

CRC參數(shù):

根據(jù)數(shù)據(jù)手冊,TPS929120選擇的是CRC多項(xiàng)式為 ,初始值為0xFF;所以POLY為0x31,INIT為FF。由于UART的數(shù)據(jù)傳輸是LSB(先傳輸?shù)臀唬?,所?strong>REFIN為True。綜上所述,TPS929120的CRC參數(shù)表為:

NAME = CRC_TPS929120
WIDTH = 8
POLY = 0x31 = 0011 0001(最高位1已經(jīng)省略)
INIT = 0xFF
XOROUT = 0x00
REFIN = TRUE
REFOUT = FALSE

算法圖:

TPS929120數(shù)據(jù)手冊提供了自身CRC校驗(yàn)的算法圖,如下所示:圖片

因?yàn)門PS929120要求第一個(gè)發(fā)送的數(shù)據(jù)0x55(用于同步)不參與計(jì)算,所以下面介紹的幾種計(jì)算方式都不會將0x55納入CRC計(jì)算范圍。

計(jì)算方法一:

方法一按照TPS929120提供的算法圖進(jìn)行實(shí)現(xiàn)。

計(jì)算步驟:

結(jié)合TPS929120數(shù)據(jù)手冊提供的算法圖,方法一的計(jì)算步驟如下所示:

1. 將0xFF作為CRC初始值。

2. 當(dāng)?shù)谝粋€(gè)輸入字節(jié)的Bit0到來時(shí),

   2.1 將初始值的Bit7和輸入值的Bit0進(jìn)行異或運(yùn)算,得到的值保留,記作Temp_Bit;

   2.2 將初始值的Bit6代替原本的Bit7;

   2.3 將初始值的Bit5代替原本的Bit62.4 將初始值的Bit4和Temp_Bit進(jìn)行異或運(yùn)算,使用得到的值代替原本的Bit5;

   2.5 將初始值的Bit3和Temp_Bit進(jìn)行異或運(yùn)算,使用得到的值代替原本的Bit42.6 將初始值的Bit2代替原本的Bit3;

   2.7 將初始值的Bit1代替原本的Bit22.8 將初始值的Bit0代替原本的Bit1;

   2.9 使用Temp_Bit代替原本的Bit0;

3. 第一個(gè)輸入字節(jié)的剩余7bit也是同樣的操作,然后得到第一個(gè)輸入字節(jié)的CRC值。

4. 第二個(gè)輸入字節(jié)到來,使用上一次計(jì)算得到的CRC值作為CRC初始值,重復(fù)2,3步驟。

5. 當(dāng)最后一個(gè)輸入字節(jié)計(jì)算完畢之后,就得到了最終的CRC校驗(yàn)值。

實(shí)現(xiàn)代碼為:

  • 單個(gè)字節(jié)的CRC值計(jì)算
#define BIT0 (0x01)
#define BIT1 (0x02)
#define BIT2 (0x04)
#define BIT3 (0x08)
#define BIT4 (0x10)
#define BIT5 (0x20)
#define BIT6 (0x40)
#define BIT7 (0x80)

unsigned int CRC_Calculation(unsigned int CRC_Initial, unsigned int Input_Data)
{
 unsigned int Temp_Bit, Input_Bit;
    /* store every bit value of Input_Data */
 unsigned int bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7;   
 /* store the Input_Data (byte) 's CRC */
    unsigned int CRC=0; 
    /* get every bit of CRC initial value */
 unsigned int i=0; bit0 = CRC_Initial & BIT0; 
    
 bit1 = (CRC_Initial & BIT1)>>1;
 bit2 = (CRC_Initial & BIT2)>>2;
 bit3 = (CRC_Initial & BIT3)>>3;
 bit4 = (CRC_Initial & BIT4)>>4;
 bit5 = (CRC_Initial & BIT5)>>5;
 bit6 = (CRC_Initial & BIT6)>>6;
 bit7 = (CRC_Initial & BIT7)>>7;
    
 for(i=0; i<8; i++)
 {
        /* extract one bit of Input Data (from LSB to MSB) */
  Input_Bit = (Input_Data >> i) & 0x01;
        /* Do Input_Bit XOR bit7 */
  Temp_Bit = Input_Bit ^ bit7; 
  bit7 = bit6;
  bit6 = bit5;
        /* Do bit4 XOR Temp_Bit */
  bit4 = bit4 ^ Temp_Bit; 
  bit5 = bit4;
        /* Do bit3 XOR Tmep_Bit */
  bit3 = bit3 ^ Temp_Bit; 
  bit4 = bit3;
  bit3 = bit2;
  bit2 = bit1;
  bit1 = bit0;
  bit0 = Temp_Bit;
 }
 
 CRC = (bit7<<7)|(bit6<<6)|(bit5<<5)|(bit4<<4)|(bit3<<3)|(bit2<<2)|(bit1<<1)|bit0;
 return CRC;
}
  • 命令幀的CRC值計(jì)算
unsigned int CRC(unsigned int commandFrame_withoutCRC[], unsigned int byteLength)
{
 unsigned int j;
   unsigned int CRCtemp;
   for(j=0; j

計(jì)算方法二:

Github上面有一套成熟的開源CRC算法,如下,

GitHub - whik/crc-lib-c: 基于C語言的CRC校驗(yàn)庫,包括常用的21個(gè)CRC參數(shù)模型實(shí)現(xiàn)^[1]^

參考其中的 CRC-8/MAXIM ,并根據(jù)TPS929120的CRC參數(shù)進(jìn)行微調(diào),得到的算法如下:

/* as UART transmit from LSB to MSB, 
 * invert the polynomial 0x31 (0011 0001) to 0x8C (1000 1100)
 */
#define polynomialINV 0x8C 
#define LSB 0x01

/* calculate CRC of command frame */
unsigned int CRC_LUT(unsigned int commandFrame_withoutCRC[], unsigned int byteLength) 
{
 unsigned int remainder, k, j;
    /* assign the initial value 0xFF */
 remainder = 0xFF; 
    /* the first SYNC byte not engage CRC calculation */
 for(k=1;k

計(jì)算方法三:

方法三在方法二的基礎(chǔ)上進(jìn)行優(yōu)化,將CRC的計(jì)算部分(如下圖)提前做成數(shù)組,涵蓋0-255的CRC計(jì)算結(jié)果,然后用到的時(shí)候直接查表。

for(i=0; i<8; i++)
 {
  if(remainder & LSB)
  {
            /* right shift 1 bit and do the XOR operation with 0x8C */
   remainder = (remainder>>1) ^ polynomialINV; 
  }
  else
  {
   remainder = remainder>>1;
  }
 }

最終的實(shí)現(xiàn)形式如下:

/* as UART transmit from LSB to MSB, 
 * invert the polynomial 0x31 (0011 0001) to 0x8C (1000 1100)
 */
#define polynomialINV 0x8C 
#define LSB 0x01
unsigned int crcArray[256];

/* calculate and store the CRC of data from 0x00 to 0xFF */
void crcInitial() 
{
 unsigned int k, j, remainder;
 for(k=0;k<256;k++)
 {
  remainder=k;
  for(j=8;j>0;j--)
  {
   if(remainder & LSB)
   { 
                /* right shift 1 bit and do the XOR operation with 0x8C */
    remainder = (remainder>>1) ^ polynomialINV; 
   }
   else
   {
    remainder = remainder>>1;
   }
  }
  crcArray[k]=remainder;
 }
}

/* calculate CRC of command frame */
unsigned int CRC_LUT(unsigned int commandFrame_withoutCRC[], unsigned int byteLength) 
{
 unsigned int remainder, tempData, k;
    /* assign the initial value 0xFF */
 remainder = 0xFF; 
    /* the first SYNC byte not engage CRC calculation */
 for(k=1;k

驗(yàn)證:

使用一個(gè)數(shù)組{0x55,0x80,0x61,0x00}進(jìn)行驗(yàn)證,其中0x55不參與CRC計(jì)算,以計(jì)算方法一為例,添加打印的mian函數(shù)如下:

#include 
int main()
{
 unsigned int data[4] = {0x55,0x80,0x61,0x00};
 unsigned int crc;

 for(int i = 0; i < 4; i++)
 {
  printf("%02x ", data[i]);
 }
 printf("\\n");
 crc = CRC(data,4);
 printf("Method 1:CRC result of TPS929120 is %02x\\n", crc);
 return 0;
}

使用在線C語言編譯器(菜鳥教程在線編輯器 (runoob.com) ^[2]^ )進(jìn)行驗(yàn)證,計(jì)算結(jié)果如下圖,為0x74:

圖片

使用在線CRC計(jì)算工具進(jìn)行驗(yàn)證,結(jié)果也是0x74:

圖片

使用TPS929120自帶的Excel形式的CRC計(jì)算工具進(jìn)行驗(yàn)證,結(jié)果也是0x74:

圖片

其他兩種方式經(jīng)過驗(yàn)證也是一樣的結(jié)果,有興趣的讀者可以使用在線C語言編輯器試一下。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7581

    瀏覽量

    135603
  • CRC校驗(yàn)
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    15166
  • UART接口
    +關(guān)注

    關(guān)注

    0

    文章

    124

    瀏覽量

    15236
  • S32k144
    +關(guān)注

    關(guān)注

    1

    文章

    6

    瀏覽量

    1870
收藏 人收藏

    評論

    相關(guān)推薦

    FPGA實(shí)現(xiàn)CRC校驗(yàn)

    最近在學(xué)習(xí)CRC校驗(yàn),根據(jù)生成多項(xiàng)式,通過編碼代碼實(shí)現(xiàn)CRC校驗(yàn),就是不知道怎么實(shí)現(xiàn),求
    發(fā)表于 01-05 16:17

    請問FPGA怎么實(shí)現(xiàn)CRC校驗(yàn)?

    最近在學(xué)習(xí)CRC校驗(yàn),根據(jù)生成多項(xiàng)式,通過編碼代碼實(shí)現(xiàn)CRC校驗(yàn),就是不知道怎么實(shí)現(xiàn),求
    發(fā)表于 05-21 02:21

    CRC校驗(yàn)方法通過CAN總線通信來實(shí)現(xiàn)

    檢測、格式錯(cuò)誤檢測、填充錯(cuò)誤檢測、應(yīng)答錯(cuò)誤檢測和CRC錯(cuò)誤檢測。作為一重要的錯(cuò)誤檢測手段,CRC錯(cuò)誤檢測是接收節(jié)點(diǎn)判斷CAN幀信息的完整性并向總線確認(rèn)應(yīng)答的依據(jù)。常見的校驗(yàn)方法1、最
    發(fā)表于 09-25 15:41

    40位以內(nèi)任意長度的CRC計(jì)算及校驗(yàn)實(shí)現(xiàn)

    論述了40位以內(nèi)任意長度的CRC計(jì)算及校驗(yàn)在TMS320C5000系列DSP中的實(shí)現(xiàn)方法。運(yùn)用該方法實(shí)
    發(fā)表于 05-05 20:31 ?1878次閱讀
    40位以內(nèi)任意長度的<b class='flag-5'>CRC</b>計(jì)算及<b class='flag-5'>校驗(yàn)</b>的<b class='flag-5'>實(shí)現(xiàn)</b>

    LTE系統(tǒng)的CRC校驗(yàn)算法及DSP實(shí)現(xiàn)

    通過對兩常用CRC校驗(yàn)算法的研究分析,為TD-LTE測試儀表系統(tǒng)選擇了一最優(yōu)的CRC校驗(yàn)算法
    發(fā)表于 02-23 14:58 ?30次下載

    crc校驗(yàn)基本原理

    本內(nèi)容介紹了crc校驗(yàn)基本原理,CRC幾個(gè)基本概念,CRC碼的生成步驟.CRC即循環(huán)冗余校驗(yàn)碼(
    發(fā)表于 12-21 16:55 ?4677次閱讀

    CRC校驗(yàn)碼算法的研究與實(shí)現(xiàn)

    為了提高實(shí)際通信中檢查信號傳輸錯(cuò)誤的能力,提高和推廣CRC校驗(yàn)技術(shù),本論文用邏輯代數(shù)知識、按模運(yùn)算、代數(shù)知識和C語言編程工具設(shè)計(jì)了幾種具體實(shí)用的CRC校驗(yàn)碼的計(jì)算
    發(fā)表于 05-28 15:41 ?0次下載

    crc校驗(yàn)原理_怎樣修復(fù)crc校驗(yàn)錯(cuò)誤

    crc校驗(yàn)原理 利用CRC進(jìn)行檢錯(cuò)的過程可簡單描述為:在發(fā)送端根據(jù)要傳送的k位二進(jìn)制碼序列,以一定的規(guī)則產(chǎn)生一個(gè)校驗(yàn)用的r位監(jiān)督碼(CRC
    發(fā)表于 09-05 09:26 ?3.5w次閱讀
    <b class='flag-5'>crc</b><b class='flag-5'>校驗(yàn)</b>原理_怎樣修復(fù)<b class='flag-5'>crc</b><b class='flag-5'>校驗(yàn)</b>錯(cuò)誤

    crc校驗(yàn)方法及示例

     CRC即循環(huán)冗余校驗(yàn)碼(Cyclic Redundancy Check[1] ):是數(shù)據(jù)通信領(lǐng)域中最常用的一查錯(cuò)校驗(yàn)碼,其特征是信息字段和校驗(yàn)
    發(fā)表于 12-04 09:35 ?1.5w次閱讀
    <b class='flag-5'>crc</b><b class='flag-5'>校驗(yàn)方法</b>及示例

    CRC校驗(yàn) 、STM32中CRC計(jì)算單元、 CRC應(yīng)用

    CRC校驗(yàn)、STM32中CRC計(jì)算單元、CRC應(yīng)用
    的頭像 發(fā)表于 03-04 13:54 ?5944次閱讀

    CRC校驗(yàn)碼并行計(jì)算的FPGA實(shí)現(xiàn)

    用軟件實(shí)現(xiàn) CRC 校驗(yàn)碼計(jì)算很難滿足高速數(shù)據(jù)通信的要求 ,基于硬件的實(shí)現(xiàn)方法中 ,有串行經(jīng)典算法 LFSR 電路 以及由軟件算法推導(dǎo)出來的
    發(fā)表于 03-28 09:34 ?30次下載
    <b class='flag-5'>CRC</b><b class='flag-5'>校驗(yàn)</b>碼并行計(jì)算的FPGA<b class='flag-5'>實(shí)現(xiàn)</b>

    CRC校驗(yàn)原理及實(shí)現(xiàn)

    作者:王超首發(fā):電子電路開發(fā)學(xué)習(xí)目錄前言CRC算法簡介CRC計(jì)算CRC校驗(yàn)CRC計(jì)算的C語言實(shí)現(xiàn)
    發(fā)表于 01-26 17:37 ?30次下載
    <b class='flag-5'>CRC</b><b class='flag-5'>校驗(yàn)</b>原理及<b class='flag-5'>實(shí)現(xiàn)</b>

    基于S32K144實(shí)現(xiàn)TPS929120的基本控制功能

    TPS929120是TI公司在2019年4月份發(fā)布的具有FlexWire接口的12通道汽車級40V高邊LED驅(qū)動芯片
    的頭像 發(fā)表于 05-30 10:49 ?4026次閱讀
    基于S32K144<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>TPS929120</b>的基本控制功能

    奇偶校驗(yàn)crc校驗(yàn)的區(qū)別 CRC校驗(yàn)和奇偶校驗(yàn)之間有什么關(guān)系?

    奇偶校驗(yàn)crc校驗(yàn)的區(qū)別 CRC校驗(yàn)和奇偶校驗(yàn)之間有什么關(guān)系? 奇偶
    的頭像 發(fā)表于 10-17 16:28 ?3158次閱讀

    CRC校驗(yàn)原理及其軟件實(shí)現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《CRC校驗(yàn)原理及其軟件實(shí)現(xiàn).pdf》資料免費(fèi)下載
    發(fā)表于 11-16 10:11 ?1次下載
    <b class='flag-5'>CRC</b><b class='flag-5'>校驗(yàn)</b>原理及其軟件<b class='flag-5'>實(shí)現(xiàn)</b>