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