CAN通信


CAN通信

本文結合多篇博客整合,加上我自己的理解,綜合形成,用來預習CAN章節應該問題不大。

觀看建議

必看:

  1. CAN協議簡介
  2. CAN物理層
  3. CAN的報文種類及結構
  4. STM32的CAN外設簡介

其他了解即可

1 CAN協議簡介

瞥一眼即可

2 CAN物理層

CAN是一種異步通訊,只具有CAN_High和CAN_Low兩條信號線,共同構成一組差分信號線,以差分信號的形式進行通訊。

2.1 CAN物理層的兩種形式

  1. 閉環總線網絡(高速)
    遵循ISO11898標准的高速、短距離"閉環網絡",它的總線最大長度為40m,通信速度最高為1Mbps,總線的兩端各要求有一個"120歐"的電阻。
    CAN閉環總線通訊網絡

  2. 開環總線網絡(低速)
    遵循ISO11519-2標准的低速、遠距離"開環網絡",它的最大傳輸距離為1km,最高通訊速率為125kbps,兩根總線是獨立的、不形成閉環,要求每根總線上各串聯有一個"2.2千歐"的電阻。
    CAN開環總線通訊網絡

我們現在使用的主要為閉環總線網絡

2.2 通訊節點

CAN通訊節點由一個CAN控制器及CAN收發器組成,控制器與收發器之間通過CAN_Tx及CAN_Rx信號線相連,收發器與CAN總線之間使用CAN_High及CAN_Low信號線相連。其中CAN_Tx及CAN_Rx使用普通的類似TTL邏輯信號,而CAN_High及CAN_Low是一對差分信號線。
當CAN節點需要發送數據時,控制器把要發送的二進制編碼通過CAN_Tx線發送到收發器,然后由收發器把這個普通的邏輯電平信號轉化成差分信號,通過差分線CAN_High和CAN_Low線輸出到CAN總線網絡。而通過收發器接收總線上的數據到控制器時,則是相反的過程,收發器把總線上收到的CAN_High及CAN_Low信號轉化成普通的邏輯電平信號,通過CAN_Rx輸出到控制器中。

2.3 差分信號

什么是差分信號

差分信號優點:

  1. 抗干擾能力強,當外界存在噪聲干擾時,幾乎會同時耦合到兩條信號線上,而接收端只關心兩個信號的差值,所以外界的共模噪聲可以被完全抵消。

  2. 能有效抑制它對外部的電磁干擾,同樣的道理,由於兩根信號的極性相反,他們對外輻射的電磁場可以相互抵消,耦合的越緊密,泄放到外界的電磁能量越少。

  3. 時序定位精確,由於差分信號的開關變化是位於兩個信號的交點,而不像普通單端信號依靠高低兩個閾值電壓判斷,因而受工藝,溫度的影響小,能降低時序上的誤差,同時也更適合於低幅度信號的電路。

2.4 CAN協議中的差分信號

CAN的差分信號(閉環高速)

3 協議層

3.1 CAN的波特率及位同步

由於CAN屬於異步通訊,沒有時鍾信號線,連接在同一個總線網絡中的各個節點會像串口異步通訊那樣,節點間使用約定好的波特率進行通訊,特別地,CAN還會使用"位同步"的方式來抗干擾、吸收誤差,實現對總線電平信號進行正確的采樣,確保通訊正常。

3.1.1 位時序分解

為了實現位同步,CAN協議把每一個數據位的時序分解成SS段、PTS段、PBS1段、PBS2段,這四段的長度加起來即為一個CAN數據位的長度。分解后最小的時間單位是Tq,而一個完整的位由8~25個Tq組成。為方便表示,高低電平直接代表信號邏輯0或邏輯1(不是差分信號)。
CAN位時序分解圖

該圖中表示的CAN通訊信號每一個數據位的長度為19Tq,其中SS段占1Tq,PTS段占6Tq,PBS1段占5Tq,PBS2段占7Tq。信號的采樣點位於PBS1段與PBS2段之間,通過控制各段的長度,可以對采樣點的位置進行偏移,以便准確地采樣。

各段的作用如介紹下:

  1. SS段(SYNC SEG)
    SS譯為同步段,若通訊節點檢測到總線上信號的跳變沿被包含在SS段的范圍之內,則表示節點與總線的時序是同步的,當節點與總線同步時,采樣點采集到的總線電平即可被確定為該位的電平。SS段的大小固定為1Tq。

  2. PTS段(PROP SEG)
    PTS譯為傳播時間段,這個時間段是用於補償網絡的物理延時時間。是總線上輸入比較器延時和輸出驅動器延時總和的兩倍。PTS段的大小可以為1~8Tq。

  3. PBS1段(PHASE SEG1),
    PBS1譯為相位緩沖段,主要用來補償邊沿階段的誤差,它的時間長度在重新同步的時候可以加長。PBS1段的初始大小可以為1~8Tq。

  4. PBS2段(PHASE SEG2)
    PBS2這是另一個相位緩沖段,也是用來補償邊沿階段誤差的,它的時間長度在重新同步時可以縮短。PBS2段的初始大小可以為2~8Tq。

3.1.2 通訊的波特率

總線上的各個通訊節點只要約定好1個Tq的時間長度以及每一個數據位占據多少個Tq,就可以確定CAN通訊的波特率。

3.1.3 同步過程分析

3.1.3.1 硬同步

若某個CAN節點通過總線發送數據時,它會發送一個表示通訊起始的信號(即下一小節介紹的幀起始信號),該信號是一個由高變低的下降沿。而掛載到CAN總線上的通訊節點在不發送數據時,會時刻檢測總線上的信號。
某節點檢測到總線的幀起始信號不在節點內部時序的SS段范圍,所以判斷它自己的內部時序與總線不同步,因而這個狀態的采樣點采集得的數據是不正確的。所以節點以硬同步的方式調整,把自己的位時序中的SS段平移至總線出現下降沿的部分,獲得同步,同步后采樣點就可以采集得正確數據了。
硬同步過程圖

3.1.3.2 重新同步

前面的硬同步只是當存在幀起始信號時才起作用,如果在一幀很長的數據內,節點信號與總線信號相位有偏移時,這種同步方式就無能為力了。因而需要引入重新同步方式,它利用普通數據位的高至低電平的跳變沿來同步(幀起始信號是特殊的跳變沿)。重新同步與硬同步方式相似的地方是它們都使用SS段來進行檢測,同步的目的都是使節點內的SS段把跳變沿包含起來。
重新同步的方式分為超前和滯后兩種情況,以總線跳變沿與SS段的相對位置進行區分。第一種相位超前的情況,節點從總線的邊沿跳變中,檢測到它內部的時序比總線的時序相對超前2Tq,這時控制器在下一個位時序中的PBS1段增加2Tq的時間長度,使得節點與總線時序重新同步。
相位超前時的重新同步
第二種相位滯后的情況,節點從總線的邊沿跳變中,檢測到它的時序比總線的時序相對滯后2Tq,這時控制器在前一個位時序中的PBS2段減少2Tq的時間長度,獲得同步。
相位滯后時的重新同步
在重新同步的時候,PBS1和PBS2中增加或減少的這段時間長度被定義為"重新同步補償寬度SJW (reSynchronization Jump Width)"。一般來說CAN控制器會限定SJW的最大值,如限定了最大SJW=3Tq時,單次同步調整的時候不能增加或減少超過3Tq的時間長度,若有需要,控制器會通過多次小幅度調整來實現同步。當控制器設置的SJW極限值較大時,可以吸收的誤差加大,但通訊的速度會下降。

3.1.4 CAN的報文種類及結構

CAN使用的是兩條差分信號線,只能表達一個信號,簡潔的物理層決定了CAN必然要配上一套更復雜的協議,對數據、操作命令(如讀/寫)以及同步信號進行打包,打包后的這些內容稱為報文。

3.1.4.1 報文的種類

CAN一共規定了5種類型的幀,本文只講解數據幀
詳細見
5種類型的幀

數據幀

數據幀的結構

數據幀以一個顯性位(邏輯0)開始,以7個連續的隱性位(邏輯1)結束,在它們之間,分別有仲裁段、控制段、數據段、CRC段和ACK段。

  1. 幀起始
    SOF段(Start Of Frame),譯為幀起始,幀起始信號只有一個數據位,是一個顯性電平,它用於通知各個節點將有數據傳輸,其它節點通過幀起始信號的電平跳變沿來進行硬同步。

    1.1 仲裁段
    當同時有兩個報文被發送時,總線會根據仲裁段的內容決定哪個數據包能被傳輸,這也是它名稱的由來。

    仲裁段的內容主要為本數據幀的ID信息(標識符),數據幀具有標准格式和擴展格式兩種,區別就在於ID信息的長度,標准格式的ID為11位,擴展格式的ID為29位,它在標准ID的基礎上多出18位。在CAN協議中,ID起着重要的作用,它決定着數據幀發送的優先級,也決定着其它節點是否會接收這個數據幀。CAN協議不對掛載在它之上的節點分配優先級和地址,對總線的占有權是由信息的重要性決定的,即對於重要的信息,我們會給它打包上一個優先級高的ID,使它能夠及時地發送出去。也正因為它這樣的優先級分配原則,使得CAN的擴展性大大加強,在總線上增加或減少節點並不影響其它設備。

    報文的優先級,是通過對ID的仲裁來確定的。根據前面對物理層的分析我們知道如果總線上同時出現顯性電平和隱性電平,總線的狀態會被置為顯性電平,CAN正是利用這個特性進行仲裁。

    若兩個節點同時競爭CAN總線的占有權,當它們發送報文時,若首先出現隱性電平,則會失去對總線的占有權,進入接收狀態。在開始階段,兩個設備發送的電平一樣,所以它們一直繼續發送數據。到了圖中箭頭所指的時序處,節點單元1發送的為隱性電平,而此時節點單元2發送的為顯性電平,由於總線的"線與"特性使它表達出顯示電平,因此單元2競爭總線成功,這個報文得以被繼續發送出去。

    仲裁過程

    仲裁段ID的優先級也影響着接收設備對報文的反應。因為在CAN總線上數據是以廣播的形式發送的,所有連接在CAN總線的節點都會收到所有其它節點發出的有效數據,因而我們的CAN控制器大多具有根據ID過濾報文的功能,它可以控制自己只接收某些ID的報文。
    1.2 RTR位(Remote Transmission Request Bit),譯作遠程傳輸請求位,它是用於區分數據幀和遙控幀的,當它為顯性電平時表示數據幀,隱性電平時表示遙控幀。

    1.3 IDE位(Identifier Extension Bit),譯作標識符擴展位,它是用於區分標准格式與擴展格式,當它為顯性電平時表示標准格式,隱性電平時表示擴展格式。

    1.4 SRR位(Substitute Remote Request Bit),只存在於擴展格式,它用於替代標准格式中的RTR位。由於擴展幀中的SRR位為隱性位,RTR在數據幀為顯性位,所以在兩個ID相同的標准格式報文與擴展格式報文中,標准格式的優先級較高。

  2. 控制段
    在控制段中的r1和r0為保留位,默認設置為顯性位。它最主要的是DLC段(Data Length Code),譯為數據長度碼,它由4個數據位組成,用於表示本報文中的數據段含有多少個字節,DLC段表示的數字為0~8。

  3. 數據段
    數據段為數據幀的核心內容,它是節點要發送的原始信息,由0~8個字節組成,MSB先行。

  4. CRC段
    為了保證報文的正確傳輸,CAN的報文包含了一段15位的CRC校驗碼,一旦接收節點算出的CRC碼跟接收到的CRC碼不同,則它會向發送節點反饋出錯信息,利用錯誤幀請求它重新發送。CRC部分的計算一般由CAN控制器硬件完成,出錯時的處理則由軟件控制最大重發數。
    在CRC校驗碼之后,有一個CRC界定符,它為隱性位,主要作用是把CRC校驗碼與后面的ACK段間隔起來。

  5. ACK段
    ACK段包括一個ACK槽位,和ACK界定符位。類似I2C總線,在ACK槽位中,發送節點發送的是隱性位,而接收節點則在這一位中發送顯性位以示應答。在ACK槽和幀結束之間由ACK界定符間隔開。

  6. 幀結束
    EOF段(End Of Frame),譯為幀結束,幀結束段由發送節點發送的7個隱性位表示結束。

4 STM32的CAN外設簡介

STM32的芯片中具有bxCAN控制器 (Basic Extended CAN),它支持CAN協議2.0A和2.0B標准。

該CAN控制器支持最高的通訊速率為1Mb/s;可以自動地接收和發送CAN報文,支持使用標准ID和擴展ID的報文;外設中具有3個發送郵箱,發送報文的優先級可以使用軟件控制,還可以記錄發送的時間;具有2個3級深度的接收FIFO,可使用過濾功能只接收或不接收某些ID號的報文;可配置成自動重發;不支持使用DMA進行數據收發。

4.1 STM32的CAN架構剖析

STM32的CAN外設架構圖

STM32的有兩組CAN控制器,其中CAN1是主設備,框圖中的"存儲訪問控制器"是由CAN1控制的,CAN2無法直接訪問存儲區域,所以使用CAN2的時候必須使能CAN1外設的時鍾。框圖中主要包含CAN控制內核、發送郵箱、接收FIFO以及驗收篩選器,下面對框圖中的各個部分進行介紹。

4.1.1 CAN控制內核

我們主要講解其中的主控制寄存器CAN_MCR及位時序寄存器CAN_BTR。

主控制寄存器CAN_MCR

(1) DBF調試凍結功能

DBF(Debug freeze)調試凍結,使用它可設置CAN處於工作狀態或禁止收發的狀態,禁止收發時仍可訪問接收FIFO中的數據。這兩種狀態是當STM32芯片處於程序調試模式時才使用的,平時使用並不影響。

(2) TTCM時間觸發模式

TTCM(Time triggered communication mode)時間觸發模式,它用於配置CAN的時間觸發通信模式,在此模式下,CAN使用它內部定時器產生時間戳,並把它保存在CAN_RDTxR、CAN_TDTxR寄存器中。內部定時器在每個CAN位時間累加,在接收和發送的幀起始位被采樣,並生成時間戳。利用它可以實現ISO 11898-4 CAN標准的分時同步通信功能。

(3) ABOM自動離線管理

ABOM(Automatic bus-off management) 自動離線管理,它用於設置是否使用自動離線管理功能。當節點檢測到它發送錯誤或接收錯誤超過一定值時,會自動進入離線狀態,在離線狀態中,CAN不能接收或發送報文。處於離線狀態的時候,可以軟件控制恢復或者直接使用這個自動離線管理功能,它會在適當的時候自動恢復。

(4) AWUM自動喚醒

AWUM(Automatic bus-off management),自動喚醒功能,CAN外設可以使用軟件進入低功耗的睡眠模式,如果使能了這個自動喚醒功能,當CAN檢測到總線活動的時候,會自動喚醒。

(5) NART自動重傳

NART(No automatic retransmission)報文自動重傳功能,設置這個功能后,當報文發送失敗時會自動重傳至成功為止。若不使用這個功能,無論發送結果如何,消息只發送一次。

(6) RFLM鎖定模式

RFLM(Receive FIFO locked mode)FIFO鎖定模式,該功能用於鎖定接收FIFO。鎖定后,當接收FIFO溢出時,會丟棄下一個接收的報文。若不鎖定,則下一個接收到的報文會覆蓋原報文。

(7) TXFP報文發送優先級的判定方法

TXFP(Transmit FIFO priority)報文發送優先級的判定方法,當CAN外設的發送郵箱中有多個待發送報文時,本功能可以控制它是根據報文的ID優先級還是報文存進郵箱的順序來發送。

位時序寄存器(CAN_BTR)及波特率
CAN外設中的位時序寄存器CAN_BTR用於配置測試模式、波特率以及各種位內的段參數。

(1) 測試模式

為方便調試,STM32的CAN提供了測試模式,配置位時序寄存器CAN_BTR的SILM及LBKM寄存器位可以控制使用正常模式、靜默模式、回環模式及靜默回環模式

各個工作模式介紹如下:

  1. 正常模式
    正常模式下就是一個正常的CAN節點,可以向總線發送數據和接收數據。

  2. 靜默模式
    靜默模式下,它自己的輸出端的邏輯0數據會直接傳輸到它自己的輸入端,邏輯1可以被發送到總線,所以它不能向總線發送顯性位(邏輯0),只能發送隱性位(邏輯1)。輸入端可以從總線接收內容。由於它只可發送的隱性位不會強制影響總線的狀態,所以把它稱為靜默模式。這種模式一般用於監測,它可以用於分析總線上的流量,但又不會因為發送顯性位而影響總線。

  3. 回環模式
    回環模式下,它自己的輸出端的所有內容都直接傳輸到自己的輸入端,輸出端的內容同時也會被傳輸到總線上,即也可使用總線監測它的發送內容。輸入端只接收自己發送端的內容,不接收來自總線上的內容。使用回環模式可以進行自檢。

  4. 回環靜默模式
    回環靜默模式是以上兩種模式的結合,自己的輸出端的所有內容都直接傳輸到自己的輸入端,並且不會向總線發送顯性位影響總線,不能通過總線監測它的發送內容。輸入端只接收自己發送端的內容,不接收來自總線上的內容。這種方式可以在"熱自檢"時使用,即自我檢查的時候,不會干擾總線。

以上說的各個模式,是不需要修改硬件接線的,如當輸出直連輸入時,它是在STM32芯片內部連接的,傳輸路徑不經過STM32的CAN_Tx/Rx引腳,更不經過外部連接的CAN收發器,只有輸出數據到總線或從總線接收的情況下才會經過CAN_Tx/Rx引腳和收發器。

(2) 位時序及波特率

STM32外設定義的位時序與我們前面解釋的CAN標准時序有一點區別

STM32中CAN的位時序

STM32的CAN外設位時序中只包含3段,分別是同步段SYNC_SEG、位段BS1及位段BS2,采樣點位於BS1及BS2段的交界處。其中SYNC_SEG段固定長度為1Tq,而BS1及BS2段可以在位時序寄存器CAN_BTR設置它們的時間長度,它們可以在重新同步期間增長或縮短,該長度SJW也可在位時序寄存器中配置。

理解STM32的CAN外設的位時序時,可以把它的BS1段理解為是由前面介紹的CAN標准協議中PTS段與PBS1段合在一起的,而BS2段就相當於PBS2段。

了解位時序后,我們就可以配置波特率了。

4.1.2 CAN發送郵箱

CAN外設的發送郵箱,它一共有3個發送郵箱,即最多可以緩存3個待發送的報文。

每個發送郵箱中包含有標識符寄存器CAN_TIxR、數據長度控制寄存器CAN_TDTxR及2個數據寄存器CAN_TDLxR、CAN_TDHxR

寄存器名 功能
標識符寄存器CAN_TIxR 存儲待發送報文的ID、擴展ID、IDE位及RTR位
數據長度控制寄存器CAN_TDTxR 存儲待發送報文的DLC段
低位數據寄存器CAN_TDLxR 存儲待發送報文數據段的Data0-Data3這四個字節的內容
高位數據寄存器CAN_TDHxR 存儲待發送報文數據段的Data4-Data7這四個字節的內容

當我們要使用CAN外設發送報文時,把報文的各個段分解,按位置寫入到這些寄存器中,並對標識符寄存器CAN_TIxR中的發送請求寄存器位TMIDxR_TXRQ置1,即可把數據發送出去。

其中標識符寄存器CAN_TIxR中的STDID寄存器位比較特別。我們知道CAN的標准標識符的總位數為11位,而擴展標識符的總位數為29位的。當報文使用擴展標識符的時候,標識符寄存器CAN_TIxR中的STDID[10:0]等效於EXTID[18:28]位,它與EXTID[17:0]共同組成完整的29位擴展標識符。

4.1.3 CAN接收FIFO

AN外設的接收FIFO,它一共有2個接收FIFO,每個FIFO中有3個郵箱,即最多可以緩存6個接收到的報文。當接收到報文時,FIFO的報文計數器會自增,而STM32內部讀取FIFO數據之后,報文計數器會自減,我們通過狀態寄存器可獲知報文計數器的值,而通過前面主控制寄存器的RFLM位,可設置鎖定模式,鎖定模式下FIFO溢出時會丟棄新報文,非鎖定模式下FIFO溢出時新報文會覆蓋舊報文。

跟發送郵箱類似,每個接收FIFO中包含有標識符寄存器CAN_RIxR、數據長度控制寄存器CAN_RDTxR及2個數據寄存器CAN_RDLxR、CAN_RDHxR

寄存器名 功能
標識符寄存器CAN_RIxR 存儲收到報文的ID、擴展ID、IDE位及RTR位
數據長度控制寄存器CAN_RDTxR 存儲收到報文的DLC段
低位數據寄存器CAN_RDLxR 存儲收到報文數據段的Data0-Data3這四個字節的內容
高位數據寄存器CAN_RDHxR 存儲收到報文數據段的Data4-Data7這四個字節的內容

通過中斷或狀態寄存器知道接收FIFO有數據后,我們再讀取這些寄存器的值即可把接收到的報文加載到STM32的內存中。

4.1.4 驗收篩選器

CAN外設的驗收篩選器,一共有28個篩選器組,每個篩選器組有2個寄存器,CAN1和CAN2共用的篩選器的。

在CAN 協議中,消息的標識符與節點地址無關,但與消息內容有關。因此,發送節點將報文廣播給所有接收器時,接收節點會根據報文標識符的值來確定軟件是否需要該消息,為了簡化軟件的工作,STM32的CAN外設接收報文前會先使用驗收篩選器檢查,只接收需要的報文到FIFO中。

篩選器工作的時候,可以調整篩選ID的長度及過濾模式。根據篩選ID長度來分類有有以下兩種:

(1) 檢查STDID[10:0]、EXTID[17:0]、IDE 和RTR 位,一共31位。

(2) 檢查STDID[10:0]、RTR、IDE 和EXTID[17:15],一共16位。

通過配置篩選尺度寄存器CAN_FS1R的FSCx位可以設置篩選器工作在哪個尺度。

而根據過濾的方法分為以下兩種模式:

(1) 標識符列表模式,它把要接收報文的ID列成一個表,要求報文ID與列表中的某一個標識符完全相同才可以接收,可以理解為白名單管理。

(2) 掩碼模式,它把可接收報文ID的某幾位作為列表,這幾位被稱為掩碼,可以把它理解成關鍵字搜索,只要掩碼(關鍵字)相同,就符合要求,報文就會被保存到接收FIFO。

通過配置篩選模式寄存器CAN_FM1R的FBMx位可以設置篩選器工作在哪個模式。

不同的尺度和不同的過濾方法可使篩選器工作在圖 4015的4種狀態。
篩選器的4種工作狀態

每組篩選器包含2個32位的寄存器,分別為CAN_FxR1和CAN_FxR2,它們用來存儲要篩選的ID或掩碼,各個寄存器位代表的意義與圖中兩個寄存器下面"映射"的一欄一致。

而工作在標識符模式時,2個寄存器存儲的都是要篩選的ID,它只包含2個要篩選的ID值(32位模式時)。

如果使能了篩選器,且報文的ID與所有篩選器的配置都不匹配,CAN外設會丟棄該報文,不存入接收FIFO。

4.1.5 整體控制邏輯

CAN2外設的結構,它與CAN1外設是一樣的,他們共用篩選器且由於存儲訪問控制器由CAN1控制,所以要使用CAN2的時候必須要使能CAN1的時鍾。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM