摘要:而及是一對差分信號線,使用差分信號。幀結束表示數據幀結束的段。控制段控制段由個位構成,表示數據段的字節數。有效消息當消息依據協議正確接收并且成功通過標識符篩選后,該消息將視為有效。
目錄
CAN 通訊并不是以時鐘信號來進行同步的,它是一種異步通訊,只具有 CAN_High 和 CAN_Low 兩條信號線,共同構成一組差分信號線,以差分信號的形式進行通訊。
CAN的物理層有兩種拓撲結構,閉環總線網絡和開環總線網絡,我們將依次介紹他們。
閉環網絡的特點是:高速、近距離。
它的總線最大長度為 40m,通信速度最高為1Mbps,總線的兩端各要求有一個“120 歐”的電阻。
閉環網絡的特點是:低速、遠距離。
它的最大傳輸距離為1km,最高通訊速率為 125kbps,兩根總線是獨立的、不形成閉環,要求每根總線上各串聯有一個“2.2 千歐”的電阻。
CAN 總線上可以掛載多個通訊節點,節點之間的信號 經過總線傳輸,實現節點間通訊。
由于 CAN 通訊協議不對節點進行地址編碼,而是對數據內容進行編碼的,所以網絡中的節點個數理論上不受限制,只要總線的負載足夠即可,可以通過中繼器增強負載。
CAN 通訊節點由一個 CAN 控制器及 CAN 收發器組成,控制器與收發器之間通過 CAN_Tx 及 CAN_Rx 信號線相連,收發器與 CAN 總線之間使用 CAN_High 及 CAN_Low 信號線相連。而 CAN_High 及 CAN_Low 是一對差分信號線,使用差分信號。
與傳統使用單根信號線電壓表示邏輯的方式有區別,使用差分信號傳輸時,需要兩根信號線,這兩個信號線的振幅相等,相位相反,通過兩根信號線 的電壓差值來表示邏輯 0 和邏輯 1。
?差分信號傳輸具有如下優點:
CAN信號 | 高速CAN | 低速CAN | ||
---|---|---|---|---|
電平 | 顯性 | 隱性 | 顯性 | 隱性 |
CAN_H | 3.50 | 2.50 | 4.00 | 1.75 |
CAN_L | 1.50 | 2.50 | 1.00 | 3.25 |
電位差 | 2.00 | 0 | 3.00 | -1.50 |
?由于CAN總線的仲裁機制采取“線與”的方式對總線上的信號進行仲裁。因此,假如有兩個 CAN 通訊節點,在同一時間,一個輸出隱性電平,另一個輸出顯性電平,“線與”的總線仲裁機制將使它處于顯性電平狀態。因此低電平“0”被成為顯性電平。
由于 CAN 屬于異步通訊,沒有時鐘信號線,連接在同一個總線網絡中的各個節點會像串口異步通訊那樣,節點間使用約定好的波特率進行通訊
總線上的各個通訊節點只要約定好 1 個 Tq 的時間長度以及每一個數據位占據多少個Tq,就可以確定 CAN 通訊的波特率。
為了實現位同步,在STM32數據手冊中通過將標稱位時間劃分為以下三段
?關于同步,還有硬件同步、再同步等操作。更多關于位時序的內容可以參看 ISO 11898 標準。
為了更有效地控制通訊,CAN 一共規定了 5 種類型的幀:
我們在這里主要介紹一下數據幀
數據幀由 7 個段構成:
幀起始
表示幀開始的段。1 個位的顯性位。
仲裁段
表示數據的優先級的段。
標準格式和擴展格式在此的構成有所不同。
控制段
控制段由 6 個位構成,表示數據段的字節數。標準格式和擴展格式的構成有所不同。
數據段
數據段可包含 0~8 個字節的數據。從 MSB(最高位)開始輸出。
CRC段
CRC 段是檢查幀傳輸錯誤的幀。由 15 個位的 CRC 順序和 1 個位的 CRC 界定符(用于分隔的位)構成。
ACK段?
?ACK 段用來確認是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 個位構成。
幀結束?
?幀結束是表示該該幀的結束的段。由 7 個位的隱性位構成。
?從圖上我們可以看到,CAN 1與CAN 2為主從關系,CAN 1為Master ( 主 ) ,CAN 2為Slave ( 從 ) 。CAN 1和CAN 2有各自的3個發送郵箱,2個FIFO Buffer緩沖,6個接收郵箱。但是,28個Filter 過濾器卻是共用的,我們可以規定,哪些Filter給那個CAN用,甚至可以在程序運行的時候調控。
● CAN1:主 bxCAN,用于管理 bxCAN 與 512 字節 SRAM 存儲器之間的通信。
● CAN2:從 bxCAN,無法直接訪問 SRAM 存儲器。
● 兩個 bxCAN 單元共享 512 字節 SRAM 存儲器
CAN 1和CAN 2有各自的3個發送郵箱,最多可以緩存 3 個待發送的報文。
為了發送消息,程序必須在請求發送之前選擇一個空的發送郵箱,使郵箱退出空的狀態,進入掛起狀態。此時,對于掛起的郵箱,軟件無法再對其訪問。進入掛起狀態后,優先級高的郵箱將優先發送。發送后的郵箱將恢復到空的狀態。
?為了接收 CAN 消息,提供了構成 FIFO 的三個郵箱。為了節約 CPU 負載,FIFO 完全由硬件進行管理。應用程序通過 FIFO 輸出郵箱訪問 FIFO 中所存儲的消息。
當消息依據 CAN 協議正確接收并且成功通過標識符篩選后,該消息將視為有效。
當接收到報文時,FIFO 的報文計數器會自增,而 STM32 內部讀取 FIFO 數據之后,報文計數器會自減,我們通過狀態寄存器可獲知報文計數器的值
?在 CAN 協議中,消息的標識符與節點地址無關,但與消息內容有關。因此,發送器將消息廣播給所有接收器。在接收到消息時,接收器節點會根據標識符的值來確定軟件是否需要該消息。STM32 的 CAN 外設接收報文前會先使用驗收篩選器檢查,只接收需要的報文到 FIFO 中。
CAN2 外設的結構與 CAN1 外設是一樣的,他們共用篩選器且由于存儲訪問控制器由 CAN1 控制,所以要使用 CAN2 的時候必須要使能 CAN1 的時鐘。
HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs);
hcan
:指向CAN配置結構體ActiveITs
:表明哪個中斷會被啟動,開啟改中斷的消息提示HAL_StatusTypeDef
:如果開啟成功,返回HAL_OK
;如果失敗,返回HAL_ERROR
HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan);
hcan
:指向CAN配置結構體HAL_StatusTypeDef
:如果開啟成功,返回HAL_OK
;如果失敗,返回HAL_ERROR
HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig);
hcan
:指向CAN配置結構體sFilterConfig
:指向Filter過濾器配置結構體HAL_StatusTypeDef
:如果開啟成功,返回HAL_OK
;如果失敗,返回HAL_ERROR
HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox);
hcan
:指向CAN配置結構體pHeader
:指向發送數據的配置結構體aData[]
:指向需要發送的數據pTxMailbox
:該函數會返回用于儲存發送數據的發送郵箱編號到該變量HAL_StatusTypeDef
:如果添加成功,返回HAL_OK
;如果失敗,返回HAL_ERROR
uint32_t HAL_CAN_IsTxMessagePending(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);
hcan
:指向CAN配置結構體TxMailboxes
:指向發送數據的發送郵箱uint32_t
:如果有發送數據正在等待發送,返回1
;如果沒有,返回0
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan);
main.c
中創建HAL_CAN_RxFifo0MsgPendingCallback
函數HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]);
hcan
:指向CAN配置結構體RxFifo
:指向負責接收的FIFOpHeader
:指向接收數據的配置結構體aData[]
:指向需要接收的數據HAL_StatusTypeDef
:如果接收成功,返回HAL_OK
;如果失敗,返回HAL_ERROR
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/119237.html
摘要:為了可靠工作,在總線狀態切換時需要做適當延時,再進行數據收發。 一、實現效果 ????????基于ucosii實時操作系統的RS485通信,采用USART + DMA進行收發, ?二、開發環境 開發工具:KEIL V5開發板: STM32f107RC采用方式:USART + DMA使用系統:...
摘要:使用庫讀寫環境光照度傳感器本文將教大家如何快速使用庫讀取光照度數據。五實驗樣機測試展示通過之前配置好的面板,通過涂鴉智能進行配網實時采集光照度傳感器的數據。 使用STM32 HAL庫讀寫環境光照度傳感器(BH1750) 本文將教大家如何快速使用STM32HAL庫讀取光照度數據。 實現功能:通...
摘要:設置下面的項為和項為,用于設置支持的軟硬件仿真。如有錯誤,請斧正。參考文獻基于創建匯編語言工程并分析 文章目錄 1新建工程2配置環境3測試代碼4分析生成的H...
本文代碼均來正點原子標準例程 聲明:本文不是教學文章,可能也不適合初學者閱讀 不知為什么,最近總蹦出有很多想法(可能是工作太閑了)一會想學這,一會想學那,這不,突然想復習一下STM32了。 我好久以前就學過正點原子的課程,還買過一些開發板,但現在手上只有一個核心板了,就暫且湊合著用吧。 我是個喜歡制定計劃的人,既然有了想法,那就得制定一個學習計劃,估摸了一下,明天要上班,現在已經中午了,所以我只...
閱讀 3847·2021-09-06 15:00
閱讀 2179·2019-08-30 15:53
閱讀 3287·2019-08-23 16:44
閱讀 951·2019-08-23 15:19
閱讀 1397·2019-08-23 12:27
閱讀 4197·2019-08-23 11:30
閱讀 590·2019-08-23 10:33
閱讀 376·2019-08-22 16:05