CAN,Controller Area Network(控制器局域網(wǎng)絡(luò)),在汽車電子、工業(yè)控制領(lǐng)域的應(yīng)用比較多,通常用于局域組網(wǎng)。
CAN總線和UART、I2C、SPI總線最大的區(qū)別主要在于取消了傳統(tǒng)的地址編碼方式,理論上講總線上的互聯(lián)節(jié)點數(shù)不受限制,擁有強大的握手與出錯管理及重發(fā)機制,具有很強的抗干擾能力。
1
STM32 CAN 基礎(chǔ)內(nèi)容CAN網(wǎng)絡(luò)中主要由CAN控制器和CAN收發(fā)器組成,大部分STM32內(nèi)部都集成了CAN控制器,如果需要使用CAN功能,還需要在外部連接一個CAN收發(fā)器才能使用。
▲ CAN 網(wǎng)絡(luò)拓撲結(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總線
CAN總線上的數(shù)據(jù)是基于差分信號,通常只有兩根線:CAN_L和CAN_H。從STM32芯片引出來的兩個信號腳CAN發(fā)送和CAN接收,有點類似UART的收發(fā)引腳,但內(nèi)部控制邏輯完全不一樣。經(jīng)過CAN收發(fā)器后形成兩根信號線CAN_L和CAN_H掛到CAN總線上。
2. CAN波特率
CAN 總線屬于異步通信,和UART類似,因此具有通信的波特率,標準 CAN 波特率通常支持高達 1 Mb/s。當然,也可以配置成500Kb/s、 250Kb/s等。
CAN 波特率由多個參數(shù)決定,下面章節(jié)會講述波特率配置。
3. CAN發(fā)送
STM32集成的CAN控制器支持三個發(fā)送郵箱,也就是說可以支持隊列發(fā)送消息(數(shù)據(jù)),如果同一時間發(fā)送數(shù)據(jù)比較多,使用郵箱就比較高效,不用消耗CPU資源,CAN控制器自動發(fā)送,直到完成。
4. CAN接收
和發(fā)送類似,CAN接收支持接收FIFO,可以連續(xù)接收多個消息(數(shù)據(jù)),CPU空閑了再去處理接收到的數(shù)據(jù)。
同時,CAN控制器還支持接收過濾配置,也就是說,有些數(shù)據(jù)我不需要,CAN控制器可以自動過濾掉。
通過一張CAN框圖來認識CAN控制器:
關(guān)于CAN的更多信息,可以參看芯片對應(yīng)的手冊和CAN相關(guān)協(xié)議資料。
2
STM32 CAN 常規(guī)配置STM32 CAN控制器需要配置的參數(shù)比較多,對于初學者而言,重點就是波特率。如果你只使用一些基本的功能,不使用的功能建議參考官方代碼默認配置即可。
1. CAN引腳時鐘配置
引腳和時鐘是使用外設(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ù),需要進一步功能的作用,默認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波特率配置
波特率是第一步需要掌握的,波特率不對,就不能正常通信。波特率 = 時鐘 ÷ 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過濾配置CAN過濾是相對更高級的功能,建議深入了解,否則建議默認配置即可。
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);
以上是通過標準外設(shè)庫配置的參數(shù),使用STM32CubeMX就可以很輕松的一鍵配置了。
對CAN有一定基礎(chǔ)了解,同時掌握HAL庫使用方法的人,建議直接使用STM32CubemMX 配置并生成初始化代碼。
3
STM32 CAN 常見問題STM32的CAN控制器功能相對比較強大,實際開發(fā)過程中容易遇到問題,軟件硬件都有可能導致通信異常,下面整理幾點常見問題。
問題一:CAN總線接線問題
CAN控制器出來的信號為CAN_TX和CAN_RX,有點類似UART,但它和外面的收發(fā)器接法是TX對應(yīng)TX,不是UART交叉連接。
同時,CAN總線和485類似是差分信號,具有極性。通常CAN總線只有兩根線CAN_L和CAN_H。
上面指出來的兩點,任意一處接線錯誤都會導致通信失敗。所以,建議參考官方給出的電路原理圖。
問題二:通信波特率配置問題
CAN屬于異步通信,如果波特率不對,就會通信失敗,或者接收到亂碼。影響波特率的因素有很多:CAN時鐘、分頻值、位時序。
CAN時鐘也就是RCC出來進入CAN控制器的APB時鐘,比如上面代碼中配置的是APB1,42M時鐘。(一定要分清,不能認為是84M)。
位時序也是比較重要的一個配置,包含同步段、位段等,需要根據(jù)實際情況調(diào)整對應(yīng)的值。
問題三:CAN接收數(shù)據(jù)丟包問題
通常來說,CAN組網(wǎng)之后,總線上的數(shù)據(jù)量比較大,如果你配置或者處理不正確,就會導致丟失數(shù)據(jù)的情況。
1. CAN接收數(shù)據(jù),通常使用中斷
CAN中斷入口和CAN中斷函數(shù)處理比較容易引起數(shù)據(jù)丟失的問題。
有些CAN中斷入口和其它外設(shè)的共用,比如STM32F103的CAN和USB共用一個中斷入口。
通信時,由于CAN中斷頻率較高,中斷函數(shù)不能占用太多時間,通常來說,只對接收到的數(shù)據(jù)進行一些簡單搬運處理,不建議在中斷程序里處理較為復雜的邏輯或算法運算。
2. 雙CAN過濾器管理問題
部分STM32芯片具有雙CAN模塊,從整體功能上講,兩個CAN是獨立的。但是,兩個CAN共用過濾器管理模塊,對于STM32芯片來講,該過濾器控制模塊由CAN1統(tǒng)一管理,所以即使只是單獨使用CAN2進行收發(fā),也須開啟CAN1,否則會因為過濾器未能開啟,導致單獨使用CAN2時無法收發(fā)的情形。
3.CAN接收過濾
CAN總線接收可以通過配置,對一些“無用”或不需要的信息進行過濾,換言之即對總線上的信息選擇性地進行接收。這個功能也算是CAN總線的高級功能,只有深入理解該功能之后方能靈活使用之。否則會因為過濾配置不當導致收發(fā)異常。
復盤一下▼CAN 基礎(chǔ)內(nèi)容:CAN總線、波特率、發(fā)送和接收;▼CAN 常規(guī)配置:引腳時鐘、常規(guī)配置、波特率配置、過濾配置;▼CAN 常見問題:接線問題、波特率配置問題、接收數(shù)據(jù)丟包問題;
原文標題:STM32學習筆記 | CAN總線收發(fā)數(shù)據(jù)常見問題分析
文章出處:【微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責任編輯:haq
-
CAN
+關(guān)注
關(guān)注
57文章
2762瀏覽量
464007 -
STM32
+關(guān)注
關(guān)注
2270文章
10915瀏覽量
356743
原文標題:STM32學習筆記 | CAN總線收發(fā)數(shù)據(jù)常見問題分析
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論