CAN總線一直以實時性強,、傳輸距離遠,、抗干擾能力強、數(shù)據(jù)保證到達等特點而廣泛應用于高可靠性的場合,。但常常在觀察CAN通信波形時,,我們會發(fā)現(xiàn)差分電平在ACK段突然增高,,這是什么原因?qū)е碌哪兀窟@里結(jié)合測試實例對ACK電平偏高的原因做簡單分析,。
一,、ACK簡介
ACK的作用:確認一幀報文是否正常接收。
以標準數(shù)椐幀為例,,從結(jié)構(gòu)上看分成7段,,分別為起始段,、仲裁段,、控制段、數(shù)椐段,、CRC校驗段,、ACK應答段,、幀結(jié)束段,如圖1所示:
圖1 標準數(shù)椐幀結(jié)構(gòu)
ACK段長度為2個位,,包含應答間隙(ACK SLOT)和應答界定符(ACK DELIMITER),。在應答場里,發(fā)送站發(fā)送兩個“隱性”位,。當接收器正確地接收到有效的報文,,接收器就會在應答間隙(ACK SLOT)期間(發(fā)送ACK信號)向發(fā)送器發(fā)送一“顯性”的位以示應答。如圖2 (CANScope測試的ACK段波形圖)所示:
圖2 ACK應答位結(jié)構(gòu)
應答間隙:所有接收到匹配CRC序列(CRC SEQUENCE)的節(jié)點會在應答間隙(ACK SLOT)期間用一“顯性”的位寫入發(fā)送器的“隱性”位來作出回答,,由于CAN總線線與的原理,,只要總線上有一個節(jié)點正確接收到數(shù)據(jù),則ACK SLOT就會被填入顯性電平,。
ACK界定符:ACK界定符是ACK場的第二個位,,并且是一個必須為“隱性”的位。因此,,應答間隙(ACK SLOT)被兩個“隱性”的位所包圍,,也就是CRC界定符(CRC DELIMITER)和ACK界定符(ACK DELIMITER)。
當一個接收節(jié)點接收的幀起始到CRC段之間的內(nèi)容沒發(fā)生錯誤時,,它將在ACK段發(fā)送一個顯性電平,。 如圖3所示:
圖3 ACK應答過程分析
二、CAN總線ACK電平偏高原因分析
以使用ZLG致遠電子CANScope測試某電車CAN網(wǎng)絡為例,,20多個CAN節(jié)點采樣手牽手方式組網(wǎng),,線兩端各接120歐電阻,通訊能夠正常,,但差分信號波形應答位電平偏高較多,,如圖4所示,從CANScope的波形圖中可以清楚的看到ACK電平突增,。
圖4 CAN數(shù)椐幀波形分析
CAN總線通信存在異常,,ACK應答有問題?——NO
分析如下:
首先,,我們看一款CAN收發(fā)器的典型內(nèi)部結(jié)構(gòu)圖,,CANH、CANL連接總線,。
圖5 CAN收發(fā)器的典型內(nèi)部結(jié)構(gòu)圖
總線顯性時(邏輯為0),,收發(fā)器內(nèi)部Q1、Q2導通,,CANH,、CANL之間產(chǎn)生壓差;隱性時(邏輯為1),,Q1,、Q2截止,,CANH、CANL處于無源狀態(tài),,壓差為0,。
按照標準,在總線輸出為顯性時,,CANH=3.5V,,CANL=1.5V,差分分電平:CANH-CANL=2V,,總線網(wǎng)絡電阻為60歐,,流經(jīng)終端電阻的電流約為33mA(2V/60歐);
然而,,CAN收發(fā)器在輸出顯性時,,CANH電平并不是標準的3.5V,而是5V(VCC)通過一個二極管降壓得到的,,二極管的壓降由負載電流決定,。圖6所示的VDH為CANH對應的二極管壓降,VDL為CANL對于的二極管壓降,,流過的電流越大,,二極管的壓降就越大??芍?/p>
CANH的電壓=5V-VDH CANL的電壓=0V+VDL
圖6 CAN收發(fā)器等效結(jié)構(gòu)
在CAN總線網(wǎng)絡中,,當一幀報文被各個節(jié)點接收時,在ACK階段,,多個CAN節(jié)點同時響應(都發(fā)顯性),,流過終端電阻的電流被各個CAN節(jié)點均分,那么平均到每個節(jié)點的電流就減小了,,如下圖所示,,VDH、VDL的壓降也減小,,相應CANH-CANL的差分電壓就增大了,,即ACK應答電平偏高。
圖7 CAN網(wǎng)絡等效結(jié)構(gòu)
三,、ACK的意義
當CAN總線上只有一個節(jié)點可收發(fā)數(shù)據(jù)時,,總線上因無接收節(jié)點在ACK SLOT時間內(nèi) 發(fā)送“顯性”位填充,而始終保持隱性,,發(fā)送者會檢測到這個隱性位而知道發(fā)送失敗,,此條報文需要重發(fā)。因此這個節(jié)點會一直重發(fā)數(shù)據(jù)直到發(fā)送成功或發(fā)送被取消。
當總線上有多個CAN節(jié)點組網(wǎng)通信時,,由于總線電平線與的原理,只要總線上有一個節(jié)點正確接收到數(shù)據(jù),,則ACK SLOT就會被填入顯性電平(此時認為數(shù)據(jù)幀發(fā)送成功), 那么,,接收錯誤的節(jié)點如何來告知發(fā)送者此次發(fā)送不成功呢?這就要用到CAN的錯誤幀,,當一個接收節(jié)點收到錯誤數(shù)據(jù)時,,它立即廣播發(fā)送一個錯誤幀,其它的節(jié)點和發(fā)送者也都會收到這個錯誤幀而丟掉此次報文,,發(fā)送節(jié)點重新發(fā)送,,這才是ACK的意義。