01不安全的CAN總線
1、如何保證ECU接收到的數(shù)據(jù)是合法的?
比如ECU1接收ECU2發(fā)出的一幀0x100報(bào)文,協(xié)議層是不會(huì)區(qū)分是ECU1發(fā)的,還是非法接入OBD的CAN盒發(fā)的?如果ECU1接收到非ECU2發(fā)出的0x100報(bào)文豈不是很危險(xiǎn)?
2、ECU如何知道另一個(gè)節(jié)點(diǎn)掛死
比如ECU1還是接收ECU2發(fā)出的一幀0x100報(bào)文,但是由于某些神秘原因(程序跑飛了)導(dǎo)致ECU2掛死或者掉線,那ECU1如何知道此時(shí)的接收到0x100無(wú)效?
CAN通訊是一種廣播形式的通訊方式,自然協(xié)議層是無(wú)法做到數(shù)據(jù)合法性的校驗(yàn),這部分工作需要應(yīng)用層來(lái)完成。由此就出現(xiàn)了RollingCounter與Checksum。這兩個(gè)東西好像也是功能安全的一部分,本期只是介紹這兩個(gè)東西的原理,不對(duì)功能安全做過(guò)多討論。
一個(gè)規(guī)范的CAN矩陣協(xié)議,每一幀報(bào)文都會(huì)要求有這個(gè)兩個(gè)信號(hào)。如上圖,從bit52到bit55是RollingCounter,取值范圍0~15,ECU沒(méi)發(fā)一次自動(dòng)累加,滿15就歸零。從bit56到bit63(byte8)都是Checksum,取值范圍0x00~0xFF,用來(lái)表示該條報(bào)文的校驗(yàn)值。
對(duì)于判斷發(fā)送報(bào)文ECU有沒(méi)有掛死很簡(jiǎn)單,只要在接收端對(duì)RollingCounter進(jìn)行判斷,幾個(gè)周期內(nèi)協(xié)議棧上的buff沒(méi)有得到更新則就能判斷為節(jié)點(diǎn)異常。
對(duì)于報(bào)文合法性的判斷則就要負(fù)責(zé)得多,且會(huì)有各種花樣
車(chē)企制定的通訊協(xié)議時(shí),除了制定矩陣信號(hào)外,會(huì)規(guī)定Checksum的計(jì)算方法,比如這個(gè)是采用多項(xiàng)式的CRC校驗(yàn)算法。
并且規(guī)定出需要校驗(yàn)的數(shù)據(jù),有的是對(duì)矩陣的前7個(gè)byte進(jìn)行校驗(yàn),有的則要增加報(bào)文ID作為校驗(yàn)計(jì)算的輸入,各種花樣都有。
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * CRC8校驗(yàn)子程序0x1D(x8+x4+x3+x2+1) * * * * * * * * * * * * * * 參數(shù)1,uint8_t *data:需要計(jì)算的數(shù)據(jù) * * * * * * * * * * * * * 參數(shù)1,uint16_t len:需要計(jì)算的數(shù)據(jù)字節(jié)長(zhǎng)度 * * * * * * * * * * 返回值,uint8_t crc8:計(jì)算出的CRC值 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ uint8_t crc_8find(uint8_t *data, uint16_t len) { uint8_tcrc8=0x00; while( len-- ) { crc8 = crc_table[crc8 ^ *data]; data++; } return crc8; }
甚至貼心的給出校驗(yàn)計(jì)算的偽代碼,這函數(shù)寫(xiě)法C、C++應(yīng)該都可以直接運(yùn)行的。理解下上面的代碼!
當(dāng)ECU2發(fā)出0x100之前,會(huì)對(duì)RollingCounter累加,并且通過(guò)計(jì)算包含RollingCounter的前七個(gè)字節(jié)的CRC值,填充到數(shù)據(jù)域的第8個(gè)字節(jié);
ECU1接收到0x100的時(shí)候使用同樣的校驗(yàn)算法,計(jì)算數(shù)據(jù)域的前7個(gè)字節(jié),并且與第8個(gè)字節(jié)發(fā)送源計(jì)算的CRC值進(jìn)行比較。如果兩者相同,則數(shù)據(jù)合法。
02CANOE仿真
接下來(lái)在CANOE的CAPL進(jìn)行RollingCounter與Checksum的模擬
創(chuàng)建兩個(gè)ECU節(jié)點(diǎn),ECU1為發(fā)送節(jié)點(diǎn),ECU2為接收節(jié)點(diǎn)。ECU2會(huì)對(duì)ECU1的節(jié)點(diǎn)做Checksum,如果非法數(shù)據(jù)會(huì)在log窗口中打印出來(lái)。ECU1會(huì)而這個(gè)IG是用來(lái)模擬非法的數(shù)據(jù)發(fā)送。
int GetCrcChecksum (int crc_position ,message *data) { byte checksum; byte bitIndex; byte byteIndex; byte tdata; checksum = 0x00; for (byteIndex = DBLookup(data).dlc; byteIndex >= 1; byteIndex--) { if(byteIndex-1 != crc_position) { tdata = data.byte(byteIndex-1); } else { tdata = 0; } checksum ^= tdata; for (bitIndex = 0; bitIndex < 8; bitIndex++) { if ((checksum & 0x80) != 0) { checksum = (checksum << 1) ^ 0x1D; // cb_CRC_POLY: 0x1D } else { checksum = (checksum << 1); } } } checksum &= 0xFF; return (checksum); }
CAPL計(jì)算Checksum的函數(shù),在ECU1與ECU2里都存在
on timer Timer1 { Req.rollingCounter_0x100=LiveCount; Req.checksum_0x100=GetCrcChecksum(7,Req); output(Req); setTimer(Timer1,20); LiveCount=LiveCount+1; if(LiveCount==16) { LiveCount=0; }
ECU1的定時(shí)器函數(shù),發(fā)送前調(diào)用GetCrcChecksum函數(shù)生成Checksum
on message RCTest1 { if(this.checksum_0x100==GetCrcChecksum(7,this)) { Rep=this; }else { write("Invaild Message"); } }
ECU2接收事件中重新計(jì)算Checksum跟發(fā)送報(bào)文里的Checksum進(jìn)行比較,不同則拋出錯(cuò)誤
按F2,開(kāi)始仿真,可以監(jiān)控到ECU1發(fā)送出來(lái)的rollingCounter與Checksum
在Write窗口中打印ECU2接收到的數(shù)據(jù)
在IG節(jié)點(diǎn)設(shè)置一個(gè)非法的報(bào)文,rollingcounter與Checksum都設(shè)置0
對(duì)非法數(shù)據(jù)進(jìn)行拋出。
來(lái)源:古德曼汽車(chē)工業(yè)
審核編輯:湯梓紅
-
CAN總線
+關(guān)注
關(guān)注
145文章
1977瀏覽量
132414 -
仿真
+關(guān)注
關(guān)注
51文章
4250瀏覽量
135436 -
ecu
+關(guān)注
關(guān)注
14文章
923瀏覽量
55557 -
通訊協(xié)議
+關(guān)注
關(guān)注
10文章
285瀏覽量
20756
原文標(biāo)題:CAN總線報(bào)文數(shù)據(jù)一致性校驗(yàn)
文章出處:【微信號(hào):談思實(shí)驗(yàn)室,微信公眾號(hào):談思實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
CAN一致性測(cè)試內(nèi)容及解決方案

CANDT一致性測(cè)試系統(tǒng)發(fā)布 保障CAN總線安全
串行數(shù)據(jù)一致性測(cè)試和驗(yàn)證測(cè)量基礎(chǔ)知識(shí)
CAN一致性測(cè)試—容錯(cuò)性測(cè)試
如何解決stm32 H7 DMA串口發(fā)送數(shù)據(jù)一致性問(wèn)題?
VxWorks中主備數(shù)據(jù)一致性功能組件的設(shè)計(jì)與實(shí)現(xiàn)
VxWorks中主備數(shù)據(jù)一致性功能組件的設(shè)計(jì)與實(shí)現(xiàn)
VxWorks中主備數(shù)據(jù)一致性功能組件的設(shè)計(jì)與實(shí)現(xiàn)
P2P平臺(tái)上的數(shù)據(jù)一致性研究
電能質(zhì)量監(jiān)測(cè)數(shù)據(jù)一致性定義及檢測(cè)方法_邱麗羚
分布式系統(tǒng)的CAP和數(shù)據(jù)一致性模型
為什么主機(jī)廠愈來(lái)愈重視CAN一致性測(cè)試?

新品發(fā)布 | 同星智能正式推出CAN總線一致性測(cè)試系統(tǒng)

評(píng)論