1. 程式人生 > >適合初學者的STM32 CAN協議理解總結( ISO11898 標準)

適合初學者的STM32 CAN協議理解總結( ISO11898 標準)

暑假學習的時候看到了CAN匯流排,幾個小夥伴好像看的都比較苦惱。是的,對於大量的說明難免有些不想看,看不懂為什麼要把TIM這些東西設為1,很多字元又代表什麼意思......但對知識的畏懼是無法向前的。靜下心來慢慢看就好了!我在這裡記錄一些我學習CAN協議過程中的理解總結,希望能幫到一些初學者。

CAN的組成框圖

下圖為網際網路型的雙CAN框圖:

我使用的F103ZET6只有一個串列埠,其中3個傳送郵箱3個FIFO0與FIFO1接受是十分重要的部分,左邊的是一些相關狀態或控制暫存器。先眼熟一下,接下來會用到他們。(大量的暫存器字元就是左邊那些要用到的)

CAN的傳送流程

CAN 傳送流程為:程式選擇 1 個空置的郵箱

(TME=1)→設定識別符號(ID),資料長度和傳送資料→設定 CAN_TIxR 的 TXRQ 位為 1,請求傳送郵箱掛號(等待成為最高優先順序)→預定傳送(等待匯流排空閒)→傳送郵箱空置

可以理解為CAN傳送資料時找到一個空置的郵箱然後給他取個名字並向他塞了一些郵件,現在這個郵箱只需要等其它郵箱發完郵件自己就能發郵件了。

CAN的接受流程

CAN 接收流程為: FIFO 空→收到有效報文掛號-1(存入 FIFO 的一個郵箱,這個由硬體
控制,我們不需要理會) →收到有效報文掛號-2→收到有效報文→掛號-3→收到有效報文
溢位

先把大致流程看一遍,相比最初是不是有了一個稍微清晰一點的認識呢。當然問題也是更多的,比如為什麼要把TIM這些東西設為1,這些字母又代表什麼意思,CAN的資料是怎麼傳送的等等。現在就要來學基礎知識填補空白了!

CAN物理層特徵

對於CAN的訊號邏輯1和0的產生:

當CAN_High 為3.5V CAN_Low 為 1.5V 差值為2V左右時為顯性電平表示,而兩者相等時為隱性電平表示1。

5種幀

CAN 協議是通過以下 5 種類型的幀進行的:

幀型別

幀用途

資料幀

用於傳送單元向接收單元傳送資料的幀

遙控幀

用於接收單元向具有相同 ID 的傳送單元請求資料的幀

錯誤幀

用於當檢測出錯誤時向其它單元通知錯誤的幀

過載幀

用於接收單元通知其尚未做好接收準備的幀

間隔幀

用於將資料幀及遙控幀與前面的幀分離開來的幀

https://blog.csdn.net/qq_34392093/article/details/52141952這篇部落格有詳細介紹,寫的挺不錯的大家可以看看。

資料幀

資料幀一般由 7 個段構成(可對應下圖各端),即:
(1) 幀起始。表示資料幀開始的段。
(2) 仲裁段。表示該幀優先順序的段。
(3) 控制段。表示資料的位元組數及保留位的段。
(4) 資料段。資料的內容,一幀可傳送 0~8 個位元組的資料。
(5) CRC 段。檢查幀的傳輸錯誤的段。
(6) ACK 段。表示確認正常接收的段。 

這裡不細講各個段了,可在提到的另一篇部落格或CAN的相關說明中找到

可以 當成時序圖來看吧,差不多的感覺

圖中 D 表示顯性電平, R 表示隱形電平(下同)。而紫色的那部分為什麼D/R都行呢嗯?因為那些資料並不是特定的,像是不同的ID。不同的資料就會有不同的電平。

幀起始,這個比較簡單,標準幀和擴充套件幀都是由 1 個位的顯性電平表示幀起始。

仲裁段,表示資料優先順序的段,標準幀和擴充套件幀格式在本段有所區別

位時序

這裡的知識有什麼用呢?我先打個比方,某個魔法石需要咒語開啟,但需要特定的時間說特定的話才能讓它實現功能。如果沒在特定的時間唸咒語,那麼是無法正確實現功能的。我們的CAN需要從機的取樣時間如何和主機一致,這樣才能使其正常的工作。這個問題是通訊雙方通過約定波特率實現同步解決的。 
在CAN通訊中,非同步狀態下每秒傳送的位數稱為位數率,依據時間片的概念將1個bit的時間分為四個部分 
1.同步段(SS) 
2.傳播時間段(PTS) 
3.相位緩衝段1(PBS1) 
4.相位緩衝段2(PBS2) 

這些又由可稱為Time Quantum(以下稱為Tq)的最小時間單位構成。1 位分為4 個段,每個段又由若干個Tq 構成,這稱為位時序。位時間=1/波特率,因此,知道位時間,我們就可以知道波特率。1 位由多少個Tq 構成、每個段又由多少個Tq 構成等,可以任意設定位時序。通過設定位時序,多個單元可同時取樣,也可任意設定取樣點。

下圖對幾個時間段的作用進行了分析解釋