STM32提高篇: CAN通訊
- 一.CAN通訊介紹
- 1.物理層
- 2.協議層
- 二.STM32CAN外設
- 1.CAN控制器的3種工作模式
- 2.CAN控制器的3種測試模式
- 3.功能框圖
- 三.CAN的寄存器介紹
- 1.環回靜默模式測試
- 2.雙擊互發測試
- 四.CAN的HAL代碼解讀
一.CAN通訊介紹
CAN(Controller Area Network 控制器局域網,簡稱CAN或者CAN bus)是一種功能豐富的車用總線標準。被設計用于在不需要主機(Host)的情況下,允許網絡上的單片機和儀器相互通信。
它基于消息傳遞協議,設計之初在車輛上復用通信線纜,以降低銅線使用量,后來也被其他行業所使用。
CAN擁有了良好的彈性調整能力,可以在現有網絡中增加節點而不用在軟、硬件上做出調整。除此之外,消息的傳遞不基于特殊種類的節點,增加了升級網絡的便利性。
1.物理層
CAN網絡節點:一個CAN控制器,生成邏輯信號。一個CAN收發器,負責將總線上來的數據轉換成邏輯信號交給控制器,如果想往外發數據控制器將邏輯信號給收發器,收發器再將邏輯信號轉換為高低電平放到總線上。
控制器一般由MCU提供,收發器一般由專門的芯片提供。控制器和收發器間由CAN_Tx和CAN_Rx信號線相連。收發器與CAN總線之間使用CAN_High和CAN_Low信號線相連。
CAN網絡節點發數據:
控制器將要發送的二進制編碼通過CANTX線發送到收發器,收發器將邏輯信號轉化為差分信號,通過CANHigh和CANLow線輸出到CAN總線網絡。
CAN網絡節點收數據:
收發器把總線上收到的CANHigh及CANLow信號轉化成普通的邏輯電平信號,通過CANRx輸出到控制器中。
CAN總線網絡:
閉環總線網絡:
開環總線網絡:
差分信號:
優缺點:
邏輯電平定義:
2.協議層
CAN總線是廣播類型的總線。這意味著所有節點都可以偵聽到所有傳輸的報文。無法將報文單獨發送給指定節點;所有節點都將始終捕獲所有報文。但是CAN硬件能夠提供本地過濾功能,讓每個節點對報文有選擇性地做出響應。
CAN使用短報文 – 最大實用負載是94位。報文中沒有任何明確的地址;相反,可以認為報文是通過內容尋址,也就是說,報文的內容隱式地確定其地址。
CAN總線上有5種不同的報文類型(或“幀”):數據幀,遠程幀,錯誤幀,過載幀和幀間隔。
數據幀 :
數據幀是最常見的報文類型,用于發送單元向接收單元發送數據。
遠程幀(遙控幀):
遠程幀用于接收單元向具有相同id的發送單元請求發送數據。
錯誤幀:
錯誤幀當檢測出錯誤時向其他單元通知錯誤的幀。
過載幀:
過載幀并不常用,因為當今的CAN控制器會非常智能化地避免使用過載幀。
幀間隔:
用于將數據幀及遙控幀與前面的幀分離開來的幀。
其中錯誤幀、過載幀、幀間隔都是由硬件自動完成的,沒有辦法用軟件來控制。對于一般使用者來說,只需要掌握數據幀與遙控幀。數據幀和遙控幀有標準格式與擴展格式。標準格式有11位標識符,擴展格式有29位標識符。
數據幀介紹:
標準格式有2種數據幀,標準幀和擴展幀。
標準幀:
幀起始
仲裁段
多個ID同時發顯性位多(0多)勝出。
控制段
數據段
CRC校驗
ACK應答
EOF段
擴展幀和標準幀區別:
遠程幀介紹:
與數據幀相比沒有數據段。
CAN總線仲裁:
CAN的位時序:
同步段
相位緩沖段
采樣點
CAN的數據同步:
CAN的波特率:
二.STM32CAN外設
STM32的芯片中具有bxCAN控制器(Basic Extended CAN),它支持CAN協議2.0A 和2.0B Active標準。(CAN2.0A只能處理標準數據幀且擴展幀的內容會織別錯誤。而CAN2.0 B Active可以處理標準數據幀和擴展數據幀。CAN2.0 B Passive只能處理標準數據幀而擴展幀的內容會被忽略)。
該CAN控制器支持最高的通訊速率為1Mb/s;可以自動地接收和發送CAN報文,支持使用標準ID和擴展ID的報文;外設中具有3個發送郵箱,發送報文的優先級可以使用軟件控制,還可以記錄發送的時間;具有2個3級深度的接收FIFO,可使用過濾功能只接收或不接收某些ID號的報文;可配置成自動重發;不支持使用DMA進行數據收發。
1.CAN控制器的3種工作模式
分別為:初始化模式,正常模式,睡眠模式。
2.CAN控制器的3種測試模式
有3種測試模式:靜默模式、環回模式、環回靜默模式。當控制器進入初始化模式的時候才可以配置測試模式。
靜默模式可以檢測總線的數據流量。環回模式可以用于自檢(影響總線)。環回靜默模式也用于自檢,不會影響總線。
3.功能框圖
主動內核:
含各種控制/狀態/配置寄存器,可以配置模式、波特率等。在STM32CubeMx中可以非常方便的配置。
發送郵箱:
用來緩存待發送的報文,最多可以緩存3個報文。發送調度決定報文的發送順序。
接收FIFO:
共有2個接收FIFO,每個FIFO都可以存放3個完整的報文。它們完全由硬件來管理。從而節省了CPU的處理負荷,簡化了軟件并保證了數據的一致性。應用程序只能通過讀取FIFO輸出郵箱,來讀取FIFO中最先收到的報文。
接收濾波器(過濾器):
做用:對接到的報文進行過濾。最后放入FIFO 0或FIFO 1。
當總線上報文數據量很大時,總線上的設備會頻繁獲取報文,占用CPU。過濾器的存在,選擇性接收有效報文,減輕系統負擔。
2種過濾模式:
(1)標識符列表模式,它把要接收報文的ID列成一個表,要求報文ID與列表中的某一個標識符完全相同才可以接收,可以理解為白名單管理。
(2)掩碼模式(屏蔽位模式),它把可接收報文ID的某幾位作為列表,這幾位被稱為掩碼,可以把它理解成關鍵字搜索,只要掩碼(關鍵字)相同,就符合要求,報文就會被保存到接收FIFO。
如果使能了篩選器,且報文的ID與所有篩選器的配置都不匹配,CAN外設會丟棄該報文,不存入接收FIFO。
每個CAN提供了14個位寬可變的、可配置的過濾器組(13~0)。每個過濾器組x由2個32位寄存器,CAN_FxR1和 CAN_FxR2組成。
說明:
(1)當工作于32位屏蔽位模式時,FR1保存標識符,FR2保存屏蔽。FR2某位是1表示來的ID的這位必須和FR1中對應的位一致,FR2某位是0,表示ID的這位不關心。
(2)當工作于32位標識符模式時。FR1和FR2分別保存兩個標識符。這意味著將來只有兩個ID會匹配成功。
STM32種CAN的位時序:
STM32 外設定義的位時序與我們前面