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