《STM32從零開始學習歷程》@EnzoReventon
CAN通訊協議協議層
相關鏈接:
《STM32從零開始學習歷程》——CAN通訊協議物理層
CAN-bus規范 V2.0版本
CAN總線入門
周立功-CAN協議中文版
參考資料:
[野火EmbedFire]《STM32庫開發實戰指南——基于野火霸天虎開發板》
[正點原子]STM32F4開發指南-庫函式版本_V1.2
[ST]《STM32F4xx中文參考手冊》
CAN-bus規范 V2.0版本
CAN總線入門
周立功-CAN協議中文版
CAN的波特率及位同步
由于CAN屬于異步通訊,沒有時鐘信號線,連接在同一個總線網路中的各個節點會像串口異步通訊那樣,節點間使用約定好的波特率進行通訊,特別地,CAN還會使用“位同步”的方式來抗干擾、吸收誤差,實作對總線電平信號進行正確的采樣,確保通訊正常,
位時許分解
- 為了實作位同步,CAN協議把每一個資料位的時序分解成SS段、PTS段、PBS1段、PBS2段,
- 這四段的長度加起來即為一個CAN資料位的長度,
- 分解后最小的時間單位是Tq,
- 一個完整的位由8~25個Tq組成,

- 上圖中表示的CAN通訊信號每一個資料位的長度為19Tq,
- 其中SS段占1Tq,PTS段占6Tq,PBS1段占5Tq,PBS2段占7Tq,
- 信號的采樣點位于PBS1段與PBS2段之間,通過控制各段的長度,可以對采樣點的位置進行偏移,以便準確地采樣,
SS段(SYNC SEG):
SS譯為同步段,若通訊節點檢測到總線上信號的跳變沿被包含在SS段的范圍之內,則表示節點與總線的時序是同步的,當節點與總線同步時,采樣點采集到的總線電平即可被確定為該位的電平,SS段的大小固定為1Tq,
PTS段(PROP SEG):
PTS譯為傳播時間段,這個時間段是用于補償網路的物理延時時間,是總線上輸入比較器延時和輸出驅動器延時總和的兩倍,PTS段的大小可以為1~8Tq,主要用來產生偏移來控制采樣點,采樣點一般控制在時許的70%左右即可,
PBS1段(PHASE SEG1):
PBS1譯為相位緩沖段,主要用來補償邊沿階段的誤差,它的時間長度在重新同步的時候可以加長,PBS1段的初始大小可以為1~8Tq,
PBS2段(PHASE SEG2):
PBS2這是另一個相位緩沖段,也是用來補償邊沿階段誤差的,它的時間長度在重新同步時可以縮短,PBS2段的初始大小可以為2~8Tq,
通訊的波特率
- 總線上的各個通訊節點只要約定好1個Tq的時間長度以及每一個資料位占據多少個Tq,就可以確定CAN通訊的波特率,
- 例如,假設上圖中的1Tq=1us,而每個資料位由19個Tq組成,則傳輸一
位資料需要時間T 1bit =19us,從而每秒可以傳輸的資料位個數為:1x10^6/19 = 52631.6 (bps)
這個每秒可傳輸的資料位的個數即為通訊中的波特率,
CAN的報文種類及結構
當使用CAN協議進行通訊時,需要對資料、操作命令(如讀/寫)以及同步信號進行打包,打包后的這些內容稱為報文,
報文的種類
在原始資料段的前面加上傳輸起始標簽、片選(識別)標簽和控制標簽,在資料的尾段加上CRC校驗標簽、應答標簽和傳輸結束標簽,把這些內容按特定的格式打包好,就可以用一個通道表達各種信號,各種各樣的標簽就如同SPI中各種通道上的信號,起到了協同傳輸的作用,當整個資料包被傳輸到其它設備時,只要這些設備按格式去解讀,就能還原出原始資料,這樣的報文就被稱為CAN的 “資料幀” ,
- 為了更有效地控制通訊,CAN一共規定了5種型別的幀,
| 幀 | 幀用途 |
|---|---|
| 資料幀 | 用于節點向外傳送資料 |
| 遙控幀 | 用于向遠端節點請求資料 |
| 錯誤幀 | 用于向遠端節點通知校驗錯誤,請求重新發送上一個資料 |
| 過載幀 | 用于通知遠端節點:本節點尚未做好接收準備 |
| 幀間隔 | 用于將資料幀及遙控幀與前面的幀分離開來 |
資料幀的結構
資料幀結構圖:

資料幀:
- 以一個顯性位(邏輯0)開始,以7個連續的隱性位(邏輯1)結束,在它們之間,分別有仲裁段、控制段、資料段、CRC段和ACK段,
幀起始:
- SOF段(Start Of Frame),譯為幀起始,幀起始信號只有一個資料位,是一個顯性電平,它用于通知各個節點將有資料傳輸,其它節點通過幀起始信號的電平跳變沿來進行硬同步,
仲裁段:
-
當同時有兩個報文被發送時,總線會根據仲裁段的內容決定哪個資料包能被傳輸,這也是它名稱的由來,
-
仲裁段的內容主要為本資料幀的ID資訊(識別符號),資料幀具有標準格式和擴展格式兩種,區別就在于ID資訊的長度,標準格式的ID為11位,擴展格式的ID為29位,它在標準ID的基礎上多出18位,
-
在CAN協議中,ID起著重要的作用,它決定著資料幀發送的優先級,也決定著其它節點是否會接收這個資料幀,CAN協議不對掛載在它之上的節點分配優先級和地址,對總線的占有權是由資訊的重要性決定的,即對于重要的資訊,可給它打包上一個優先級高的ID,使它能夠及時地發送出去,
-
也正因為它這樣的優先級分配原則,使得CAN的擴展性大大加強,在總線上增加或減少節點并不影響其它設備,
-
舉一個例子來理解一下CAN總線仲裁:
假設,在一輛汽車上,許多設備由CAN總線相互連接:
在CAN總線上掛載著許多節點,例如:節點1掛載著溫度傳感器;節點2掛載著剎車;節點3掛載著車窗升降設備;節點四是車載電腦,按照正常的邏輯,剎車的優先級是最高的,那么在配置剎車報文ID時,某一時刻,車載電腦想要采集車內溫度而與此同時剎車發來請求信號,CAN總線會根據優先級進行排序,優先級高的剎車命令首先執行,

-
報文的優先級,是通過對ID的仲裁來確定的,根據前面對物理層的分析我們知道如果總線上同時出現顯性電平和隱性電平,總線的狀態會被置為顯性電平,CAN正是利用這個特性進行仲裁,
-
若兩個節點同時競爭CAN總線的占有權,當它們發送報文時,若首先出現隱性電平,則會失去對總線的占有權,進入接收狀態,在開始階段,兩個設備發送的電平一樣,所以它們一直繼續發送資料,到了圖中箭頭所指的時序處(黃色部分),節點單元1發送的為隱性電平,而此時節點單元2發送的為顯性電平,由于總線的“線與”特性使它表達出顯性電平,因此單元2競爭總線成功,這個報文得以被繼續發送出去,
-
仲裁段ID的優先級也影響著接收設備對報文的反應,因為在CAN總線上資料是以廣播的形式發送的,所有連接在CAN總線的節點都會收到所有其它節點發出的有效資料,因而CAN控制器大多具有根據ID過濾報文的功能,它可以控制自己只接收某些ID的報文,
RTR、IDE、SRR位:

-
RTR位(Remote Transmission Request Bit),譯作遠程傳輸請求位,它是用于區分資料幀和遙控幀的,當它為顯性電平時表示資料幀(為0),隱性電平時表示遙控幀(為1),資料幀優先于遙控幀,
-
IDE位(Identifier Extension Bit),譯作識別符號擴展位,它是用于區分標準格式與擴展格式,當它為顯性電平(為1)時表示標準格式,隱性電平(為0)時表示擴展格式,擴展幀主要是用來擴展報文ID號,這樣子可以掛載更多設備,
-
SRR位(Substitute Remote Request Bit),只存在于擴展格式,它用于替代標準格式中的RTR位,由于擴展幀中的SRR位為隱性位,RTR在資料幀為顯性位,所以在兩個ID相同的標準格式報文與擴展格式報文中,標準格式的優先級較高,擴展幀的優先級較低,
控制段:
- 在控制段中的r1和r0為保留位,默認設定為顯性位(為0),它最主要的是DLC段(DataLength Code),譯為資料長度碼,它由4個資料位組成,用于表示本報文中的資料段含有多少個位元組,DLC段表示的數字為0~8(位元組),
資料段:
- 資料段為資料幀的核心內容,它是節點要發送的原始資訊,由0~8個位元組組成,MSB先行,
CRC段:
- 為了保證報文的正確傳輸,CAN的報文包含了一段15位的CRC校驗碼,一旦接收節點算出的CRC碼跟接收到的CRC碼不同,則它會向發送節點反饋出錯資訊,利用錯誤幀請求它重新發送,CRC部分的計算一般由CAN控制器硬體完成,出錯時的處理則由軟體控制最大重發數,
- 在CRC校驗碼之后,有一個CRC界定符,它為隱性位,主要作用是把CRC校驗碼與后面的ACK段間隔起來,用來區分ACK,間隔,
ACK段:
- ACK段包括一個ACK槽位,和ACK界定符位,類似I2C總線,在ACK槽位中,發送節點發送的是隱性位(為1),而接收節點則在這一位中發送顯性位以示應答,在ACK槽和幀結束之間由ACK界定符間隔開,
幀結束:
- EOF段(End Of Frame),譯為幀結束,幀結束段由發送節點發送的7個隱性位表示結束,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279332.html
標籤:其他
