CAN協(xié)議

前言

? ? 在做智能駕駛的公司實習(xí),有些協(xié)議是必會的。好記性不如爛筆頭,所以筆者開了一篇文章來記錄學(xué)習(xí)的過程,方便大家交流,也方便我自己復(fù)習(xí)。這篇文章總結(jié)一下我在公司學(xué)的第一個協(xié)議,CAN。CAN協(xié)議使用差分信號,通訊穩(wěn)定,而且錯誤診斷十分完備,安全性很高,因此廣泛應(yīng)用于汽車電子。這是我的第一篇文章,排版和敘述可能有些問題,大家將就看看。文末列了一些參考資料,寫得都比我好。


CAN的背景

????CAN-Controller Area Network,是德國公司Bosch在20世紀(jì)80年代初為了解決汽車中眾多控制單元和儀器之間的實時數(shù)據(jù)交換而開發(fā)的一種串行通信協(xié)議。

? ? 在使用CAN協(xié)議之前,汽車的各種器件之間連線雜亂,這種情況下也想要保持同步以及高效地傳輸數(shù)據(jù)比較困難和麻煩。如圖1:

? ? CAN協(xié)議采用總線型拓?fù)浞绞降木W(wǎng)絡(luò)。各單元作為總線上的節(jié)點分布,有序高效地讀取總線上的信息。我們都知道,總線型拓?fù)溆幸粋€問題需要解決——如何確保端用戶使用媒體發(fā)送數(shù)據(jù)時不能出現(xiàn)沖突?

? ? 此外,節(jié)點是怎么篩選信息的?重要的信息如何保證優(yōu)先級?以及如何保證信息不出錯,正確的傳達(dá)呢?我將在下面的內(nèi)容中,慢慢解答這些問題。


CAN的通信機(jī)制

????我們在這一節(jié)中,詳細(xì)介紹CAN的各種性質(zhì),并且回答上面我們提出的問題。大家也可以想一想,與我的總結(jié)相互印證。

雙線差分信號

? ? 首先,CAN的一個特性是采用雙線差分信號。其實,我不知道采用這種信號到底有什么好處,所以我去百度了。

? ? 一般情況下,我們把電壓1和0作為傳輸信號的手段。但實際上,這也是一種差分信號,只不過我們把“地”(GND)作為基準(zhǔn)信號。這種情況下,系統(tǒng)的精確度就依賴于“地”的一致性。信號源和信號接收器的“地”的電壓可能不同,所以在精度上無法得到保證。所以,采用雙線差分信號的一大優(yōu)點就顯現(xiàn)出來了。因為基準(zhǔn)電壓也可以得到控制,信號源和信號接收器的基準(zhǔn)電壓就一定是相同的,而且精度也可以得到保證。

????第二個優(yōu)點就是抗干擾能力強(qiáng)。傳統(tǒng)的電壓傳輸,“地”是不受干擾的,但是傳輸中的信號就會得到干擾,所以會出現(xiàn)錯誤。但是采用雙線差分信號,要干擾大家一起干擾,反正我們看的是差值,差值始終不受影響。

? ? 傳統(tǒng)傳輸網(wǎng)絡(luò)中只有0、1。但是,現(xiàn)在如果需要用到雙極信號。我們就要把電壓區(qū)間的一個任意值(一般是中點)看做是一個虛地(虛假的“地GND”)。高于這個值的是1,低于這個值的是-1。我們對地的要求就是要很穩(wěn)定。無形中就是要求整個電路很穩(wěn)定。但是雙線差分信號就完全沒有這樣的顧慮。這就是第三個優(yōu)點。不用電壓穩(wěn)定也能很穩(wěn)定地傳輸信號。要求降低了但是質(zhì)量不會降低。

????理解了雙線差分信號之后,我們就可以把它拋開了。我們就把它當(dāng)成是0 1就行了。(只是當(dāng)成是,實際上我們還是需要有雙線差分信號這個概念的。)我在后面的敘述中也用1,0 來代替雙線差分信號的隱性信號(1)和顯性信號(0)。

為什么顯性位是0,隱性位是1?

? ? 因為協(xié)議的制定者規(guī)定,ID越小,優(yōu)先級越高。所以小的要顯示出來。所以0是顯性位。

不限制節(jié)點數(shù)量,并可以動態(tài)改變節(jié)點數(shù)量

廣播發(fā)送報文

? ? 其實廣播發(fā)送報文是報文機(jī)制的基石。因為是廣播發(fā)送的,所以我們?他們才這么設(shè)計了CAN協(xié)議的報文結(jié)構(gòu)。而且各節(jié)點在發(fā)送報文的時候,不能有干擾。在CAN協(xié)議中使用的是載波偵聽多路訪問/沖突避免(CSMA/CA)的方法。節(jié)點在發(fā)送報文之前,先偵聽一下。如果有數(shù)據(jù)傳輸就不發(fā)送了,等著。否則,就立刻發(fā)送準(zhǔn)備好的數(shù)據(jù)。

多路訪問:各節(jié)點人人平等,并無高下(但是報文有啊),所以大家共用總線(而且都是廣播)。

沖突避免:一邊發(fā)著數(shù)據(jù),一邊要檢測,看看是不是別人也在發(fā),防止發(fā)生沖突,大家都白干活。

“回讀”機(jī)制:節(jié)點一邊發(fā),一邊還要檢查發(fā)的是不是對的。

????如果總線控制器發(fā)現(xiàn)ABC在同一時間發(fā)送報文。那到底是允許誰傳輸成功?優(yōu)先級怎么判斷呢?這里就必須提到報文的結(jié)構(gòu)了。如圖3、4:

? ? 報文的第一個結(jié)構(gòu)是幀起始。只占1位,顯性電平,標(biāo)志著數(shù)據(jù)幀和遠(yuǎn)程幀(遠(yuǎn)程幀的作用是向其他節(jié)點請求發(fā)送相同ID的數(shù)據(jù)幀)的起始。真正決定報文優(yōu)先級的是第二個結(jié)構(gòu)仲裁段。標(biāo)準(zhǔn)的報文,在仲裁段有12位,11位ID以及一位RTR(遠(yuǎn)程發(fā)送請求)。(RTR是區(qū)別數(shù)據(jù)幀和遠(yuǎn)程幀的標(biāo)志:顯性為數(shù)據(jù)幀,隱性為遠(yuǎn)程幀)上面提到,ABC都在發(fā),當(dāng)他們發(fā)了第一位,控制器開始仲裁(所以ID放在前面,根據(jù)ID進(jìn)行對比),如果一致就繼續(xù);如果不同的話,根據(jù)ID越小的優(yōu)先級越高,所以就把發(fā)出隱性信號的節(jié)點設(shè)置為【只聽】,禁止它繼續(xù)發(fā)出消息,然后發(fā)出顯性信號的節(jié)點繼續(xù)。這就是“線與”機(jī)制。不過等到總線再次空閑的時候,節(jié)點會再次嘗試進(jìn)行重發(fā)。

接收過濾器:各個節(jié)點都有,也是根據(jù)ID進(jìn)行判斷,比較ID與選擇器中和接收過濾相關(guān)位是否相同。存在一個掩碼,掩碼設(shè)置為1的位必須相同;為0則不用。

? ? 除此以外,CAN協(xié)議使用NRZ編碼。NRZ編碼確保報文緊湊,在相同帶寬下,NRZ編碼方式的信息量更大。但是NRZ有缺點,如果一長串的0或1會導(dǎo)致基線漂移,因為接收方會保持一個它所看到的信號的均值,通過均值區(qū)分高低電平。連續(xù)的0或1會導(dǎo)致均值改變,使檢測信號中很難出現(xiàn)明顯的變化。還有一個問題是,為了確保發(fā)送方和接收方同步需要有足夠的跳變沿。因此CAN協(xié)議還使用了位填充的方法。即在連續(xù)5個1或連續(xù)5個0后插入一個反位。那不僅減少了連續(xù)的1或0而且還增加了跳變沿的數(shù)量。保證了同步性。


幀的結(jié)構(gòu)

? ? 上面介紹了一部分的幀的結(jié)構(gòu)。下面完整地介紹一下。以下內(nèi)容參考文章:https://blog.csdn.net/sheweiwan/article/details/90413214

1.幀起始SOF

顯性位一位,表明幀的開始

2.仲裁段

????標(biāo)準(zhǔn)幀的仲裁段有12位,11位ID(序號是28-18)和1位的RTR。RTR是區(qū)別數(shù)據(jù)幀和遠(yuǎn)程幀的標(biāo)志:顯性為數(shù)據(jù)幀,隱性為遠(yuǎn)程幀。因此遠(yuǎn)程幀的優(yōu)先級是不如數(shù)據(jù)幀的。

? ? 擴(kuò)展幀的仲裁段有32位,前11位是ID,用SRR代替了RTR(所以SRR叫做代替遠(yuǎn)程請求位,隱性)因此,標(biāo)準(zhǔn)幀的優(yōu)先級比擴(kuò)展幀高。然后是IDE標(biāo)識符擴(kuò)展(區(qū)分標(biāo)準(zhǔn)幀和擴(kuò)展幀,標(biāo)準(zhǔn)幀的IDE=0,隱性)再次表明標(biāo)準(zhǔn)幀的優(yōu)先級,然后是擴(kuò)展ID有18位(序號是0-17),最后是RTR。

3.控制段

? ? 標(biāo)準(zhǔn)幀的控制段包含6位,前兩位為IDE、r位,IDE位不再贅述,r位是保留位,當(dāng)前置0,后面?是DLC位占4位,表示數(shù)據(jù)段的長度,單位是字節(jié)。DLC位有4bit,所以DLC的值是0-15,數(shù)據(jù)段的最大長度是0-8,但是9-15也不算錯誤,而是默認(rèn)為8。

? ? 擴(kuò)展幀的控制段也是6位,前兩位是r1、r0位,置0,后面是DLC位。

4.數(shù)據(jù)段

? ? 正如DLC位所表示的那樣,數(shù)據(jù)段的長度不定,共有0-64位。但是遠(yuǎn)程幀是沒有數(shù)據(jù)段的。

5.CRC段

? ? 共有16位,前15位是CRC位,然后?加一位DEL位。CRC位顧名思義,使用的是CRC循環(huán)校驗。發(fā)送節(jié)點根據(jù)發(fā)送的序列計算一個CRC,接收節(jié)點也根據(jù)接收的序列計算一個CRC,兩個比對一下,判斷數(shù)據(jù)幀是否有效。DEL位是界定符,固定為隱性位,在界定符之前使用位填充。

6.ACK段

? ? ACK段用于確認(rèn)報文被至少一個節(jié)點正確接收。共有兩位,第一位ACK位,接收節(jié)點正確接收之后用顯性覆蓋隱性,發(fā)送節(jié)點在回讀的時候讀到顯性證明報文被正確接收。第二位是DEL位同上。

7.幀結(jié)束

????最后是幀結(jié)束EOF共有7位,連續(xù)七個隱性位表示數(shù)據(jù)幀結(jié)束。

? ? 結(jié)束之后是ITM:三位,表示幀間空格,然后就可以繼續(xù)發(fā)送下一幀了。

????以上就是幀的結(jié)構(gòu),接下來就是幀的類型。


幀的類型

????根據(jù)幀的長度不同分為標(biāo)準(zhǔn)幀擴(kuò)展幀。區(qū)別我們上面說過了,而且標(biāo)準(zhǔn)幀的優(yōu)先級是高于擴(kuò)展幀的。

? ? 根據(jù)幀的用處不同還分為數(shù)據(jù)幀、遠(yuǎn)程幀、錯誤幀、超載幀幀間空間。? ??

數(shù)據(jù)幀:數(shù)據(jù)幀攜帶從發(fā)送節(jié)點到接受節(jié)點的數(shù)據(jù)。格式就是上面說過的格式。

遠(yuǎn)程幀:向其他節(jié)點申請具有同一ID的數(shù)據(jù)幀。和數(shù)據(jù)幀的區(qū)別就是沒有數(shù)據(jù)段。

錯誤幀:節(jié)點檢測到錯誤之后發(fā)送錯誤幀。因為CAN協(xié)議的錯誤偵測比較完備,安全性高,所以這個要詳細(xì)講。

超載幀:6個顯性位的超載標(biāo)志和8個隱性位的超載定界符。在先行的和后續(xù)的數(shù)據(jù)幀(或遠(yuǎn)程幀)之間附加一段延時,表示滿了,裝不下更多數(shù)據(jù)了,不要再發(fā)送了。

幀間空間:一個3位的ITM+任意位個隱性位,表示總線正處于空閑狀態(tài),如果是錯誤幀之后還可能有別的變化,我們在錯誤幀的詳細(xì)解釋中給出介紹。

錯誤檢測

? ? CAN協(xié)議有十分詳細(xì)的錯誤檢測手段。一共有5種錯誤,位錯誤、位填充錯誤、CRC錯誤、ACK錯誤和格式錯誤。

位錯誤:節(jié)點回讀的時候發(fā)現(xiàn)和自身發(fā)出的數(shù)值不同的位。不過仲裁或者ACK回讀時送出隱性位,而檢測到顯性位則不導(dǎo)致位錯誤。正如上文所言,仲裁時有線與機(jī)制,而ACK回讀時沒讀到顯性位才是有問題的。

位填充錯誤:在使用位填充的段(CRC界定符之前),不允許出現(xiàn)連續(xù)6個相同的電平位。例如:111111、000000。

CRC錯誤:發(fā)送節(jié)點的CRC序列和接收節(jié)點計算的CRC序列不同。

格式錯誤:固定格式位含有一個或更多非法位。例如:r0、r1固定置0,DEL固定為0,但被置為1,就產(chǎn)生錯誤了

ACK錯誤:位錯誤中提及,ACK回讀時沒讀到顯性位就是有錯。

? ? 位錯誤、填充錯誤、格式錯誤或者ACK錯誤,錯誤產(chǎn)生之后,在下一位發(fā)送錯誤標(biāo)志。而CRC錯誤的錯誤標(biāo)志在ACK界定符后發(fā)送,也就是EOF之前了。錯誤標(biāo)志分為主動錯誤標(biāo)志和被動錯誤標(biāo)志。那么,什么時候應(yīng)該發(fā)什么標(biāo)志?

錯誤界定

? ? 每個節(jié)點有兩個計數(shù)器,一個是REC接受錯誤計數(shù)器,一個是TEC發(fā)送錯誤計數(shù)器。發(fā)送錯誤是位錯誤、格式錯誤、ACK錯誤;接收錯誤是填充錯誤、格式錯誤、CRC錯誤。接收錯誤產(chǎn)生的時候,REC增加;反之,REC減少。TEC類似。REC和TEC的數(shù)值會引發(fā)節(jié)點狀態(tài)改變。

節(jié)點的三種狀態(tài)

1.主動錯誤

? ? REC和TEC都在0-127。這種狀態(tài)下,節(jié)點可以進(jìn)行正常的總線通信,錯誤產(chǎn)生時發(fā)送主動錯誤標(biāo)志(6個連續(xù)的顯性位)

2.被動錯誤

? ? REC或TEC≥128。這種狀態(tài)下,進(jìn)行受限制的總線通信,錯誤發(fā)生時發(fā)送被動錯誤標(biāo)志(6個連續(xù)的隱性位)

3.總線關(guān)閉(Bus Off)

? ? 節(jié)點禁止參與總線通信??梢杂捎脩羯暾埢謴?fù)通信(發(fā)送128個11位隱性位)。

? ? 主動錯誤狀態(tài)下和被動錯誤狀態(tài)根據(jù)成功傳輸和失敗傳輸改變REC和TEC進(jìn)行狀態(tài)的轉(zhuǎn)化。兩種狀態(tài)下發(fā)出的錯誤幀的格式也不一樣,主動錯誤標(biāo)志是6個顯性位,而被動錯誤標(biāo)志是6個隱性位。然后是錯誤標(biāo)志疊加,占據(jù)0-6個位,由于錯誤標(biāo)志違背了位填充的規(guī)則,所以別的節(jié)點會發(fā)送錯誤標(biāo)志,從而產(chǎn)生過了錯誤標(biāo)志疊加。最后一段是錯誤界定符,8位連續(xù)隱性位。節(jié)點發(fā)送錯誤標(biāo)志之后,監(jiān)聽總線,總線上出現(xiàn)隱性位后,節(jié)點發(fā)送剩下7個隱性位。


先寫這么多吧,后面還有時序系統(tǒng)過于復(fù)雜。我暫時也沒有理清楚。有緣再更新~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 CAN 總線對于汽車相當(dāng)于人的神經(jīng)系統(tǒng),其重要性不言而喻。所以懂一些CAN總線相關(guān)的知識對于汽車人來說是必不...
    勿人駕駛閱讀 329評論 0 0
  • 1、遵循ISO/OSI標(biāo)準(zhǔn)模型,CAN分為數(shù)據(jù)鏈路層(包括邏輯鏈路層LLC和媒體訪問控制層MAC;CAN2.0A中...
    醞錦閱讀 1,237評論 0 1
  • 一、com口(轉(zhuǎn)) 1、實物圖 2、介紹 COM口( cluster communication port)即串行...
    MakeSomeChange閱讀 4,393評論 0 0
  • 夜鶯2517閱讀 128,145評論 1 9
  • 版本:ios 1.2.1 亮點: 1.app角標(biāo)可以實時更新天氣溫度或選擇空氣質(zhì)量,建議處女座就不要選了,不然老想...
    我就是沉沉閱讀 7,440評論 1 6

友情鏈接更多精彩內(nèi)容