1. 程式人生 > >CAN匯流排中迴圈冗餘校驗碼的原理

CAN匯流排中迴圈冗餘校驗碼的原理

在CAN系統中為保證報文傳輸的正確性,需要對通訊過程進行差錯控制。目前常用的方法是反饋重發,即一旦收到接收端發出的出錯資訊,傳送端便自動重發,此時的差錯控制只需要檢錯功能。常用的檢錯碼有兩類:奇偶校驗碼和迴圈冗餘校驗碼。奇偶校驗碼是一種最常見的檢錯碼,其實現方法簡單,但檢錯能力較差;迴圈冗餘校驗碼的編碼也很簡單且誤判率低,所以在通訊系統中獲得了廣泛的應用。下面介紹CAN網路中迴圈冗餘校驗碼(即CRC碼)的原理和實現方法。 1 CRC碼檢錯的工作原理          CRC碼檢錯是將被處理報文的位元序列當作一個二進位制多項式A(x)的係數,該係數除以傳送方和接收方預先約定好的生成多項式g(x)後,將求得的餘數p(x)作為CRC校驗碼附加到原始的報文上,並一起發給接收方。接收方用同樣的g(x)去除收到的報文B(x),如果餘數等於p(x),則傳輸無誤(此時A(x)和B(x)相同);否則傳輸過程中出錯,由傳送端重發,重新開始CRC校驗,直到無誤為止。         上述校驗過程中有幾點需注意:①在進行CRC計算時,採用二進位制(模2)運演算法,即加法不進位,減法不借位,其本質就是兩個運算元進行邏輯異或運算;②在進行CRC 計算前先將傳送報文所表示的多項式A(x)乘以xn,其中n為生成多項式g(x)的最高冪值。對二進位制乘法來講,A(x)·xn就是將A(x)左移n位,用來存放餘數(x),所以實際傳送的報文就變為A(x)·xn+p(x);③生成多項式g(x)的首位和最後一位的係數必須為1。圖1為CRC校驗的工作過程。

          目前已經有多種生成多項式被列入國際標準中,如:CRC-4、CRC-12、CRC-16、CCITT-16、CRC-32等。CAN匯流排中採用的生成多項式為g(x)=x15+x14+x10+x8+x7+x4+x3+1。可以看出,CAN匯流排中的CRC校驗採用的多項式能夠校驗七級,比一般CRC校驗(CRC-4、CRC-12、CRC-16等)的級數(二~五級)要高許多,因而它的檢錯能力很強,誤判率極低,成為提高資料傳輸質量的有效檢錯手段。

2 CRC序列計算方法

多項式g(x)除法的餘數就是傳送到總線上的CRC序列。為了實現這個功能,可以使用15位的移位暫存器----CRC_RG(14 : 0)。如果NXTBIT指示位流的下一位,那麼從幀的起始到資料末尾都由沒有填充的位順序給定。CRC序列的計算如下:

CRC_RG=0;                                             //初始化移位暫存器 REPEAT         CRCNXT = NXTBIT  EXOR  CRC_RG(14);        //異或運算         CRC_RG(14 : 1)= CRC_RG(13 : 0);     //暫存器左移1位         CRC_RG(0)=0;                IF CRCNXT THEN              CRC_RG(14 : 0)==CRC_RG(14 : 0)  EXOR   (4599hex);         ENDIF UNTIL   (CRC序列開始或有一錯誤條件)