STM32-CAN通訊
一、傳送和接收流程
can通訊傳輸的是一種差分訊號,關於具體的硬體電路略。
1、傳送流程
-
前置工作:如 時鐘的開啟、引腳的配置;CAN郵箱和模式等配置參考下面或HAL庫選擇
-
選擇一個空置的郵箱(判斷空置:CAN_TSR的TMEx位);
-
在這個空置郵箱中按資料幀格式設定ID、資料長度以及要傳送的資料;
-
請求傳送(CAN_TIxR 的 TXRQ = 1 );
-
後面的是硬體來實現的(這個過程可以被軟體打斷):
- 郵箱掛號(等優先);
- 預定(等匯流排);
- 傳送;
- 空置。
2、接收流程
- 前置工作略
- 配置過濾器:給過濾器繫結一個FIFO,之後以FIFO0為例;
- 硬體自動處理:收到報文後掛號到FIFO0(繫結的)的空閒郵箱深度;如果郵箱深度,再收到報文會溢位;
- 這個掛號和溢位都可以觸發中斷
- 軟體接收:有個郵箱深度裡掛過一次號即存一個報文,所以,可以透過掛號的數量來獲取到存進來的報文數量。具體參考暫存器的位。
二、資料幀格式
-
標準幀
- 仲裁段:
- SOF : 幀起始,1bit
- ID : 11bit
- RTR : 1bit ------------------- 0資料幀;1遠端幀
- 控制段
- IDE : 1bit -------------------- 0標準格式;1擴充套件格式
- R0 : 1bit ---------------------- 保留位
- DLC : 4bit ---------------------- 資料位元組個數 , 雖然有4bit容量,但只能放0-8,也就是最大傳送8byte資料
- 資料段 0-64bit,最大64bit,即8byte資料
- CRC段
- CRC : 15bit 校驗
- 界定符 : 1bit 校驗結束
- ACK段
- ACK : 1bit 確認
- 界定符 : 1bit 確認結束
- 幀結束 7bit
- 仲裁段:
-
擴充套件幀
略。比標準幀多了 1bit SRR, 18bit ID, 1bit R1保留位。
三、bit時段
為了實現發收雙方資料的同步,將傳送每個bit的時間分為n個小的時間單位,這個時間單位就是tq, 可配置每個tq的具體時長。
CAN通訊是一種非同步傳輸通訊,透過位時段來確認雙方的通訊無誤。
- sync (ss) : 同步段。1tq
- prop-set (pts) : 傳播時間段。一般 1-8tq,補傳輸時的延時的誤差
- phase1 (pbs1) : 相位緩衝段1。一般 1-8tq,補邊沿誤差
- phase2 (pbs2) : 相位緩衝段2。一般2-8tq,補邊沿誤差
硬同步:接收到起始幀SOF時,調整同步段SS,使得與傳送方SOF的SS段一致。
再同步:接收過起始幀以後,發現與傳送方不同步,則透過拉或縮相位段進行位同步。
取樣點:每個bit的取樣位置,取樣時發現位不同步則進行調整。
在stm32f103中,prop-seg和phase1合作為了一段。
CAN通訊並【不是】透過波特率(每秒傳輸速率,比如uart中,確定起始位後,可以透過波特率完成)來確保通訊的,但它可以計算出波特率。
1bit花費n個tq
tq = ( CAN_BTR的BRP位 + 1 ) * Tcan頻率
1bit中所有時段花費的tq = 1bit花費的時間
波特率 = 1s / 1bit花費的時間
四、工作模式和測試模式
1、工作模式
睡眠、正常、初始化。 透過暫存器控制。
2、測試模式
靜默模式(LBKM=0, SILM=1):可以自通訊,對外部只收不發;
環回模式(LBKM=1, SILM=0):可以自通訊,對外部只發不收;
環回靜默模式(LBKM=1,SILM=1):可以自通訊,對外部不發不收。
五、CAN主體功能
1、CAN1和CAN2
對於非互聯產品,如stm32f103系列,只有一個CAN1,有14個過濾器組;
對於互聯型產品,如105、107系列,有一個CAN1和一個CAN2,連個CAN共享28個過濾器組。
2、傳送郵箱
3個。將要傳送的報文放到某個郵箱中,硬體自動傳送出去。
3、接收郵箱和FIFO
關於FIFO和接收郵箱,可以說每個FIFO裡有三個郵箱,但一般說法是每個FIFO裡有三個郵箱深度。
stm32f103系列中,CAN功能有2個FIFO(佇列), 每個FIFO有3個郵箱深度, 每個郵箱深度可放一個報文。
當報文透過濾波器過濾之後,就儲存到了某個FIFO的某郵箱中,這個需要FIFO和過濾器進行關聯配置。
硬體會遍歷配置好的FIFO中的郵箱深度以儲存報文。
4、接收濾波器 (關於位寬和模式)
上面說到,stm32103系列CAN功能有14個過濾器組;
每個過濾器組由2個32位暫存器組成。
-
位寬:
可透過CAN_FS1R暫存器的FSCx(0-13)位將這2個32位運用為:
- 0 ———— 4個單位,每個單位16bit
- 1 ———— 2個單位,每個單位32bit
-
過濾器模式:
可透過CAN_FM1R暫存器的FBMx位控制
- 1 ———— 識別符號模式: 4或2個單位全填ID, 只有填進去的ID才可透過過濾器放到FIFO的郵箱深度中
- 0 ———— 遮蔽位模式: 4或2個單位 的 其中一半是1/0位,另一半(每個32bit的低16bit)是規則(0驗證 1不驗證)
六、CAN錯誤狀態
-
錯誤主動——————出錯次數較少, [0, 127]
-
錯誤被動——————出錯次數中等, [128, 255]
-
離線 ——————出錯次數較多, [256, ∞)
從離線模式進入正常模式(錯誤主動)可以由軟體或硬體控制,MCR的ABOM位可配置這個。