一、CAN(Controller Area Network)協議的擁有穩定性、准確性,應用在汽車控制系統和其他重要的如醫療、船舶等工業方面
二、CAN協議兩種標准化:
ISO11898 通信速率125Kbps-1Mbps高速通信協議
ISO11519 通信速率在125Kbps以下的低速通信協議
三、CAN協議的特點:
1)多主控制:總線空閑時,所有單元都可以可以發送消息,而兩個以上的單元同時開始發送消息,根據標識符(identifer 簡稱 ID)決定優先級,ID表示訪問總線消息的優先級(ID在這並不是表示發送的目的地址),進行逐位仲裁比較,仲裁獲勝(表示優先級最高)可連續發送消息,仲裁失利的停止發送消息轉為接收工作
2)系統的若軟性:與總線相連的單元沒有類似於“地址”的信息。因此在總線上增加單元時,連接在總線上的其它單元的軟硬件及應用層都不需要改變。
3)通信速度較快,通信距離較遠
4)具有錯誤檢測、錯誤通知和錯誤恢復功能:所以單元都可以檢測錯誤,檢測出錯誤會立即通知其他單元。正在發送消息的單元一旦檢測出錯誤,會強制結束發送,強制結束發送的單元會不斷反復重新發送次消息直至發送成功為止(錯誤恢復功能)。
5)故障封閉功能:CAN總線可以判斷錯誤類型在總線上是暫時的數據錯誤(如外部噪聲),還是持續的數據錯誤(如單元內部故障,驅動故障等),當總線上發生持續數據錯誤時,可將此故障的單元從總線上隔離出去
6)連接節點多:理論上可以連接多個單元;單元連接太多造成通信速率下降,反之連接單元少通信速率增加。
四、CAN協議是串行異步通信,由CAN_High和CAN_Low兩條信號線,以差分信號的形式進行通訊,下面是總線的兩種連接方式:
1)閉環總線(高速通信大約在1Mbps左右,傳輸距離大約在40m)
2) 開環總線(低速通信在125kbps左右,傳輸距離遠大約是1km)【兩根線各串聯2.2千歐的電阻】
3)顯性電平對應的是邏輯0,為2.5V左右
隱性電平對應的是邏輯1,為0V
4)通信方式: CAN總線可以掛很多個節點(也可以叫單元)(節點中有CAN的控制器【就是stm32芯片內部的一部分】和CAN收發器組成),連在同一個網絡總線上像設置好的波特率等進行通訊
五、CAN協議每個數據的時序分解為 SS(同步段 1Tq)、PTS段(傳播時間段1-8Tq)、PBS1段(相位緩沖段1 1-8Tq)、PBS2段(相位緩沖段2 2-8Tq)、SJW(再同步補償寬度 1-4Tq)
Tq(time quantum):最小時間單位構成
在接收過程中檢測到總線電平發生了改變時執行重新同步操作。 每當檢測到一個邊沿(總線電平的改變),收發單元根據SJW值通過增加PBS1段或減少PBS2段,來調整同步。如果發生了超出SJW值的誤差時,最大調整量不能超過SJW值。
調整同步的規則 ?
- 在1個位時間里(或者說在2個采樣點之間),只允許一個同步(或者說只進行一次同步調整)。
- 只有當采樣點之前的總線電平和邊沿后的總線電平不同時,該邊沿才能用於調整同步。
- 如果出現隱性電平到顯性電平變化的邊沿,且條件(1)和(2)滿足,將進行同步。
- 如果在幀間間隙期間發生隱性電平到顯性電平的信號邊沿(除了間隙里的第一位),則總會執行硬件同步。
- 如果發生從所有其它隱性電平到顯性電平的信號邊沿,則執行再同步。
- 如果發送單元自身輸出的顯性電平被檢測到有延遲,則不執行再同步。
六、報文:CAN協議通訊,對數據、操作命令以及同步信號打包
七、CAN協議中五種類型的幀:
數據幀
遙控幀
錯誤幀
過載幀
間隔幀
數據幀和遙控幀有標准模式和擴展格式兩種
標准模式:有11個位的標識符(ID)
擴展模式:有29個位的ID
注:以數據幀為例
幀起始
仲裁段:組成一個數據包,最小單位是數據位(如SS段)
ID決定了數據幀發送的優先級,也決定了其他節點是否接收這個數據幀
對於優先級最高級ID,先發送
控制段:ide0 標准幀、ide1 擴展幀
數據段:數據的內容,一幀可以發送0-8個字節的數據
CRC段:檢查幀的傳輸錯誤的段
ACK段:表示正常接收的段
幀結束
數據幀的構成
數據幀仲裁段的構成
八、報文測試模式
1)正常模式
2)靜默模式
3)回環模式
4)靜默回環模式
九、通過寄存器控制郵箱發送和接收FIFO
CAN 發送流程為:程序選擇 1 個空置的郵箱(TME=1)——>設置標識符(ID),數據長度和
發送數據——>設置 CAN_TIxR 的 TXRQ 位為 1,請求發送——>郵箱掛號(等待成為最高優先級)
預定發送(等待總線空閑) ——>發送——>郵箱空置
CAN 接收到的有效報文,被存儲在 3 級郵箱深度的 FIFO 中。 FIFO 完全由硬件來管理,從而節省了 CPU 的處理負荷,簡化了軟件並保證了數據的一致性。應用程序只能通過讀取 FIFO輸出郵箱,來讀取 FIFO 中最先收到的報文。 這里的有效報文是指那些正確被接收的(直到 EOF都沒有錯誤)且通過了標識符過濾的報文。前面我們知道 CAN 的接收有 2 個 FIFO,我們每個濾波器組都可以設置其關聯的 FIFO,通過 CAN_FFA1R 的設置,可以將濾波器組關聯到FIFO0/FIFO1。
CAN 接收流程為: FIFO 空——>收到有效報文——>掛號_1(存入 FIFO 的一個郵箱,這個由硬件控制,我們不需要理會) ——>收到有效報文——>掛號_2——>收到有效報文——>掛號_3——>收到有效報文——>溢出。
這個流程里面,我們沒有考慮從 FIFO 讀出報文的情況,實際情況是:我們必須在 FIFO 溢出之前,讀出至少 1 個報文,否則下個報文到來,將導致 FIFO 溢出,從而出現報文丟失。每讀出 1 個報文,相應的掛號就減 1,直到 FIFO 空。
轉:https://blog.csdn.net/qq_41578344/article/details/84146037