最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

STM32學(xué)習(xí)筆記—CAN總線(xiàn)收發(fā)數(shù)據(jù)常見(jiàn)問(wèn)題分析

2020-05-28 09:35 作者:電堂科技  | 我要投稿

CAN,Controller Area Network(控制器局域網(wǎng)絡(luò)),在汽車(chē)電子、工業(yè)控制領(lǐng)域應(yīng)用比較多,通常用于局域組網(wǎng)。

這是第9篇學(xué)習(xí)分享文章,《STM32學(xué)習(xí)筆記》之CAN總線(xiàn)收發(fā)數(shù)據(jù)常見(jiàn)問(wèn)題分析。

CAN總線(xiàn)和UART、I2C、SPI總線(xiàn)最大的區(qū)別主要在于取消了傳統(tǒng)的地址編碼方式,理論上講總線(xiàn)上的互聯(lián)節(jié)點(diǎn)數(shù)不受限制,擁有強(qiáng)大的握手與出錯(cuò)管理及重發(fā)機(jī)制,具有很強(qiáng)的抗干擾能力。


STM32 CAN 基礎(chǔ)內(nèi)容

CAN網(wǎng)絡(luò)中主要由CAN控制器和CAN收發(fā)器組成,大部分STM32內(nèi)部都集成了CAN控制器,如果需要使用CAN功能,還需要在外部連接一個(gè)CAN收發(fā)器才能使用。


▲ CAN 網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)圖

STM32內(nèi)部集成的CAN控制器,支持 2.0A 和 B 版本的 CAN 協(xié)議。還有通信速度更快的CAN FD、 CAN XL,目前一部分STM32支持CAN FD(比如STM32H7)。

下面結(jié)合STM32F4描述一下關(guān)于CAN基本的信息:


1. CAN總線(xiàn)

CAN總線(xiàn)上的數(shù)據(jù)是基于差分信號(hào),通常只有兩根線(xiàn):CAN_L和CAN_H。從STM32芯片引出來(lái)的兩個(gè)信號(hào)腳CAN發(fā)送和CAN接收,有點(diǎn)類(lèi)似UART的收發(fā)引腳,但內(nèi)部控制邏輯完全不一樣。經(jīng)過(guò)CAN收發(fā)器后形成兩根信號(hào)線(xiàn)CAN_L和CAN_H掛到CAN總線(xiàn)上。

2. CAN波特率

CAN 總線(xiàn)屬于異步通信,和UART類(lèi)似,因此具有通信的波特率,標(biāo)準(zhǔn) CAN?波特率通常支持高達(dá) 1 Mb/s。當(dāng)然,也可以配置成500Kb/s、?250Kb/s等。

CAN?波特率由多個(gè)參數(shù)決定,下面章節(jié)會(huì)講述波特率配置。

3. CAN發(fā)送

STM32集成的CAN控制器支持三個(gè)發(fā)送郵箱,也就是說(shuō)可以支持隊(duì)列發(fā)送消息(數(shù)據(jù)),如果同一時(shí)間發(fā)送數(shù)據(jù)比較多,使用郵箱就比較高效,不用消耗CPU資源,CAN控制器自動(dòng)發(fā)送,直到完成。

4. CAN接收

和發(fā)送類(lèi)似,CAN接收支持接收FIFO,可以連續(xù)接收多個(gè)消息(數(shù)據(jù)),CPU空閑了再去處理接收到的數(shù)據(jù)。

同時(shí),CAN控制器還支持接收過(guò)濾配置,也就是說(shuō),有些數(shù)據(jù)我不需要,CAN控制器可以自動(dòng)過(guò)濾掉。

通過(guò)一張CAN框圖來(lái)認(rèn)識(shí)CAN控制器:

關(guān)于CAN的更多信息,可以參看芯片對(duì)應(yīng)的手冊(cè)和CAN相關(guān)協(xié)議資料。


STM32 CAN?常規(guī)配置

STM32 CAN控制器需要配置的參數(shù)比較多,對(duì)于初學(xué)者而言,重點(diǎn)就是波特率。如果你只使用一些基本的功能,不使用的功能建議參考官方代碼默認(rèn)配置即可。


1. CAN引腳時(shí)鐘配置

引腳和時(shí)鐘是使用外設(shè)基本的配置,比如F4例程:

GPIO_InitTypeDef ?GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK, ENABLE);RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);
GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT);GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT);
GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd ?= GPIO_PuPd_UP;GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure);

2. CAN常規(guī)配置

這些基本參數(shù),需要進(jìn)一步功能的作用,默認(rèn)DISABLE。

CAN_InitTypeDef CAN_InitStructure;
CAN_InitStructure.CAN_TTCM = DISABLE;CAN_InitStructure.CAN_ABOM = DISABLE;CAN_InitStructure.CAN_AWUM = DISABLE;CAN_InitStructure.CAN_NART = DISABLE;CAN_InitStructure.CAN_RFLM = DISABLE;CAN_InitStructure.CAN_TXFP = DISABLE;CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;

3. CAN波特率配置

波特率是第一步需要掌握的,波特率不對(duì),就不能正常通信。波特率 =?時(shí)鐘?÷ Prescaler ÷?(SJW + BS1 + BS2);

比如:42M / 2 /?(1 + 12 +8)?=?1M

CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;CAN_InitStructure.CAN_Prescaler = 2;

4. CAN過(guò)濾配置
CAN過(guò)濾是相對(duì)更高級(jí)的功能,建議深入了解,否則建議默認(rèn)配置即可。

CAN_FilterInitTypeDef ?CAN_FilterInitStructure;CAN_FilterInitStructure.CAN_FilterNumber = 0;CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);

以上是通過(guò)標(biāo)準(zhǔn)外設(shè)庫(kù)配置的參數(shù),使用STM32CubeMX就可以很輕松的一鍵配置了。

對(duì)CAN有一定基礎(chǔ)了解,同時(shí)掌握HAL庫(kù)使用方法的人,建議直接使用STM32CubemMX 配置并生成初始化代碼。


STM32 CAN 常見(jiàn)問(wèn)題

STM32的CAN控制器功能相對(duì)比較強(qiáng)大,實(shí)際開(kāi)發(fā)過(guò)程中容易遇到問(wèn)題,軟件硬件都有可能導(dǎo)致通信異常,下面整理幾點(diǎn)常見(jiàn)問(wèn)題。


問(wèn)題一:CAN總線(xiàn)接線(xiàn)問(wèn)題

CAN控制器出來(lái)的信號(hào)為CAN_TX和CAN_RX,有點(diǎn)類(lèi)似UART,但它和外面的收發(fā)器接法是TX對(duì)應(yīng)TX,不是UART交叉連接。

同時(shí),CAN總線(xiàn)和485類(lèi)似是差分信號(hào),具有極性。通常CAN總線(xiàn)只有兩根線(xiàn)CAN_L和CAN_H。

上面指出來(lái)的兩點(diǎn),任意一處接線(xiàn)錯(cuò)誤都會(huì)導(dǎo)致通信失敗。所以,建議參考官方給出的電路原理圖。


問(wèn)題二:通信波特率配置問(wèn)題

CAN屬于異步通信,如果波特率不對(duì),就會(huì)通信失敗,或者接收到亂碼。影響波特率的因素有很多:CAN時(shí)鐘、分頻值、位時(shí)序。

CAN時(shí)鐘也就是RCC出來(lái)進(jìn)入CAN控制器的APB時(shí)鐘,比如上面代碼中配置的是APB1,42M時(shí)鐘。(一定要分清,不能認(rèn)為是84M)。


位時(shí)序也是比較重要的一個(gè)配置,包含同步段、位段等,需要根據(jù)實(shí)際情況調(diào)整對(duì)應(yīng)的值。


問(wèn)題三:CAN接收數(shù)據(jù)丟包問(wèn)題

通常來(lái)說(shuō),CAN組網(wǎng)之后,總線(xiàn)上的數(shù)據(jù)量比較大,如果你配置或者處理不正確,就會(huì)導(dǎo)致丟失數(shù)據(jù)的情況。

1. CAN接收數(shù)據(jù),通常使用中斷

CAN中斷入口和CAN中斷函數(shù)處理比較容易引起數(shù)據(jù)丟失的問(wèn)題。

有些CAN中斷入口和其它外設(shè)的共用,比如STM32F103的CAN和USB共用一個(gè)中斷入口。

通信時(shí),由于CAN中斷頻率較高,中斷函數(shù)不能占用太多時(shí)間,通常來(lái)說(shuō),只對(duì)接收到的數(shù)據(jù)進(jìn)行一些簡(jiǎn)單搬運(yùn)處理,不建議在中斷程序里處理較為復(fù)雜的邏輯或算法運(yùn)算。

2. 雙CAN過(guò)濾器管理問(wèn)題

部分STM32芯片具有雙CAN模塊,從整體功能上講,兩個(gè)CAN是獨(dú)立的。但是,兩個(gè)CAN共用過(guò)濾器管理模塊,對(duì)于STM32芯片來(lái)講,該過(guò)濾器控制模塊由CAN1統(tǒng)一管理,所以即使只是單獨(dú)使用CAN2進(jìn)行收發(fā),也須開(kāi)啟CAN1,否則會(huì)因?yàn)檫^(guò)濾器未能開(kāi)啟,導(dǎo)致單獨(dú)使用CAN2時(shí)無(wú)法收發(fā)的情形。

3.CAN接收過(guò)濾

CAN總線(xiàn)接收可以通過(guò)配置,對(duì)一些“無(wú)用”或不需要的信息進(jìn)行過(guò)濾,換言之即對(duì)總線(xiàn)上的信息選擇性地進(jìn)行接收。這個(gè)功能也算是CAN總線(xiàn)的高級(jí)功能,只有深入理解該功能之后方能靈活使用之。否則會(huì)因?yàn)檫^(guò)濾配置不當(dāng)導(dǎo)致收發(fā)異常。

關(guān)注微信公眾號(hào)“STM32”了解最新信息


STM32學(xué)習(xí)筆記—CAN總線(xiàn)收發(fā)數(shù)據(jù)常見(jiàn)問(wèn)題分析的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
太谷县| 枝江市| 泗水县| 大竹县| 鹿泉市| 镇沅| 昌江| 大姚县| 深圳市| 宜阳县| 临安市| 肃宁县| 平安县| 南充市| 武宁县| 迁西县| 自贡市| 遂川县| 大同市| 犍为县| 荃湾区| 营山县| 甘南县| 石屏县| 固镇县| 肃宁县| 凤台县| 花莲市| 舞阳县| 库尔勒市| 汕头市| 西林县| 库伦旗| 田林县| 石渠县| 和林格尔县| 花莲市| 赤峰市| 汤阴县| 剑阁县| 南木林县|