成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

STM32--CAN通訊實(shí)驗(yàn)

myeveryheart / 3858人閱讀

摘要:而及是一對(duì)差分信號(hào)線,使用差分信號(hào)。幀結(jié)束表示數(shù)據(jù)幀結(jié)束的段??刂贫慰刂贫斡蓚€(gè)位構(gòu)成,表示數(shù)據(jù)段的字節(jié)數(shù)。有效消息當(dāng)消息依據(jù)協(xié)議正確接收并且成功通過標(biāo)識(shí)符篩選后,該消息將視為有效。

目錄

CAN協(xié)議介紹

物理層

閉環(huán)總線網(wǎng)絡(luò)

開環(huán)總線網(wǎng)絡(luò)

?通訊節(jié)點(diǎn)

差分信號(hào)

協(xié)議層簡(jiǎn)介

CAN的波特率

位時(shí)序

幀類型、作用及格式

數(shù)據(jù)幀

STM32CAN外設(shè)

?CAN 發(fā)送郵箱

?CAN 接收 FIFO

?有效消息

?接收處理

上溢

?標(biāo)識(shí)符篩選

CAN1與CAN2整體邏輯

HAL庫函數(shù)


CAN協(xié)議介紹

物理層

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ò)

閉環(huán)網(wǎng)絡(luò)的特點(diǎn)是:高速、近距離。

它的總線最大長(zhǎng)度為 40m,通信速度最高為1Mbps,總線的兩端各要求有一個(gè)“120 歐”的電阻。

CAN閉環(huán)總線網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)

開環(huán)總線網(wǎng)絡(luò)

閉環(huán)網(wǎng)絡(luò)的特點(diǎn)是:低速、遠(yuǎn)距離。

它的最大傳輸距離為1km,最高通訊速率為 125kbps,兩根總線是獨(dú)立的、不形成閉環(huán),要求每根總線上各串聯(lián)有一個(gè)“2.2 千歐”的電阻。

CAN閉環(huán)總線網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)

?通訊節(jié)點(diǎn)

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)。

差分信號(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):

  • 抗干擾能力強(qiáng),當(dāng)外界存在噪聲干擾時(shí),幾乎會(huì)同時(shí)耦合到兩條信號(hào)線上。所以外界的共模噪聲可以被完全抵消。
  • 能有效抑制它對(duì)外部的電磁干擾,同樣的道理,由于兩根信號(hào)的極性相反,他們對(duì)外輻射的電磁場(chǎng)可以相互抵消,耦合的越緊密,泄放到外界的電磁能量越少。
  • 時(shí)序定位精確,由于差分信號(hào)的開關(guān)變化是位于兩個(gè)信號(hào)的交點(diǎn),而不像普通單端信號(hào)依靠高低兩個(gè)閾值電壓判斷,因而受工藝,溫度的影響小,能降低時(shí)序上的誤差,同時(shí)也更適合于低幅度信號(hào)的電路。
CAN信號(hào)高速CAN低速CAN
電平顯性隱性顯性隱性
CAN_H

3.50

2.504.001.75
CAN_L1.502.501.003.25
電位差2.0003.00-1.50

?由于CAN總線的仲裁機(jī)制采取“線與”的方式對(duì)總線上的信號(hào)進(jìn)行仲裁。因此,假如有兩個(gè) CAN 通訊節(jié)點(diǎn),在同一時(shí)間,一個(gè)輸出隱性電平,另一個(gè)輸出顯性電平,“線與”的總線仲裁機(jī)制將使它處于顯性電平狀態(tài)。因此低電平“0”被成為顯性電平。

物理層特征總結(jié)

協(xié)議層簡(jiǎn)介

CAN的波特率

由于 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í)序

為了實(shí)現(xiàn)位同步,在STM32數(shù)據(jù)手冊(cè)中通過將標(biāo)稱位時(shí)間劃分為以下三段

  • 同步段 (SYNC_SEG):位變化應(yīng)該在此時(shí)間段內(nèi)發(fā)生。它只有一個(gè)時(shí)間片的固定長(zhǎng)度 (1 x tCAN)
  • 位段 1 (BS1):定義采樣點(diǎn)的位置。它包括 CAN 標(biāo)準(zhǔn)的 PROP_SEG 和 PHASE_SEG1。 其持續(xù)長(zhǎng)度可以在 1 到 16 個(gè)時(shí)間片之間調(diào)整,但也可以自動(dòng)加長(zhǎng),以補(bǔ)償不同網(wǎng)絡(luò)節(jié) 點(diǎn)的頻率差異所導(dǎo)致的正相位漂移。
  • 位段 2 (BS2):定義發(fā)送點(diǎn)的位置。它代表 CAN 標(biāo)準(zhǔn)的 PHASE_SEG2。其持續(xù)長(zhǎng)度可 以在 1 到 8 個(gè)時(shí)間片之間調(diào)整,但也可以自動(dòng)縮短,以補(bǔ)償負(fù)相位漂移。

?關(guān)于同步,還有硬件同步、再同步等操作。更多關(guān)于位時(shí)序的內(nèi)容可以參看 ISO 11898 標(biāo)準(zhǔn)。

幀類型、作用及格式

為了更有效地控制通訊,CAN 一共規(guī)定了 5 種類型的幀:

我們?cè)谶@里主要介紹一下數(shù)據(jù)幀

數(shù)據(jù)幀

數(shù)據(jù)幀由 7 個(gè)段構(gòu)成:

  • 幀起始:表示數(shù)據(jù)幀開始的段.
  • 仲裁段:表示該幀優(yōu)先級(jí)的段。
  • 控制段:表示數(shù)據(jù)的字節(jié)數(shù)及保留位的段。
  • 數(shù)據(jù)段:數(shù)據(jù)的內(nèi)容,可發(fā)送 0~8 個(gè)字節(jié)的數(shù)據(jù)。
  • CRC段:檢查幀的傳輸錯(cuò)誤的段。
  • ACK段:表示確認(rèn)正常接收的段。
  • 幀結(jié)束:表示數(shù)據(jù)幀結(jié)束的段。

幀起始

表示幀開始的段。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)成。

STM32CAN外設(shè)

?從圖上我們可以看到,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 發(fā)送郵箱

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 接收 FIFO

?為了接收 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ù)器的值

上溢

?標(biāo)識(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 中。

CAN1與CAN2整體邏輯

CAN2 外設(shè)的結(jié)構(gòu)與 CAN1 外設(shè)是一樣的,他們共用篩選器且由于存儲(chǔ)訪問控制器由 CAN1 控制,所以要使用 CAN2 的時(shí)候必須要使能 CAN1 的時(shí)鐘。

HAL庫函數(shù)

HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs);
  • 參數(shù)
    • hcan:指向CAN配置結(jié)構(gòu)體
    • ActiveITs:表明哪個(gè)中斷會(huì)被啟動(dòng),開啟改中斷的消息提示
  • 返回值
    • HAL_StatusTypeDef:如果開啟成功,返回HAL_OK;如果失敗,返回HAL_ERROR
HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan);
  • 參數(shù)
    • hcan:指向CAN配置結(jié)構(gòu)體
  • 返回值
    • HAL_StatusTypeDef:如果開啟成功,返回HAL_OK;如果失敗,返回HAL_ERROR
HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig);
  • 參數(shù)
    • 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);
  • 參數(shù)
    • 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);
  • 參數(shù)
    • 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);
  • 在寫代碼的時(shí)候,在main.c中創(chuàng)建HAL_CAN_RxFifo0MsgPendingCallback函數(shù)
  • 在該函數(shù)中填寫在FIFO 0中已經(jīng)沒有正在等待接收的數(shù)據(jù)的時(shí)候開啟中斷,需要執(zhí)行的代碼
HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]);
  • 參數(shù)
    • hcan:指向CAN配置結(jié)構(gòu)體
    • RxFifo:指向負(fù)責(zé)接收的FIFO
    • pHeader:指向接收數(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

相關(guān)文章

  • 基于UCOSII的RS485通信(STM32F107)

    摘要:為了可靠工作,在總線狀態(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):...

    verano 評(píng)論0 收藏0
  • STM32CubeMX學(xué)習(xí)教程之硬件I2C讀取光照度

    摘要:使用庫讀寫環(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)功能:通...

    tinylcy 評(píng)論0 收藏0
  • 基于MDK創(chuàng)建STM32匯編語言工程——上機(jī)實(shí)驗(yàn)一(9527)

    摘要:設(shè)置下面的項(xiàng)為和項(xiàng)為,用于設(shè)置支持的軟硬件仿真。如有錯(cuò)誤,請(qǐng)斧正。參考文獻(xiàn)基于創(chuàng)建匯編語言工程并分析 文章目錄 1新建工程2配置環(huán)境3測(cè)試代碼4分析生成的H...

    joy968 評(píng)論0 收藏0
  • 單片機(jī)入門指南

    摘要:?jiǎn)纹瑱C(jī)入門指南本文基于常神文章基礎(chǔ)上將單片機(jī)入門部分進(jìn)行細(xì)化盡可能細(xì)節(jié)做到可實(shí)施性先引用一下常神的文章首先假設(shè)大家已經(jīng)對(duì)高中物理的電路部分有所了解。單片機(jī),如,是一種根據(jù)程序控制引腳高低電平的可編程器件,有些場(chǎng)合又將這種行為稱作嵌入式。 ...

    nevermind 評(píng)論0 收藏0
  • STM32學(xué)習(xí)——半天學(xué)完正點(diǎn)原子入門篇例程,STM32:學(xué)會(huì)了嗎?我:學(xué)廢了?

    本文代碼均來正點(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)中午了,所以我只...

    MingjunYang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<