王 爽
(中國電子科技集團(tuán)公司第四十七研究所,沈陽110032)
在對以CAN 總線作為現(xiàn)場總線進(jìn)行設(shè)備互聯(lián)的電路系統(tǒng)的設(shè)計中,為保證設(shè)備間數(shù)據(jù)傳輸?shù)恼_性,需要對CAN 網(wǎng)絡(luò)設(shè)備間通信過程傳輸?shù)膱笪臄?shù)據(jù)進(jìn)行差錯控制。為此,要在CAN 總線控制器的設(shè)計中加入了CRC(循環(huán)冗余)校驗邏輯設(shè)計。對于報文傳輸出現(xiàn)錯誤的情況,CAN 總線控制器采用的處理措施是反饋錯誤信息給發(fā)送端進(jìn)行報文重發(fā),即一旦收到接收端發(fā)出的出錯信息,發(fā)送端便自動重發(fā)。循環(huán)冗余校驗碼的工作原理簡單,誤判率較低,在CAN 總線通信系統(tǒng)中獲得了廣泛的應(yīng)用。故此對CAN 總線控制器中循環(huán)冗余校驗碼的設(shè)計原理和實現(xiàn)過程展開介紹。
在對CAN 總線控制器的設(shè)計中,CRC 校驗碼所起的作用是將發(fā)送端檢測到的報文二進(jìn)制序列作為一個二進(jìn)制多項式A(x)的系數(shù),將接收端檢測到的報文二進(jìn)制序列作為另一個二進(jìn)制多項式B(x)的系數(shù),若能夠正確接收,A(x)與B(x)應(yīng)完全相同。用該系數(shù)除以發(fā)送端和接收端共同使用的生成多項式g(x)后,將得到的余數(shù)p(x)作為CRC 校驗碼。隨后CAN 總線控制器的發(fā)送端將得到的CRC 校驗碼附加到報文中,一并發(fā)送給接收方。接收方再用同樣的g(x)去除收到的報文B(x),如果余數(shù)等于p(x),則傳輸正確(即A(x)和B(x)相同),否則判定傳輸過程中出錯,接收端發(fā)送出錯信息通知發(fā)送端重發(fā)報文,并重新開始CRC 校驗,直到傳輸報文正確為止。
在對CAN 總線控制器CRC 校驗邏輯的設(shè)計過程中,需要注意以下三個方面:
① CRC 校驗的計算采用的是模2(mod 2)運算法,不進(jìn)位亦不借位,實際上是被除的二進(jìn)制多項式與生成多項式兩個操作數(shù)的邏輯異或運算;
②將待處理報文組成的被除多項式A(x)左移n 位,即乘以 xn,n 為生成多項式 g(x)的最高冪值,空出的n 位用來存放CRC 計算的余數(shù)p(x),因此CAN總線控制器實際計算出的帶有CRC 校驗碼的報文序列為 A(x)·xn+p(x);
③生成多項式g(x)的首位和末位的系數(shù)必須為1。
CRC 校驗的工作原理如圖1所示。
圖1 CRC 碼檢錯工作原理圖
CAN 總線協(xié)議中規(guī)定了數(shù)據(jù)幀和遠(yuǎn)程幀兩種幀格式,其傳輸報文都會攜帶CRC 校驗數(shù)據(jù)隨同發(fā)送和校驗。數(shù)據(jù)幀由7 個不同的位域組成:幀起始、仲裁域、控制域、數(shù)據(jù)域、CRC 域、應(yīng)答確認(rèn)域、幀結(jié)尾[1]。遠(yuǎn)程幀比數(shù)據(jù)幀減少了數(shù)據(jù)域,相當(dāng)于數(shù)據(jù)長度為0。圖2 為CAN 總線數(shù)據(jù)幀/遠(yuǎn)程幀格式。
圖2 數(shù)據(jù)幀/遠(yuǎn)程幀格式
在數(shù)據(jù)收發(fā)的過程中,對由幀起始、仲裁場、控制場、數(shù)據(jù)場(遠(yuǎn)程幀無數(shù)據(jù)場)組成的位流進(jìn)行CRC 循環(huán)冗余校驗。CAN 協(xié)議規(guī)定,當(dāng)CAN 總線上連續(xù)出現(xiàn)5 個以上相同極性的數(shù)據(jù)時,在第5 位數(shù)據(jù)發(fā)送后,CAN 總線控制器自動填充一位相反極性的數(shù)據(jù)發(fā)送出去。該位即為填充位,用以避免CAN總線上長時間保持同一數(shù)據(jù)極性,確保區(qū)分錯誤幀和過載幀。在CAN 總線控制器的檢錯邏輯設(shè)計中,為進(jìn)行 CRC 計算,被除的多項式(A(x)、B(x))系數(shù)由幀起始、仲裁場、控制場、數(shù)據(jù)場(遠(yuǎn)程幀無數(shù)據(jù)場)部分的無填充位流給定。
CAN 總線協(xié)議中規(guī)定,CAN 總線控制器檢錯設(shè)計所采用的CRC 算法生成多項式[2]為g(x)=x15+x14+x10+x8+x7+x4+x3+1。CAN 總線控制器中采用的CRC 校驗多項式能夠校驗七級,它的檢錯能力很強(qiáng),誤判率極低,成為提高CAN 總線設(shè)備間數(shù)據(jù)傳輸正確性的有效保證手段。
被除的多項式(A(x)、B(x))被 g(x)多項式除(其系數(shù)以2 為模),得到此多項式除法的余數(shù)即為發(fā)送到CAN 總線上的CRC 序列。
CRC 校驗碼的RTL 代碼設(shè)計便于實現(xiàn),此處給出 CAN 總線控制器 CRC 碼的 verilogHDL 的 RTL級實現(xiàn)[3]。CAN 總線控制器的CRC 邏輯設(shè)計采用被除多項式由幀起始、仲裁場、控制場、數(shù)據(jù)場(假如有)部分的無填充位流構(gòu)成,生成多項式由第三節(jié)的g(x)給出,除法得到的余數(shù)就是發(fā)送到CAN 總線上的CRC 序列。這個多項式除法遵循模2 運算法則,不考慮進(jìn)位、借位,實際上是按位異或運算。為實現(xiàn)此功能,在CAN 總線控制器的CRC 邏輯設(shè)計中使用了15 位的移寄存器crc[14:0][4-6]。如果用datain 存放指示位流的下一位數(shù)據(jù),它從幀的起始到數(shù)據(jù)場末尾皆由無填充的位序列給定[7]。CAN 總線控制器CRC 檢錯邏輯的RTL 設(shè)計實現(xiàn)代碼如下:
CAN 總線控制器的CRC 檢錯邏輯設(shè)計完成后,將其與CAN 總線控制器的其他模塊設(shè)計進(jìn)行系統(tǒng)整合,并將其掛接到以Cortex-M3 為核心處理器的一款MCU 設(shè)計中,搭建仿真驗證平臺進(jìn)行功能仿真驗證[8-9]。圖3 為所設(shè)計的仿真驗證平臺,其中包括處理器內(nèi)核ARM Cortex-M3、flash 存儲器(用于存放測例程序)、CAN 總線控制器設(shè)計(其中包括被測單元CRC 檢錯設(shè)計)以及平臺激勵信號。
圖3 CRC 仿真驗證平臺
圖4 為CAN 總線控制器CRC 檢錯設(shè)計仿真波形圖。該例程發(fā)送的是一個標(biāo)準(zhǔn)格式的數(shù)據(jù)幀,標(biāo)識符id 序列為00111100010,發(fā)送數(shù)據(jù)字節(jié)長度為0100,發(fā)送數(shù)據(jù)為 0x12、0x34、0x56、0x78,通過 CRC檢錯單元計算得出的CRC 校驗碼為0x3a1c。通過仿真可以看出,發(fā)送方與接收方的CRC 計算結(jié)果相同,最后接收方成功接收到了正確的數(shù)據(jù)并通過校驗。圖中光標(biāo)所示的右側(cè)為開始發(fā)送CRC 序列,到go_rx_crc_lim 標(biāo)志結(jié)束。
圖4 CRC 仿真波形圖
通過對設(shè)計的研究與分析,完成CAN 總線控制器的CRC 檢錯邏輯設(shè)計,并將其集成在CAN 總線控制器中,驗證功能正確。由于CRC 校驗碼的檢錯能力強(qiáng),設(shè)計實現(xiàn)簡單,可廣泛應(yīng)用于各類電路的數(shù)據(jù)校驗設(shè)計中,用于提高數(shù)據(jù)傳輸可靠性。所提出的設(shè)計方法可直接應(yīng)用于其他串行數(shù)據(jù)的CRC檢錯邏輯設(shè)計中,具有一定的通用性。