CAN通讯协议层--秉火STM32学习笔记
首先非常感謝秉火團隊為我們提供學習STM32的豐富資料及詳細教程,此筆記僅用作個人學習記錄,以此加深記憶,如果讀者也喜歡,請一同感謝并支持秉火團隊。
1. CAN 的波特率及位同步
由于CAN 屬于異步通訊,沒有時鐘信號線,連接在同一個總線網絡中的各個節點會像串口異步通訊那樣,節點間使用約定好的波特率進行通訊,特別地,CAN 還會使用“位同步”的方式來抗干擾、吸收誤差,實現對總線電平信號進行正確的采樣,確保通訊正常。位時序分解
為了實現位同步,CAN 協議把每一個數據位的時序分解成如下圖 所示的SS 段、PTS 段、PBS1 段、PBS2 段,這四段的長度加起來即為一個CAN 數據位的長度。分解后最小的時間單位是Tq,而一個完整的位由8~25 個Tq 組成。為方便表示,圖 42-5 中的高低電平直接代表信號邏輯0 或邏輯1(不是差分信號)。
該圖中表示的CAN 通訊信號每一個數據位的長度為19Tq,其中SS 段占1Tq,PTS 段占6Tq,PBS1 段占5Tq,PBS2 段占7Tq。信號的采樣點位于PBS1 段與PBS2 段之間,通過控制各段的長度,可以對采樣點的位置進行偏移,以便準確地采樣。
| PTS 段(PROP SEG) | PTS 譯為傳播時間段,這個時間段是用于補償網絡的物理延時時間。是總線上輸入比較器延時和輸出驅動器延時總和的兩倍。PTS 段的大小可以為1~8Tq。 |
| PBS1 段(PHASE SEG1) | PBS1 譯為相位緩沖段,主要用來補償邊沿階段的誤差,它的時間長度在重新同步的時候可以加長。PBS1 段的初始大小可以為1~8Tq。 |
| PBS2 段(PHASE SEG2) | PBS2 這是另一個相位緩沖段,也是用來補償邊沿階段誤差的,它的時間長度在重新同步時可以縮短。PBS2 段的初始大小可以為2~8Tq。 |
通訊的波特率
總線上的各個通訊節點只要約定好1 個Tq 的時間長度以及每一個數據位占據多少個Tq,就可以確定CAN 通訊的波特率。
例如,假設上圖中的1Tq=1us,而每個數據位由19 個Tq 組成,則傳輸一位數據需要時間T1bit =19us,從而每秒可以傳輸的數據位個數為:
1x106/19 = 52631.6 (bps)
這個每秒可傳輸的數據位的個數即為通訊中的波特率。
同步過程分析
波特率只是約定了每個數據位的長度,數據同步還涉及到相位的細節,這個時候就
需要用到數據位內的SS、PTS、PBS1 及PBS2 段了。
根據對段的應用方式差異,CAN 的數據同步分為硬同步和重新同步。其中硬同步只是當存在“幀起始信號”時起作用,無法確保后續一連串的位時序都是同步的,而重新同步方式可解決該問題,這兩種方式具體介紹如下:
(1) 硬同步
若某個CAN 節點通過總線發送數據時,它會發送一個表示通訊起始的信號(即幀起始信號),該信號是一個由高變低的下降沿。而掛載到CAN 總線上的通訊節點在不發送數據時,會時刻檢測總線上的信號。
如下圖可以看到當總線出現幀起始信號時,某節點檢測到總線的幀起始信號不在節點內部時序的SS 段范圍,所以判斷它自己的內部時序與總線不同步,因而這個狀態的采樣點采集得的數據是不正確的。所以節點以硬同步的方式調整,把自己的位時序中的SS段平移至總線出現下降沿的部分,獲得同步,同步后采樣點就可以采集得正確數據了。
(2) 重新同步
前面的硬同步只是當存在幀起始信號時才起作用,如果在一幀很長的數據內,節點信號與總線信號相位有偏移時,這種同步方式就無能為力了。因而需要引入重新同步方式,它利用普通數據位的高至低電平的跳變沿來同步(幀起始信號是特殊的跳變沿)。重新同步與硬同步方式相似的地方是它們都使用SS 段來進行檢測,同步的目的都是使節點內的SS段把跳變沿包含起來。
重新同步的方式分為超前和滯后兩種情況,以總線跳變沿與SS 段的相對位置進行區分。第一種相位超前的情況如下圖 ,節點從總線的邊沿跳變中,檢測到它內部的時序比總線的時序相對超前2Tq,這時控制器在下一個位時序中的PBS1 段增加2Tq 的時間長度,使得節點與總線時序重新同步。
2. CAN 的報文種類及結構
報文的種類
在原始數據段的前面加上傳輸起始標簽、片選(識別)標簽和控制標簽,在數據的尾段加上CRC 校驗標簽、應答標簽和傳輸結束標簽,把這些內容按特定的格式打包好,就可以用一個通道表達各種信號了,各種各樣的標簽就如同SPI 中各種通道上的信號,起到了協同傳輸的作用。
為了更有效地控制通訊,CAN 一共規定了5 種類型的幀。
| 數據幀 | 用于節點向外傳輸數據 |
| 遙控幀 | 用于向遠端節點傳輸數據 |
| 錯誤幀 | 用于向遠端節點通知校驗錯誤,請求重新發送上一個數據 |
| 幀間隔 | 用于將數據幀及遙控幀與前面的幀分離開來 |
數據幀的結構
數據幀以一個顯性位(邏輯0)開始,以7 個連續的隱性位(邏輯1)結束,在它們之間,分別有仲裁段、控制段、數據段、CRC 段和ACK 段。
| 仲裁段 | 當同時有兩個報文被發送時,總線會根據仲裁段的內容決定哪個數據包能被傳輸,這也是它名稱的由來。 仲裁段的內容主要為本數據幀的ID 信息(標識符),數據幀具有標準格式和擴展格式兩種,區別就在于ID 信息的長度,標準格式的ID 為11 位,擴展格式的ID 為29 位,它在標準ID 的基礎上多出18 位 |
| RTR位 | 位(Remote Transmission Request Bit),譯作遠程傳輸請求位,它是用于區分數據幀和遙控幀的,當它為顯性電平時表示數據幀,隱性電平時表示遙控幀。 |
| IDE 位 | (Identifier Extension Bit),譯作標識符擴展位,它是用于區分標準格式與擴展格式,當它為顯性電平時表示標準格式,隱性電平時表示擴展格式。 |
| SRR 位 | (Substitute Remote Request Bit),只存在于擴展格式,它用于替代標準格式中的RTR 位。由于擴展幀中的SRR 位為隱性位,RTR 在數據幀為顯性位,所以在兩個ID相同的標準格式報文與擴展格式報文中,標準格式的優先級較高。 |
| 控制段 | 在控制段中的r1 和r0 為保留位,默認設置為顯性位。它最主要的是DLC 段(DataLength Code),譯為數據長度碼,它由4 個數據位組成,用于表示本報文中的數據段含有多少個字節,DLC 段表示的數字為0~8。 |
| 數據段 | 數據段為數據幀的核心內容,它是節點要發送的原始信息,由0~8 個字節組成,MSB先行。 |
| CRC 段 | 為了保證報文的正確傳輸,CAN 的報文包含了一段15 位的CRC 校驗碼,一旦接收節點算出的CRC 碼跟接收到的CRC 碼不同,則它會向發送節點反饋出錯信息,利用錯誤幀請求它重新發送。CRC 部分的計算一般由CAN 控制器硬件完成,出錯時的處理則由軟件控制最大重發數。在CRC 校驗碼之后,有一個CRC 界定符,它為隱性位,主要作用是把CRC 校驗碼與后面的ACK 段間隔起來。 |
| 幀結束 | EOF 段(End Of Frame),譯為幀結束,幀結束段由發送節點發送的7 個隱性位表示結束。 |
關于其它的CAN 報文結構如下表
總結
以上是生活随笔為你收集整理的CAN通讯协议层--秉火STM32学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何恢复计算机隐藏的文件夹,电脑文件夹删
- 下一篇: 使用attrib命令修复隐藏的文件夹