概述
CAN總線是BOSCH公司發布的一款針對汽車電子的總線協議,主要用于汽車各部件之間的通信以及對各部件進行檢測。
1989年PHILIPS公司發布了CAN2.0標準
1991年ISO組織講CAN總線協議列為標準的現場總線協議ISO11898
第一章:
要了解CAN總線的知識,必須實現了解NRZ編碼,因為CAN總線的物理層使用的就是NRZ編碼。NRZ編碼的示例圖如下圖所示:

NRZ編碼
NRZ編碼存在的一個問題就是當連續傳輸n多個0或者n多個1時,發送者和接收者沒法進行同步。 NRZI 編碼(Non-Return-to-ZeroInverted Code)和 NRZ 的區別就是 NRZI 用信號的翻轉代表一個邏輯,信號保持不變代表另外一個邏輯。
USB 傳輸的編碼就是 NRZI 格式,在 USB 中,電平翻轉代表邏輯 0,電平不變代表邏輯1(NRZI 遇 0 翻轉,遇 1 不變):NRZI編碼如下圖所示: NRZI編碼 翻轉的信號本身可以作為一種通知機制,而且可以看到,即使把 NRZI 的波形完全翻轉,所代表的數據序列還是一樣的,對于像 USB 這種通過差分線來傳輸的信號尤其方便. 但是同樣,NRZ 和 NRZI 都沒有自同步特性,但是可以用一些特殊的技巧解決。比如,先發送一個同步頭,內容是 0101010 的方波,讓接受者通過這個同步頭計算出發送者的頻率,然后再用這個頻率來采樣之后的數據信號,就可以了。
在 USB 中,每個 USB 數據包,最開始都有個同步域(SYNC),這個域固定為 00000001,這個域通過 NRZI 編碼之后,就是一串方波(復習下前面:NRZI 遇 0 翻轉遇 1 不變),接受者可以用這個 SYNC 域來同步之后的數據信號。
此外,因為在USB的NRZI編碼下,邏輯0會造成電平翻轉,所以接受者在接受數據的同時,根據接收到的翻轉信號不斷調整同步頻率,保證數據傳輸正確.
但是,這樣還是會有一個問題,就是雖然接受者可以主動和發送者的頻率匹配,但是兩者之間總會有誤差。假如數據信號是1000個邏輯1,經過USB的NRZI編碼之后,就是很長一段沒有變化的電平,在這種情況下,即使接受者的頻率和發送者相差千分之一,就會造成把數據采樣成 1001 個或者999個1了。
USB 對這個問題的解決辦法,就是強制插 0,也就是傳說中bit-stuffing,如果要傳輸的數據中有7個連續的1,發送前就會在第6個1后面強制插入一個0,讓發送的信號強制出現翻轉,從而強制接受者進行頻率調整。接受者只要刪除6個連續1之后的0,就可以恢復原始的數據了。 而CAN協議當位流里有連續5個1或者連續5個0時,便在位流里插入一個補充位,而接收器則自動刪除這個補充位,換句話說,最長等待5個bit的時間,各節點就可以進行同步。需注意連續6個相同的位表示ERRORFLAG, bit-stuffing的示意圖如下所示:圖中白色的為填充位
位填充示意圖
關于NRZ編碼就介紹到這里。下面我們將介紹CAN2.0的規范 第二章 CAN2.0規范 CAN2.0規范分為A和B兩部分,其中A定義了標準幀,B定義了標準幀和擴展幀。 其中標準幀又分為四種: 數據幀 遠程幀 過載幀 錯誤幀 數據幀: 標準數據幀的格式如圖所示: 
標準數據幀示意圖 有圖可以看出數據幀由如下及部分組成: SOF 起始幀 ARBITRATIONFIELD 仲裁域 CTRLFIELD 控制域 DATAFIELD 數據域 CRC FIELD 校驗域 ACKFIELD 確認域 EOF 終止幀 數據域的長度可以為0 MESSAGE ID 用于尋址,它在總線網絡中是唯一的。CAN控制器一般都有一個驗收碼寄存器和驗收屏蔽寄存器,當接收到消息ID時,控制器檢查驗收寄存器為1的位有哪些,那么就不去判斷MESSAGEID的相應位,剩下的位如果和驗收寄存器的值相等,那么就接收該消息。 MESSAGE ID號越小表示優先級越高,多個節點同時發送數據時總線通過該域進行仲裁,傳輸優先級高的節點繼續傳輸,失去傳輸資格的節點在總線空閑時重新傳輸。仲裁的過程如下圖所示: 
CAN仲裁過程示意圖
如圖,仲裁采用的是按位仲裁的方式,誰的大值出現的早誰就先退出仲裁。 INTERMISSIONFIELD 用于區區分開兩個連續的幀 擴展數據幀的格式如下: 
兩種幀的區別在于CTRLFIELD 中的識別符擴展位(IDE)
遠程幀也分為兩種:標準幀和擴展展,他們與數據幀的區別在于:
遠程幀沒有數據域
RTR位為recessivebit
其它完全一樣。
錯誤幀只有當檢測到CAN標準定義的錯誤時產生錯誤幀,錯誤幀的位數有6-12BIT,錯誤幀的示意圖如下:

錯誤幀示意圖
過載幀
一般情況下,如下幾種情況會導致過載幀的出現
1、上次接收的數據幀未被CPU讀取,又來了新的數據幀
2、CAN節點檢測到幀間隔的第一位或者第二位為dominant位,在檢測到dominant位后馬上發出
3、CAN節點檢測到錯誤幀的界定域或者過載幀的界定域存在dominant位,在檢測到dominant位后馬上發出。
過載幀示意圖如下:

過載幀
暫時到這里,有了新的理解再持續更新
|