王 爽
(中國電子科技集團公司第四十七研究所,沈陽110032)
在對以CAN 總線作為現場總線進行設備互聯的電路系統的設計中,為保證設備間數據傳輸的正確性,需要對CAN 網絡設備間通信過程傳輸的報文數據進行差錯控制。為此,要在CAN 總線控制器的設計中加入了CRC(循環冗余)校驗邏輯設計。對于報文傳輸出現錯誤的情況,CAN 總線控制器采用的處理措施是反饋錯誤信息給發送端進行報文重發,即一旦收到接收端發出的出錯信息,發送端便自動重發。循環冗余校驗碼的工作原理簡單,誤判率較低,在CAN 總線通信系統中獲得了廣泛的應用。故此對CAN 總線控制器中循環冗余校驗碼的設計原理和實現過程展開介紹。
在對CAN 總線控制器的設計中,CRC 校驗碼所起的作用是將發送端檢測到的報文二進制序列作為一個二進制多項式A(x)的系數,將接收端檢測到的報文二進制序列作為另一個二進制多項式B(x)的系數,若能夠正確接收,A(x)與B(x)應完全相同。用該系數除以發送端和接收端共同使用的生成多項式g(x)后,將得到的余數p(x)作為CRC 校驗碼。隨后CAN 總線控制器的發送端將得到的CRC 校驗碼附加到報文中,一并發送給接收方。接收方再用同樣的g(x)去除收到的報文B(x),如果余數等于p(x),則傳輸正確(即A(x)和B(x)相同),否則判定傳輸過程中出錯,接收端發送出錯信息通知發送端重發報文,并重新開始CRC 校驗,直到傳輸報文正確為止。
在對CAN 總線控制器CRC 校驗邏輯的設計過程中,需要注意以下三個方面:
① CRC 校驗的計算采用的是模2(mod 2)運算法,不進位亦不借位,實際上是被除的二進制多項式與生成多項式兩個操作數的邏輯異或運算;
②將待處理報文組成的被除多項式A(x)左移n 位,即乘以 xn,n 為生成多項式 g(x)的最高冪值,空出的n 位用來存放CRC 計算的余數p(x),因此CAN總線控制器實際計算出的帶有CRC 校驗碼的報文序列為 A(x)·xn+p(x);
③生成多項式g(x)的首位和末位的系數必須為1。
CRC 校驗的工作原理如圖1所示。

圖1 CRC 碼檢錯工作原理圖
CAN 總線協議中規定了數據幀和遠程幀兩種幀格式,其傳輸報文都會攜帶CRC 校驗數據隨同發送和校驗。數據幀由7 個不同的位域組成:幀起始、仲裁域、控制域、數據域、CRC 域、應答確認域、幀結尾[1]。遠程幀比數據幀減少了數據域,相當于數據長度為0。圖2 為CAN 總線數據幀/遠程幀格式。

圖2 數據幀/遠程幀格式
在數據收發的過程中,對由幀起始、仲裁場、控制場、數據場(遠程幀無數據場)組成的位流進行CRC 循環冗余校驗。CAN 協議規定,當CAN 總線上連續出現5 個以上相同極性的數據時,在第5 位數據發送后,CAN 總線控制器自動填充一位相反極性的數據發送出去。該位即為填充位,用以避免CAN總線上長時間保持同一數據極性,確保區分錯誤幀和過載幀。在CAN 總線控制器的檢錯邏輯設計中,為進行 CRC 計算,被除的多項式(A(x)、B(x))系數由幀起始、仲裁場、控制場、數據場(遠程幀無數據場)部分的無填充位流給定。
CAN 總線協議中規定,CAN 總線控制器檢錯設計所采用的CRC 算法生成多項式[2]為g(x)=x15+x14+x10+x8+x7+x4+x3+1。CAN 總線控制器中采用的CRC 校驗多項式能夠校驗七級,它的檢錯能力很強,誤判率極低,成為提高CAN 總線設備間數據傳輸正確性的有效保證手段。
被除的多項式(A(x)、B(x))被 g(x)多項式除(其系數以2 為模),得到此多項式除法的余數即為發送到CAN 總線上的CRC 序列。
CRC 校驗碼的RTL 代碼設計便于實現,此處給出 CAN 總線控制器 CRC 碼的 verilogHDL 的 RTL級實現[3]。CAN 總線控制器的CRC 邏輯設計采用被除多項式由幀起始、仲裁場、控制場、數據場(假如有)部分的無填充位流構成,生成多項式由第三節的g(x)給出,除法得到的余數就是發送到CAN 總線上的CRC 序列。這個多項式除法遵循模2 運算法則,不考慮進位、借位,實際上是按位異或運算。為實現此功能,在CAN 總線控制器的CRC 邏輯設計中使用了15 位的移寄存器crc[14:0][4-6]。如果用datain 存放指示位流的下一位數據,它從幀的起始到數據場末尾皆由無填充的位序列給定[7]。CAN 總線控制器CRC 檢錯邏輯的RTL 設計實現代碼如下:


CAN 總線控制器的CRC 檢錯邏輯設計完成后,將其與CAN 總線控制器的其他模塊設計進行系統整合,并將其掛接到以Cortex-M3 為核心處理器的一款MCU 設計中,搭建仿真驗證平臺進行功能仿真驗證[8-9]。圖3 為所設計的仿真驗證平臺,其中包括處理器內核ARM Cortex-M3、flash 存儲器(用于存放測例程序)、CAN 總線控制器設計(其中包括被測單元CRC 檢錯設計)以及平臺激勵信號。

圖3 CRC 仿真驗證平臺
圖4 為CAN 總線控制器CRC 檢錯設計仿真波形圖。該例程發送的是一個標準格式的數據幀,標識符id 序列為00111100010,發送數據字節長度為0100,發送數據為 0x12、0x34、0x56、0x78,通過 CRC檢錯單元計算得出的CRC 校驗碼為0x3a1c。通過仿真可以看出,發送方與接收方的CRC 計算結果相同,最后接收方成功接收到了正確的數據并通過校驗。圖中光標所示的右側為開始發送CRC 序列,到go_rx_crc_lim 標志結束。

圖4 CRC 仿真波形圖
通過對設計的研究與分析,完成CAN 總線控制器的CRC 檢錯邏輯設計,并將其集成在CAN 總線控制器中,驗證功能正確。由于CRC 校驗碼的檢錯能力強,設計實現簡單,可廣泛應用于各類電路的數據校驗設計中,用于提高數據傳輸可靠性。所提出的設計方法可直接應用于其他串行數據的CRC檢錯邏輯設計中,具有一定的通用性。