潘文卿,李國朋,張魯兵,鞠 敏
(濰柴動(dòng)力股份有限公司,山東 濰坊 261061)
在CAN通訊過程中CAN控制器具備完整的錯(cuò)誤檢測(cè)能力,其中包含:位錯(cuò)誤檢測(cè)、格式錯(cuò)誤檢測(cè)、填充錯(cuò)誤檢測(cè)、應(yīng)答錯(cuò)誤檢測(cè)和CRC錯(cuò)誤檢測(cè)。作為一種重要的錯(cuò)誤檢測(cè)手段,CRC錯(cuò)誤檢測(cè)是接收節(jié)點(diǎn)判斷CAN幀信息的完整性和正確性并向總線確認(rèn)應(yīng)答的依據(jù)。
2011年BOSCH首次發(fā)布了CANFD(CAN with Flexible Data rate)方案,在滿足CAN總線特性的基礎(chǔ)上升級(jí)了波特率和數(shù)據(jù)長度的兩大特性,在數(shù)據(jù)段傳輸時(shí)即可以提升速率又可以增加數(shù)據(jù)長度,最大可以一次傳輸64個(gè)字節(jié)的數(shù)據(jù),同時(shí)還可以提升數(shù)據(jù)段的傳輸速率,最大可以提升到5Mbps,如此一來,CANFD可以大大提升數(shù)據(jù)加載量和傳輸速率。同時(shí)CANFD還繼承了傳統(tǒng)CAN的主要特性,采用雙線串行通訊協(xié)議,非破壞性仲裁技術(shù),分布式實(shí)時(shí)控制,可靠的錯(cuò)誤處理和檢測(cè)機(jī)制,很好的繼承了CAN的特性并優(yōu)化了CAN總線最大只能傳輸8個(gè)字節(jié)數(shù)據(jù),傳輸速率最大只能到1Mbps的局限性??梢院芎玫慕鉀Q當(dāng)前整車智能化帶來的數(shù)據(jù)量急劇上升導(dǎo)致總線負(fù)載率過高,傳輸不穩(wěn)定的問題。CANFD可以理解成CAN協(xié)議的升級(jí)版,只是將協(xié)議升級(jí),物理層未作改變。CANFD可以向下兼容傳統(tǒng)CAN,由傳統(tǒng)CAN轉(zhuǎn)移到CANFD比較方便。
對(duì)比傳統(tǒng)CAN[1]協(xié)議,CAN與CANFD主要區(qū)別:傳輸速率有提升,數(shù)據(jù)長度有提升,幀格式不同。CAN協(xié)議最大傳輸速率是1Mbps,CANFD協(xié)議的仲裁段的最大傳輸速率也是1Mbps,只是數(shù)據(jù)段的最大傳輸速率提升到了5Mbps,為了更加穩(wěn)定的提升速率,CANFD協(xié)議的仲裁段和數(shù)據(jù)段的的傳輸速率一般保持1:1或者是1:2或者是1:4的提升數(shù)據(jù)段的速率,不然在傳輸過程中速率提升的太快會(huì)影響數(shù)據(jù)采集的有效性,造成大量錯(cuò)誤幀。
CANFD協(xié)議的幀結(jié)構(gòu)特點(diǎn)如圖1所示:
1)CAN與CANFD使用相同的SOF標(biāo)志位來標(biāo)識(shí)報(bào)文的起始。幀起始由1個(gè)顯性位構(gòu)成,標(biāo)識(shí)著報(bào)文的開始,并在總線上起著同步作用。
2)CANFD協(xié)議不支持遠(yuǎn)程幀,所以原來RTR遠(yuǎn)程傳輸請(qǐng)求位用SRR遠(yuǎn)程請(qǐng)求替換位替代,并且始終為顯性位’0’。
3)CANFD與CAN有著相同過的標(biāo)識(shí)符擴(kuò)展位IDE位,當(dāng)IDE位為顯性位0的時(shí)候表示ID長度是11bits的標(biāo)準(zhǔn)幀,當(dāng)IDE位為隱形位1的時(shí)候表示ID長度是29bits的擴(kuò)展幀。
4)為了區(qū)分CANFD與CAN,CANFD幀結(jié)構(gòu)中增加了FDF(FD Format)位,為0表示傳統(tǒng)CAN協(xié)議;為1表示CANFD協(xié)議。
5)CANFD最顯著的特征就是數(shù)據(jù)段可以提升傳輸速率,在CANFD仲裁場(chǎng)增加BRS(Bit Rate Switch)位速率轉(zhuǎn)換開關(guān)位,為隱形位1時(shí)表示進(jìn)行速率切換,發(fā)送節(jié)點(diǎn)在BRS位時(shí)將會(huì)切換到高速傳輸?shù)牟ㄌ芈剩渌邮展?jié)點(diǎn)也必須轉(zhuǎn)換對(duì)應(yīng)的波特率。在CRC界定符的采樣點(diǎn),所有節(jié)點(diǎn)的波特率再切換回仲裁場(chǎng)的波特率;當(dāng)BRS位為顯性0時(shí)表示不進(jìn)行速率切換。
6)CANFD最大可傳輸64字節(jié)的數(shù)據(jù),所以原來4個(gè)字節(jié)的DLC(Data Length Code)需要重新編碼即支持傳統(tǒng)CAN的0到8個(gè)字節(jié),也要支持最大64個(gè)字節(jié)的CANFD,數(shù)據(jù)長度可以從0到8,12,16,20,24,32,48,64字節(jié)中選擇,具體編碼方式如表1所示,CANFD的長度只能是表中顯示的長度,不隨意指定數(shù)據(jù)長度,例如30個(gè)字節(jié)是不支持的。
表1 CAN&CANFD DLC編碼表
7)CRC(Cyclic Redundancy Check)校驗(yàn)在傳統(tǒng)CAN的基礎(chǔ)上進(jìn)行了升級(jí),如果數(shù)據(jù)段的長度大于16個(gè)字節(jié)時(shí),CRC的長度為21bits,小于等于16個(gè)字節(jié)時(shí),CRC的長度是17bits, CANFD對(duì)CRC算法做了改變。在校驗(yàn)和部分從第一位開始每4bits添加一個(gè)填充位加以分割,這個(gè)填充位的值是上一位的反碼。
8)ESI(Error State Indicator)錯(cuò)誤知識(shí)狀態(tài)位,為顯性位0時(shí)表示CANFD節(jié)點(diǎn)處于主動(dòng)報(bào)錯(cuò)狀態(tài),為隱性位1時(shí)表示CANFD節(jié)點(diǎn)處于被動(dòng)報(bào)錯(cuò)狀態(tài)[2]。通過ESI位,所有節(jié)點(diǎn)都可以確認(rèn)當(dāng)前的傳輸節(jié)點(diǎn)的錯(cuò)誤狀態(tài)。而在傳統(tǒng)CAN幀中,無法得知其傳輸節(jié)點(diǎn)的錯(cuò)誤狀態(tài)。
9)EOF(End of Frame)幀結(jié)束,7個(gè)隱性位。如果某一位編號(hào)下出現(xiàn)一個(gè)顯性電平:[第1-6位]發(fā)送器或接收器檢測(cè)到一個(gè)幀結(jié)構(gòu)錯(cuò)誤。此時(shí)接收器丟棄該幀,同時(shí)產(chǎn)生一個(gè)錯(cuò)誤標(biāo)記(接收節(jié)點(diǎn)CAN控制器處于錯(cuò)誤主動(dòng)狀態(tài),則產(chǎn)生顯性錯(cuò)誤幀;如果處于錯(cuò)誤被動(dòng)狀態(tài),則產(chǎn)生隱性錯(cuò)誤幀)。如果是顯性錯(cuò)誤幀,則發(fā)送器重新發(fā)送該幀。[第7位]該位對(duì)于接收器有效,但對(duì)于發(fā)送器無效。如果此位出現(xiàn)顯性錯(cuò)誤幀,則接收器已經(jīng)把報(bào)文接收成功,而發(fā)送器又重新發(fā)送,則該幀就被接收器接收兩次,這時(shí)就需要由高層協(xié)議來處理。
CRC即冗余校驗(yàn)碼(Cyclic Redundancy Check):是數(shù)據(jù)通信領(lǐng)域中最常用的一種差錯(cuò)校驗(yàn)碼,其特征是信息字段和校驗(yàn)字段的長度可以任意選定。循環(huán)冗余檢查(CRC)是一種數(shù)據(jù)傳輸檢錯(cuò)功能,對(duì)數(shù)據(jù)進(jìn)行多項(xiàng)式計(jì)算,并將得到的結(jié)果附在幀的后面,接收設(shè)備也執(zhí)行同樣的算法,以保證數(shù)據(jù)傳輸?shù)恼_性和完整性。
CRC檢驗(yàn)算法是基于一個(gè)多項(xiàng)式除法取余的結(jié)果,根據(jù)位數(shù)的需要和多項(xiàng)式的變化有數(shù)十種版本,該算法硬件實(shí)現(xiàn)簡單,位反轉(zhuǎn)偵錯(cuò)能力較強(qiáng)及運(yùn)算量適中,被廣泛應(yīng)用與數(shù)字網(wǎng)絡(luò)傳輸及數(shù)據(jù)存儲(chǔ)領(lǐng)域。
一個(gè)傳統(tǒng)CAN幀結(jié)構(gòu)中,CRC域放置在數(shù)據(jù)結(jié)束后應(yīng)答檢測(cè)之前,如圖2所示。對(duì)于CANFD也是同樣的位置,該信息對(duì)于用戶應(yīng)用界面來說是不可見的,可通過CANscope總線分析儀解碼窗口或者示波器從總線波形上得到對(duì)應(yīng)的CRC數(shù)據(jù)展示。
CANFD幀結(jié)構(gòu)中,CRC域在同樣的位置,并且CRC的長度隨著數(shù)據(jù)域的長度變化分為17位和21位的校驗(yàn),CRC采用一種固定填充位的格式:在CRC段第一位及接下來的每四位增加一個(gè)固定填充位,填充位的值為上一位的反碼。
如圖3和圖4分別展示CRC17和CRC21的固定填充位FSB位置。
除了固定填充位之外和CRC計(jì)算位外,CRC域的起始還包含了3位的填充位計(jì)數(shù),及1位填充位計(jì)數(shù)檢驗(yàn)位,以此四個(gè)位的加入來進(jìn)一步提高通訊可靠性。填充位計(jì)數(shù)在CRC段的位置如圖5紅框所示。
3位填充位計(jì)數(shù)表示的值為實(shí)際填充位計(jì)數(shù)對(duì)8取模的結(jié)果,采用格雷碼顯示。奇偶校驗(yàn)位對(duì)填充位計(jì)數(shù)進(jìn)行奇偶校驗(yàn),即1的個(gè)數(shù)是奇數(shù)時(shí),奇偶校驗(yàn)位的值位1,反之為0。詳見表2。
表2 填充位計(jì)數(shù)
傳統(tǒng)CAN采用的是15位的CRC多項(xiàng)式校驗(yàn),由于CANFD支持更大的數(shù)據(jù)量,為提高通訊可靠性,針對(duì)不同數(shù)據(jù)長度的CANFD報(bào)文,調(diào)整其CRC算法,詳見表3。當(dāng)報(bào)文為傳統(tǒng)CAN時(shí),仍采用原有的CRC多項(xiàng)式校驗(yàn)。當(dāng)報(bào)文為CANFD且數(shù)據(jù)長度小于等于16字節(jié)時(shí),調(diào)整為17位的CRC多項(xiàng)式校驗(yàn)。當(dāng)報(bào)文為CANFD且數(shù)據(jù)長度大于16字節(jié)時(shí),則調(diào)整為21位的CRC多項(xiàng)式校驗(yàn)。根據(jù)CANFD報(bào)文的數(shù)據(jù)長度自動(dòng)調(diào)整CRC多項(xiàng)式的算法,可以提高通訊數(shù)據(jù)安全校驗(yàn)的可靠性。
表3 CRC多項(xiàng)式
在傳統(tǒng)CAN中,連續(xù)5位相同位后會(huì)填充一位相反位,并且在CRC計(jì)算之后進(jìn)行填充。當(dāng)CAN控制器發(fā)送報(bào)文時(shí),先對(duì)報(bào)文進(jìn)行CRC計(jì)算,然后再按照填充位原則填入填充位發(fā)送;在接收節(jié)點(diǎn)接收?qǐng)?bào)文時(shí),則對(duì)接收數(shù)據(jù)先根據(jù)位填充的原則移除填充位后,再做CRC校驗(yàn)。
在CANFD中,CRC計(jì)算的時(shí)機(jī)調(diào)整為位填充后,位填充原則同樣為連續(xù)5個(gè)相同會(huì)后填充一個(gè)相反位,發(fā)送節(jié)點(diǎn)發(fā)送報(bào)文時(shí),先對(duì)報(bào)文按照位填充原則進(jìn)行位的填充,再做CRC計(jì)算。這種方式增加了對(duì)填充位的CRC計(jì)算,提高了位校驗(yàn)可靠性,降低了錯(cuò)誤漏檢的概率。
CANFD對(duì)CRC算法進(jìn)行了改進(jìn),CRC對(duì)填充位也加入了計(jì)算。在CRC域的校驗(yàn)和部分為避免連續(xù)相同位超過6個(gè),就確定在第一位以及以后每4位添加一個(gè)填充位加以分隔,這個(gè)填充位的值是上一位的反碼,作為格式檢查,如果填充位不是上一位的反碼,就作錯(cuò)誤處理。
CAN幀基于CRC多項(xiàng)式的安全校驗(yàn)是發(fā)送節(jié)點(diǎn)根據(jù)發(fā)送的位計(jì)算校驗(yàn)值,并在CAN幀結(jié)構(gòu)CRC字段中提供該結(jié)果。接收節(jié)點(diǎn)使用相同的多項(xiàng)式來計(jì)算總線上所見位的校驗(yàn)值,將自我計(jì)算的校驗(yàn)值與接收的校驗(yàn)值進(jìn)行比較,如果匹配,則認(rèn)為被正確接收,接收節(jié)點(diǎn)在ACK時(shí)隙中發(fā)送顯性狀態(tài),從而覆蓋發(fā)送器的隱形狀態(tài)。在不匹配的情況下,接收節(jié)點(diǎn)在ACK定界符之后發(fā)送錯(cuò)誤幀。
CANFD的控制器CRC校驗(yàn)實(shí)現(xiàn)過程會(huì)相對(duì)復(fù)雜一些,在一個(gè)CAN總線網(wǎng)絡(luò)中,幀起始被檢測(cè)到后所有的節(jié)點(diǎn)開始使用三組多項(xiàng)式同步計(jì)算CRC序列,其中也包含發(fā)送節(jié)點(diǎn),由于CRC的計(jì)算受CAN幀類型和DLC長度影響,直到CAN幀的控制域以及DLC確認(rèn)后才選擇采用對(duì)應(yīng)的多項(xiàng)式生成CRC序列,最終生成的 CRC序列會(huì)填充在幀結(jié)構(gòu)中CRC字段,用于發(fā)送和接收節(jié)點(diǎn)進(jìn)行比較判定該報(bào)文是否被正確完整發(fā)送和接收。
CANFD協(xié)議相較于傳統(tǒng)CAN有更高的傳輸速率,有更大的數(shù)據(jù)帶寬,CANFD協(xié)議在仲裁場(chǎng)和數(shù)據(jù)場(chǎng)進(jìn)行切換,在數(shù)據(jù)段增加數(shù)據(jù)長度,在傳輸?shù)倪^程中需要更高效更準(zhǔn)確的校驗(yàn)機(jī)制來保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性。所有基于CANFD協(xié)議的CRC校驗(yàn)機(jī)制相較于傳統(tǒng)CAN有相應(yīng)的升級(jí)以保證傳輸過程中數(shù)據(jù)的完整性和正確性,能有效防止物理層傳輸錯(cuò)誤,CANFD因?yàn)閿?shù)據(jù)段是可以變速率并且數(shù)據(jù)段的長度也是可變的,所以CRC校驗(yàn)會(huì)更為復(fù)雜一些會(huì)根據(jù)數(shù)據(jù)長度的不同,更換CRC校驗(yàn)多項(xiàng)式,同時(shí)增加了填充域,采用格雷碼校驗(yàn)和奇偶校驗(yàn)的形式保證位填充的正確性,為數(shù)據(jù)傳輸?shù)臏?zhǔn)確性添加了雙重保險(xiǎn)。CRC校驗(yàn)用戶在應(yīng)用場(chǎng)景下是看不到的,完整的有效的校驗(yàn)機(jī)制可以讓用戶界面不需要額外關(guān)注幀傳輸數(shù)據(jù)的正確性。