CAN通訊協議(一)
目錄
前言
因為工作,需要研究CAN匯流排。博主的CAN學習參考正點原子和野火的教程。雖然沒有買板子,不過對於博主現在來說,感覺開發板都差不多吧!畢竟工作中開發板肯定是不一樣的!
CAN基礎知識介紹
CAN
是Controller Area Network
(控制器區域網絡)的縮寫,是ISO
國際標準化組織的序列通訊協議
。由德國電氣商博世公司在1986 年率先提出。此後,CAN
通過ISO11898
及ISO11519
進行了標準化。現在在歐洲已是汽車網路的標準協議。
CAN
協議經過ISO
標準化後有兩個標準:ISO11898
標準和ISO11519-2
ISO11898
是針對通訊速率為125Kbps~1Mbps
的高速通訊標準,而ISO11519-2
是針對通訊速率為125Kbps
以下的低速通訊標準。 CAN
具有很高的可靠性和良好的錯誤檢測能力,廣泛應用於汽車計算機控制系統和環境溫度惡劣/電磁輻射強及振動大的工業環境。 CAN
主要用在兩個裝置之間的通訊。
CAN的特點
- 多主控制。匯流排空閒時,所有單元都可傳送訊息,而兩個以上的單元同時傳送訊息時,根據識別符號(ID, 非地址)決定優先順序。兩個以上的單元同時開始傳送訊息時,對各訊息ID的每個位進行逐個仲裁比較。仲裁獲勝(優先順序最高)的單元可繼續傳送訊息,仲裁失利的單元則立即停止傳送而進行接收工作。
- 系統柔軟性。連線匯流排的單元,沒有類似”地址”的資訊。因此,在總線上新增單元時,以連線的其他單元的軟硬體和應用層都不需要做改變。
- 速度快,距離遠。最高1Mbps(距離<40m),最遠可達10KM(速率<5Kbps)。
CAN
物理層的形式主要分為閉環匯流排和開環匯流排,一個適合於高速通訊,一個適合於遠距離通訊(速度慢)。閉環通訊網路是一種高速、短距離網路,它的匯流排最大長度為40m,通訊速度最高1Mbps,匯流排的兩端各要求有一個”120歐”的電阻。開環匯流排網路是低速、遠距離網路,它的最大傳輸距離1km,最高通訊速率為125kbps,兩根匯流排是獨立的、不形成閉環,要求每根總線上各串聯有一個”2.2千歐”的電阻。 - 具有錯誤檢測/錯誤通知和錯誤恢復功能。所有單元都可以檢測錯誤(錯誤檢測功能),檢測出錯誤的單元會立即同時通知其他所有單元(錯誤通知功能),正在傳送訊息的單元一旦檢測出錯誤,會強制結束當前的傳送。強制結束髮送的單元會不斷反覆地重新發送次訊息直到成功傳送位置(錯誤恢復功能)。
- 故障封閉功能。CAN可以判斷出錯誤的型別是總線上資料錯誤(如外部噪聲等)還是持續的資料錯誤(如單元內部故障、驅動器故障、斷線等)。由此功能,當總線上發生次序資料錯誤時,可將引起此故障的單元從總線上隔離出去。
- 連線節點多。CAN匯流排可同時可同時連線多個單元。可連線的單元總數理論上是沒有限制的。但實際上可連線的單元受總線上的時間延遲及電氣負載的限制。降低通訊速度,可連線的單元數增加;提高通訊速度,則可連線的單元數減少。
正是因為CAN協議的這些特點,使得CAN特別適合工業過程監控裝置的互連,因此,越來越受到工業界的重視,並已公認為最有前途的現場匯流排之一。
物理層特徵
與I2C/SPI等具有始終訊號的同步通訊方式不同,CAN通訊兵不是以時鐘訊號來進行同步的,它是一種非同步通訊,只具有CAN_High
和CAN_Low
兩條訊號線,共同構成一組差分訊號線,以差分訊號的形式進行通訊。
CAN
控制器根據CAN_L
和CAN_H
上的電位差來判斷匯流排電平。匯流排電平分為顯性電平和隱形電平,二者比居其一。傳送方通過使匯流排電平發生變化,將訊息傳送給接收方。
顯性電平對應邏輯:0
CAN_High
的電平為3.5V,CAN_Low
線的電平為1.5V,CAN_H
和CAN_L
的電壓差為2V左右。
隱性電平對應邏輯:1
CAN_High
和CAN_Low
線上的電壓均為2.5v, CAN_H
和CAN_L
之間的電壓差為0V。
顯性電平具有優先權,只要有一個單元輸出顯性電平,總線上即為顯性電平。而隱形電平則具有包容的意味,只要所有的單元都輸出隱形電平,總線上才為隱形電平(顯性電平比隱形電平更強)。
通訊節點
CAN
總線上可以掛載多個通訊節點,節點之間的訊號經過匯流排傳輸,實現節點間通訊。由於CAN通訊協議不對節點進行地址編碼,而是對資料內容進行編碼,所以網路中的節點個數理論上不 受限制,只要匯流排的負載足夠即可,可以通過中繼器增強負載。
CAN通訊節點由一個CAN控制器及CAN收發器組成,控制器與收發器(電平轉換)之間通過CAN_Tx
及CAN_Rx
訊號線相連,收發器與CAN
匯流排之間使用CAN_High
及CAN_Low
訊號線相連。
當CAN
節點需要傳送資料時,控制器把要傳送的二進位制編碼通過CAN_Tx
線傳送到收發器,然後有收發器把這個普通的邏輯電平轉化為差分訊號,通過差分線CAN_High
和CAN_Low
線輸出到CAN
匯流排網路。而通過收發器接收總線上的資料到控制器時,則是相反的過程,收發器把總線上收到的CAN_High
及CAN_Low
訊號轉化為普通的邏輯電平訊號,通過CAN_Rx
輸出到控制器中。
由於CAN匯流排協議的物理層只有1對差分線,在一個時刻只能表示一個訊號,所以對通訊節點來說,CAN通訊是半雙工的,收發資料需要分時進行。在CAN的通訊網路中,因為共用匯流排,在整個網路中同一時刻只能有一個通訊節點發送訊號,其餘的節點在該時刻都只能接收。
波特率及位同步
由於CAN
屬於非同步通訊,沒有時鐘訊號線,連線在同一個匯流排網路中的各個節點會像串列埠通訊那樣,節點間使用約定好的波特率進行通訊,特別地,CAN
還會使用”位同步”的方式來抗干擾/吸收誤差,實現對匯流排電平訊號進行正確的取樣,確保通訊正常。
位時序分解
為了實現位同步,CAN
協議把每一個數據位的時序分解成SS
段,PTS
段,PBS1
段,PBS2
段,這四段的長度加起來即為一個CAN
資料位的長度。分解後最小的時間單位是Tq,而一個完整的位由8~25個Tq組成。
SS(SYNC SEG)
段
SS
段譯為同步段,若通訊節點檢測到總線上訊號的跳變被包含在SS
段的範圍之內,則表示節點與匯流排的時序是同步的,當節點與匯流排同步時,取樣點採集到的匯流排電平即可被確定為該位的電平。SS
段固定大小為1Tq。PTS
段(PROP SEG
)
PTS
段譯為傳播時間段,這個時間段是用於補償網路的物理延時時間。是總線上輸入比較器延時和輸出驅動器延時總和的兩倍。PTS
段的大小可以為1~8Tq。PBS1
段(PHASE SEG1
)
PBS1
譯為相位緩衝段,主要用來補償邊沿階段的誤差,它的時間長度在重新同步的時候可以加長。PBS1
段的初始大小可以為1~8Tq。PBS2
段(PHASE SEG2
)
PBS2
是另一個相位緩衝段,也是用來補償邊沿階段誤差的,它的時間長度在重新同步時可以縮短。PBS2
段的初始大小可以為2~8Tq。
訊號的取樣點位於PBS1
段與PBS2
段之間,通過控制各段的長度,可以對取樣點的位置進行偏移,以便準確地取樣。
波特率
總線上的各個通訊節點只要約定好1個Tq的時間長度(T)以及每一個數據位佔據多少個Tq(n),就可以確定CAN通訊的波特率。
幀種類介紹
CAN通訊以5種類型的幀進行:
資料幀:用於通訊節點向外傳送資料。
遙控幀:用於向遠端節點請求資料。
錯誤幀:用於向遠端節點通知校驗錯誤,請求重新發送上一個資料。
過載幀:用於通知遠端節點:本節點尚未做好接受準備。
間隔幀:用於將資料幀及遙控幀與前面的幀分離開來的幀。
資料幀介紹
- 幀開始
表示資料幀開始的段,SOT
段(Start Of Frame
),幀起始訊號只有一個數據位,是一個顯性電平(邏輯0),它用於通知各個節點將有資料傳輸,其他節點通過幀起始訊號的電平跳變沿來進行硬同步。 - 仲裁段
表示該幀優先順序的段,當同時有兩個報文被髮送時,匯流排會根據仲裁段的內容決定哪個資料包能被傳輸。仲裁段的內容主要為本資料幀的ID資訊(識別符號),資料幀具有標準格式和擴充套件格式兩種,區別在於ID資訊的長度,標準格式的ID為11位,擴充套件格式的ID格式為29位,它在標準ID的基礎上多出18位。
在CAN協議中,ID決定著資料幀傳送的優先順序,也決定著其他節點是否會接收這個資料幀。CAN協議不對掛載在它之上的節點分配優先順序和地址,對匯流排的佔有權是由資訊的重要性決定的,即對於重要的資訊,可給它打包上一個優先順序高的ID,使它能夠及時地傳送出去。
報文的優先順序(越小越高),是通過對ID的仲裁來確定的。根據前面的物理層的分析,如果總線上同時出現顯性電平和隱形電平,匯流排的狀態會被置為顯性電平,CAN正是利用這個特性進行仲裁。
仲裁段ID的優先順序也影響著接收裝置對報文的反應。因為在CAN總線上資料是以廣播的形式傳送的,所有連線到CAN匯流排的節點都會收到所有其他節點發出的有效資料,因而CAN控制器大多具有根據ID過濾報文的功能,它可以控制自己只接收某些ID的報文。 - 控制段
表示資料的位元組數及保留位的段 - 資料段
資料的內容,一幀可傳送0~8個位元組的資料,MSB先行 - CRC段
檢查幀的傳輸錯誤的段,CAN的報文包含一段15位的CRC校驗碼,一旦接收節點算出的CRC碼跟接收到的CRC碼不同,則它會向傳送節點反饋錯誤資訊,利用錯誤幀請求它重新發送。CRC部分的計算一般有CAN控制器硬體完成,出錯時的處理則由軟體控制最大重發數。
在CRC校驗碼之後,有一個CRC界定符,它為隱形位,主要作用是把CRC校驗碼與後面的ACK段間隔起來。 - ACK段
表示確認正常接收的段。ACK段包括一個ACK槽位,和ACK界定符位。在ACK槽位中,傳送節點發送的是隱性位,而接收節點則在這一位中傳送顯性位以示應答。在ACK和幀結束之間由ACK界定符間隔開。 - 幀結束
表示資料幀結束的段。幀結束段由傳送節點發送的7個隱形位表示結束。
總結
總體來說,博主先看了看正點原子的視訊與資料,感覺講的不夠詳細,而且對於博主個人而言,沒有學習動力。而野火的視訊教程中,剛開始給出了一個實驗現象,講的也比較詳細。記得以前對野火的影響不好,感覺正點原子的資料更為豐富些,不過CAN
教程感覺野火還是不錯的。