創建工程 在STM32CubeMX中配置,選擇Makefile並生成。 環境安裝 編譯工程需要用到arm-none-eabi,去官網下載對應系統版本,下載後解壓到任意位置。 添加環境變數 添加環境變數到.bashrc文件: echo 'export PATH="/toolchain/arm-none ...
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位可配置這個。