當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式微處理器
[導(dǎo)讀]大家好,我是小麥。最近在調(diào)試一個CAN總線的設(shè)備時遇到了一些問題,在此簡單總結(jié)一下。本文將對CAN總線進行簡單介紹,包括CAN的硬件鏈路層、協(xié)議層,以及調(diào)試的一些心得。目錄什么是CAN總線?物理層差分信號連接方式CAN節(jié)點CAN協(xié)議如何尋址?幀類型數(shù)據(jù)幀遠程幀錯誤幀過載幀消息時序...

大家好,我是小麥。最近在調(diào)試一個CAN總線的設(shè)備時遇到了一些問題,在此簡單總結(jié)一下。本文將對CAN總線進行簡單介紹,包括CAN的硬件鏈路層、協(xié)議層,以及調(diào)試的一些心得。

目錄

  • 什么是CAN總線?

  • 物理層

    • 差分信號

    • 連接方式

    • CAN節(jié)點

  • CAN協(xié)議

  • 如何尋址?

  • 幀類型

    • 數(shù)據(jù)幀

    • 遠程幀

    • 錯誤幀

    • 過載幀

  • 消息時序以及同步

    • 位時序

    • 波特率

    • 消息過濾器

  • 如何配置?

  • 總結(jié)

  • 參考

什么是CAN總線?

Controller Area Network,簡稱CAN或者CAN bus) 是一種功能豐富的串行總線標(biāo)準(zhǔn),最早的CAN控制芯片在奔馳車上應(yīng)用并量產(chǎn),因為支持多主機,多從機的優(yōu)點,所以一輛車所有控制器,傳感器,電子設(shè)備直接的通信只需要兩條線就夠了,大大優(yōu)化了整車的布線。[^wiki can bus]

隨著技術(shù)的不斷發(fā)展,CAN發(fā)布了相應(yīng)的標(biāo)準(zhǔn),國際化標(biāo)準(zhǔn)組織,公布了CAN的不同標(biāo)準(zhǔn);

標(biāo)準(zhǔn)涵蓋內(nèi)容
ISO 11898-1數(shù)據(jù)鏈路層
ISO 11898-2高速CAN的物理層
ISO 11898-3低速容錯CAN的物理層
ISO 11898-1 ?,ISO 11898-2是對應(yīng)的設(shè)計標(biāo)準(zhǔn),去搜索就可以知道這個技術(shù)點是如何進行設(shè)計的。

物理層

差分信號

這里我們介紹一下物理層,什么是物理層呢?就是CAN的電信號的傳輸過程。CAN是串行異步通訊,只有CAN_HIGHCAN_LOW兩條差分信號線,數(shù)據(jù)通過差分信號的方式進行通訊,其優(yōu)點就是可以增加信號的抗干擾能力,抑制共模信號的干擾;

具體如下圖所示;

所以,信號在變成一個字節(jié)一個字節(jié)的數(shù)字信號之前,就是按照這種差分形式的模擬信號來傳輸?shù)摹?/p>我們可以簡單地理解一下,當(dāng)CAN_HIGH減去CAN_LOW大于某個閾值的時候,可以把它當(dāng)做邏輯高,反之,當(dāng)小于某一個閾值時,就變成邏輯低。

下面我們再來看看CAN總線設(shè)備之間是如何連接的。

連接方式

CAN總線支持多個節(jié)點掛載在總線上,比較類似I2C總線,可以在SCLSDA上掛載多個從機,具體如下圖所示;

不過CAN總線其實沒有主從的概念,每個設(shè)備都是一個節(jié)點(Node),節(jié)點直接可以相互通訊,相較于I2C總線,CAN總線設(shè)置了終端電阻,常見的一種閉環(huán)連接模式,相對的還有開環(huán)的連接模式。

不同的連接模式,他們的通訊速率也大不相同,這里也就是高速CAN和低速CAN的區(qū)別。

兩條電線組成一條雙絞線,并且接有120Ω的特性阻抗。ISO 11898-2,也稱為高速度CAN。它在總線的兩端均接有120Ω電阻。

使用了120Ω終端電阻(這是CAN的ISO標(biāo)準(zhǔn)里規(guī)定的),這種模式的最高通訊速率可以達到1Mbps,下面是傳輸距離和傳輸速度的關(guān)系;

CAN總線長度與信號速率關(guān)系
高速CAN的拓撲結(jié)構(gòu)具體如下所示;

還有一種是低速CAN,或者也叫做容錯CAN,低速容錯 CAN 總線將通訊的最大帶寬從 1 Mbps 降低到 125 Kbps,并且不再在總線的起點和終點使用兩個終端電阻,而是將電阻分布在每個節(jié)點上。具體如下圖所示;

由于高速CAN和低速CAN的拓撲結(jié)構(gòu)不同,另外終端電阻的分布也不同,所以CAN_HIGHCAN_LOW上的電平是不相同的,這里有隱性電平和顯性電平。

硬件上的連接基本上都搞清楚了,下面就是如何去實現(xiàn)一個具體的CAN節(jié)點。我們來簡單地介紹一下。

CAN節(jié)點

CAN節(jié)點通常分為三個部分;

  • MCU/CPU;
  • CAN控制器,
  • CAN收發(fā)器;
通常一些單片機內(nèi)部就集成了相應(yīng)的CAN控制器外設(shè),比如我們比較常用的單片機——STM32,所以我們常見的結(jié)構(gòu)一般是這樣子的。

所以整體的流程是這樣的,如下:

  • CAN總線上通過差分信號進行數(shù)據(jù)傳輸;
  • CAN收發(fā)器將差分信號轉(zhuǎn)換為TTL電平信號,或者將TTL電平信號轉(zhuǎn)換為差分信號;
  • CAN控制器將TTL電平信號接收,并傳輸給MCU;
那么,對于單片機開發(fā)者而言,需要關(guān)注的就是最終CAN控制器傳輸給MCU的數(shù)據(jù),如何去配置CAN控制器,以及使用CAN控制進行數(shù)據(jù)的讀取和發(fā)送。

既然這樣,我們就不得不去了解一下CAN總線的通信原理,如何尋址,上層協(xié)議如何規(guī)定的。

CAN協(xié)議

CAN協(xié)議和網(wǎng)絡(luò)協(xié)議比較類似,進行了分層的設(shè)計思想;

按照我的理解;

  • 物理層就是前面提到過的硬件拓撲結(jié)構(gòu),包括高速CAN和低速CAN,而CAN收發(fā)器就屬于物理層;
  • 傳輸層則是CAN控制器所需要做的事情,包括CAN時序,同步,消息仲裁,確認,錯誤檢驗等,這個比較復(fù)雜,如果只是應(yīng)用開發(fā),我認為,簡單了解一下即可;這一層需要做的工作包括:
    • 故障約束;
    • 錯誤監(jiān)測;
    • 消息驗證;
    • 信息確認;
    • 仲裁;
    • 信息幀;
    • 傳輸速率和時間;
    • 路由信息;
  • 對象層,MCU應(yīng)該是屬于這一層,我們需要對CAN消息做信息的過濾設(shè)置,CAN消息的處理等等;
  • 應(yīng)用層就是基于對象層的進一步封裝,不同的CAN標(biāo)準(zhǔn),比如工業(yè)自動化領(lǐng)域的CANopen,汽車診斷ISO 14229 定義的UDS等等;

如何尋址?

CAN總線上的每個節(jié)點不需要設(shè)置節(jié)點的地址,而是通過消息的標(biāo)識符(Identifier)來區(qū)別信息。因為CAN總線的消息是廣播的(就是大家都可以收到消息),比如總線上有節(jié)點A,節(jié)點B,節(jié)點C,那么節(jié)點A發(fā)消息,節(jié)點B和節(jié)點C都會收到消息;

節(jié)點B 和 節(jié)點C 會根據(jù)消息中的標(biāo)識符,以及B和C中的消息過濾規(guī)則進行比較,如果不滿足規(guī)則,就不接受這條信息。

這里需要注意的是:

  • 發(fā)送消息的時候,總線必須處于空閑狀態(tài);
  • 標(biāo)識符越小,則消息獲取總線的優(yōu)先級越高;
在這里我們已經(jīng)了解如何尋址,下面就看一下消息幀了。

幀類型

CAN有4種幀類型:

  • 數(shù)據(jù)幀:包含用于傳輸?shù)墓?jié)點數(shù)據(jù)的幀
  • 遠程幀:請求傳輸特定標(biāo)識符的幀
  • 錯誤幀:由任何檢測到錯誤的節(jié)點發(fā)送的幀
  • 過載幀:在數(shù)據(jù)幀或遠程幀之間插入延遲的幀
這里我們有必要重點了解一下數(shù)據(jù)幀,下面繼續(xù)介紹各種幀之間的區(qū)別。

數(shù)據(jù)幀

數(shù)據(jù)幀分為標(biāo)準(zhǔn)幀和擴展幀兩種格式;

  • 基本幀格式:有11個標(biāo)識符位
  • 擴展幀格式:有29個標(biāo)識符位
數(shù)據(jù)幀的結(jié)構(gòu)具體如下所示;

數(shù)據(jù)幀格式
簡單介紹一下數(shù)據(jù)幀的細節(jié);

  • sofstart of frame,表示數(shù)據(jù)幀開始;(1 bit)

  • Identifier:標(biāo)準(zhǔn)格式11 bit,擴展格式29 bit包括Base Identifier(11 bit)和Extended Identifier(18 bit),該區(qū)段標(biāo)識數(shù)據(jù)幀的優(yōu)先級,數(shù)值越小,優(yōu)先級越高;

  • RTR:遠程傳輸請求位,0時表示為數(shù)據(jù)幀,1表示為遠程幀,也就是說RTR=1時,消息幀的Data Field為空;(1 bit)

  • IDE:標(biāo)識符擴展位,0時表示為標(biāo)準(zhǔn)格式,1表示為擴展格式;(1 bit)

  • DLC:數(shù)據(jù)長度代碼,0~8表示數(shù)據(jù)長度為0~8 Byte;(4 bit)

  • Data Field:數(shù)據(jù)域;(0~8 Byte)

  • CRC Sequence:校驗域,校驗算法,

  • DEL:校驗域和應(yīng)答域的隱性界定符;(1 bit)

  • ACK:應(yīng)答,確認數(shù)據(jù)是否正常接收,所謂正常接收是指不含填充錯誤、格式錯誤、 CRC 錯誤。發(fā)送節(jié)點將此位為1,接收節(jié)點正常接收數(shù)據(jù)后將此位置為0;(1 bit)

  • SRR:替代遠程請求位,在擴展格式中占位用,必須為1;(1 bit)

  • EOF:連續(xù)7個隱性位(1)表示幀結(jié)束;(7 bit)

  • ITM:幀間空間,Intermission (ITM),又稱Interframe Space (IFS),連續(xù)3個隱性位,但它不屬于數(shù)據(jù)幀。幀間空間是用于將數(shù)據(jù)幀和遠程幀與前面的幀分離開來的幀。數(shù)據(jù)幀和遠程幀可通過插入幀間空間將本幀與前面的任何幀(數(shù)據(jù)幀、遙控幀、錯誤幀、過載幀)分開。過載幀和錯誤幀前不能插入幀間空間。

遠程幀

一般地,數(shù)據(jù)是由發(fā)送單元主動向總線上發(fā)送的,但也存在接收單元主動向發(fā)送單元請求數(shù)據(jù)的情況。遠程幀的作用就在于此,它是接收單元向發(fā)送單元請求發(fā)送數(shù)據(jù)的幀。遠程幀與數(shù)據(jù)幀的幀結(jié)構(gòu)類似,如上圖X所示。遠程幀與數(shù)據(jù)幀的幀結(jié)構(gòu)區(qū)別有兩點:

  • 數(shù)據(jù)幀的 RTR 值為“0”,遠程幀的 RTR 值為“1”
  • 遠程幀沒有數(shù)據(jù)塊
遠程幀的 DLC 塊表示請求發(fā)送單元發(fā)送的數(shù)據(jù)長度(Byte)。當(dāng)總線上具有相同標(biāo)識符的數(shù)據(jù)幀和遠程幀同時發(fā)送時,由于數(shù)據(jù)幀的 RTR 位是顯性的,數(shù)據(jù)幀將在仲裁中贏得總線控制權(quán)。

錯誤幀

用于在接收和發(fā)送消息時檢測出錯誤時,通知錯誤的幀。錯誤幀由錯誤標(biāo)志和錯誤界定符構(gòu)成。錯誤幀的幀結(jié)構(gòu)如圖11示。

  • 錯誤標(biāo)志:

    個顯性/隱性重疊位

    • 主動錯誤標(biāo)志(6個顯性位):處于主動錯誤狀態(tài)的單元檢測出錯誤時輸出的錯誤標(biāo)志
    • 被動錯誤標(biāo)志(6個隱性位):處于被動錯誤狀態(tài)的單元檢測出錯誤時輸出的錯誤標(biāo)志
  • 錯誤界定符:8 個隱性位


過載幀

過載幀是用于接收單元通知發(fā)送單元它尚未完成接收準(zhǔn)備的幀。在兩種情況下,節(jié)點會發(fā)送過載幀:

  • 接收單元條件的制約,要求發(fā)送節(jié)點延緩下一個數(shù)據(jù)幀或遠程幀的傳輸;
  • 幀間空間(Intermission)的 3 bit 內(nèi)檢測到顯性位
每個節(jié)點最多連續(xù)發(fā)送兩條過載幀。過載幀由過載標(biāo)志和過載界定符(8 個隱性位)構(gòu)成。數(shù)據(jù)幀的幀結(jié)構(gòu)如圖12所示。

can_overload_frame
這里基本把幀介紹完了,但是每個節(jié)點之間的通訊,我們?nèi)绾沃肋@一幀開始接收了,這一幀已經(jīng)接收結(jié)束了呢?下面就需要了解一下消息的時序和消息同步的方法。

消息時序以及同步

位時序

在講CAN消息時序和同步之前,我們可以對照一下UART串口的傳輸協(xié)議,他有起始位和停止位,然后大家都規(guī)定使用相同的通訊速率(波特率);

其實CAN通訊也是類似的方式,它屬于異步通訊,沒有時鐘信號線,所以所有節(jié)點之間要約定好使用相同的波特率來傳輸數(shù)據(jù)。

在總線空閑一段時間后,在(起始位) 進行硬同步,同步方式是將每一位劃分成多個稱為量子的時間段(time quanta),并分配一定數(shù)量的量子到位中的四個階段完成的。

這四個階段分別為:

  • SYNC_SEG:同步段,1 個時間量子長度。它用于同步各種總線節(jié)點;
  • PROP_SEG:傳播段,1~8 時間量子長度。它用于補償網(wǎng)絡(luò)上的信號延遲。
  • PHASE_SEG_1:相位緩沖段1,1~8 時間量子長度。它用于補償邊緣相位誤差,在重新同步期間可能會延長。
  • PHASE_SEG_2:相位緩沖段2,2~8 時間量子長度。它用于補償邊緣相位誤差
具體如下圖所示;

位時序

波特率

如何計算波特率,需要知道每個量子時間的長度(time quanta),以及每一位需要多少個量子時間,

假設(shè)這里time quanta = 1us ,并且1 bit = 8 tq,那么上圖中的波特率就應(yīng)該是:

消息過濾器

前面有提到消息在CAN總線上是廣播式的,但并不是所有節(jié)點都會對總線上所有消息感興趣。節(jié)點通過控制器中過濾碼(Filter Code )和掩碼(Mask Code),再檢驗總線上消息的標(biāo)識符,來判斷是否接收該消息(Message Filtering)。

對于掩碼,“1”表示該位與本節(jié)點相關(guān),“0”表示該位與本節(jié)點不相關(guān)。舉例如下:

例1:僅接收消息標(biāo)識符為00001567(十六進制)的幀

  • 設(shè)置過濾碼為00001567
  • 設(shè)置掩碼為1FFFFFFF
節(jié)點檢測消息的標(biāo)識符的所有位(29位),如果標(biāo)識符為00001567接收,否則舍棄。

例2:接收消息標(biāo)識符為000015670000156F 的幀

  • 設(shè)置過濾碼為00001560
  • 設(shè)置掩碼為1FFFFFF0
節(jié)點檢測消息的標(biāo)識符的高25位,最低的4位則不care。如果標(biāo)識符最高25位相同則接收,否則舍棄。

例3:接收消息標(biāo)識符為0000156000001567 的幀

  • 設(shè)置過濾碼為00001560
  • 設(shè)置掩碼為1FFFFFF8
節(jié)點檢測消息的標(biāo)識符的高26位,最低的3位則不care。如果標(biāo)識符最高26位相同則接收,否則舍棄。

例4:接收所有消息幀幀

  • 設(shè)置過濾碼為0
  • 設(shè)置掩碼為0
節(jié)點接收總線上所有消息。

如何配置?

上面介紹了幀類型,那么如何基于MCU進行配置呢?這里以STM32F407為硬件平臺,使用HAL庫進行初始化,看一下都對哪些地方進行了配置。一般來說,我們需要配置CAN的波特率,消息過濾器等等,下面是簡單的配置的代碼;

CAN_HandleTypeDef?hCAN;
void?MX_CAN_Init(void)
{
????CAN_FilterTypeDef???sFilterConfig;
????/*CAN單元初始化*/
????hCAN.Instance?=?CAN1;??????/*?CAN外設(shè)?*/
?
????/*?BTR-BRP?波特率分頻器??定義了時間單元的時間長度42/(1 6 7)/6=500Kbps?*/
????hCAN.Init.Prescaler?=?6;
????hCAN.Init.Mode?=?CAN_MODE_NORMAL;???/*?正常工作模式?*/
????hCAN.Init.SyncJumpWidth?=?CAN_SJW_1TQ;??/*?BTR-SJW?重新同步跳躍寬度?1個時間單元?*/
????hCAN.Init.TimeSeg1?=?CAN_BS1_6TQ;???/*?BTR-TS1?時間段1?占用了6個時間單元?*/
????hCAN.Init.TimeSeg2?=?CAN_BS2_7TQ;???/*?BTR-TS1?時間段2?占用了7個時間單元?*/
????hCAN.Init.TimeTriggeredMode?=?DISABLE;??/*?MCR-TTCM??關(guān)閉時間觸發(fā)通信模式使能?*/?
????hCAN.Init.AutoBusOff?=?ENABLE;????/*?MCR-ABOM??自動離線管理?*/
????hCAN.Init.AutoWakeUp?=?ENABLE;????/*?MCR-AWUM??使用自動喚醒模式?*/
????hCAN.Init.AutoRetransmission?=?DISABLE;??/*?MCR-NART??禁止報文自動重傳???DISABLE-自動重傳?*/
????/*?MCR-RFLM??接收FIFO?鎖定模式??DISABLE-溢出時新報文會覆蓋原有報文?*/
????hCAN.Init.ReceiveFifoLocked?=?DISABLE;??
????/*?MCR-TXFP??發(fā)送FIFO優(yōu)先級?DISABLE-優(yōu)先級取決于報文標(biāo)示符?*/
????hCAN.Init.TransmitFifoPriority?=?DISABLE;?
????if?(HAL_CAN_Init(
嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉