CAN通訊詳解
本章參考資料:《STM32F4xx 中文參考手冊2》、《STM32F4xx規格書》、庫幫助文件《stm32f4xx_dsp_stdperiph_lib_um.chm》。
若對CAN通訊協議不瞭解,可先閱讀《CAN匯流排入門》、《CAN-bus規範》文件內容學習。
關於實驗板上的CAN收發器可查閱《TJA1050》文件瞭解。
40.1 CAN協議簡介
CAN是控制器區域網絡(Controller Area Network)的簡稱,它是由研發和生產汽車電子產品著稱的德國BOSCH公司開發的,並最終成為國際標準(ISO11519),是國際上應用最廣泛的現場匯流排之一。
CAN匯流排協議已經成為
40.1.1 CAN物理層
與I2C、SPI等具有時鐘訊號的同步通訊方式不同,CAN通訊並不是以時鐘訊號來進行同步的,它是一種非同步通訊,只具有CAN_High和CAN_Low兩條訊號線,共同構成一組差分訊號線,以差分訊號的形式進行通訊。
1. 閉環匯流排網路
CAN物理層的形式主要有兩種,圖 401中的CAN通訊網路是一種遵循
圖 401 CAN閉環匯流排通訊網路
2. 開環匯流排網路
圖 402中的是遵循ISO11519-2標準的低速、遠距離”開環網路”,它的最大傳輸距離為1km,最高通訊速率為125kbps,兩根匯流排是獨立的、不形成閉環,要求每根總線上各串聯有一個”2.2千歐”的電阻。
圖 402 CAN開環匯流排通訊網路
3. 通訊節點
從CAN通訊網路圖可瞭解到,CAN總線上可以掛載多個通訊節點,節點之間的訊號經過匯流排傳輸,實現節點間通訊。由於
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輸出到控制器中。
例如,STM32的CAN片上外設就是通訊節點中的控制器,為了構成完整的節點,還要給它外接一個收發器,在我們實驗板中使用型號為TJA1050的晶片作為CAN收發器。CAN控制器與CAN收發器的關係如同TTL串列埠與MAX3232電平轉換晶片的關係,MAX3232晶片把TTL電平的串列埠訊號轉換成RS-232電平的串列埠訊號,CAN收發器的作用則是把CAN控制器的TTL電平訊號轉換成差分訊號(或者相反)。
4. 差分訊號
差分訊號又稱差模訊號,與傳統使用單根訊號線電壓表示邏輯的方式有區別,使用差分訊號傳輸時,需要兩根訊號線,這兩個訊號線的振幅相等,相位相反,通過兩根訊號線的電壓差值來表示邏輯0和邏輯1。見圖 403,它使用了V+與V-訊號的差值表達出了圖下方的訊號。
圖 403 差分訊號
相對於單訊號線傳輸的方式,使用差分訊號傳輸具有如下優點:
抗干擾能力強,當外界存在噪聲干擾時,幾乎會同時耦合到兩條訊號線上,而接收端只關心兩個訊號的差值,所以外界的共模噪聲可以被完全抵消。
能有效抑制它對外部的電磁干擾,同樣的道理,由於兩根訊號的極性相反,他們對外輻射的電磁場可以相互抵消,耦合的越緊密,洩放到外界的電磁能量越少。
時序定位精確,由於差分訊號的開關變化是位於兩個訊號的交點,而不像普通單端訊號依靠高低兩個閾值電壓判斷,因而受工藝,溫度的影響小,能降低時序上的誤差,同時也更適合於低幅度訊號的電路。
由於差分訊號線具有這些優點,所以在USB協議、485協議、乙太網協議及CAN協議的物理層中,都使用了差分訊號傳輸。
5. CAN協議中的差分訊號
CAN協議中對它使用的CAN_High及CAN_Low表示的差分訊號做了規定,見表 401及圖 404。以高速CAN協議為例,當表示邏輯1時(隱性電平),CAN_High和CAN_Low線上的電壓均為2.5v,即它們的電壓差VH-VL=0V;而表示邏輯0時(顯性電平),CAN_High的電平為3.5V,CAN_Low線的電平為1.5V,即它們的電壓差為VH-VL=2V。例如,當CAN收發器從CAN_Tx線接收到來自CAN控制器的低電平訊號時(邏輯0),它會使CAN_High輸出3.5V,同時CAN_Low輸出1.5V,從而輸出顯性電平表示邏輯0。
表 401 CAN協議標準表示的訊號邏輯
訊號 |
ISO11898(高速) |
ISO11519-2(低速) |
||||||||||
隱性(邏輯1) |
顯性(邏輯0) |
隱性(邏輯1) |
顯性(邏輯0) |
|||||||||
最小值 |
典型值 |
最大值 |
最小值 |
典型值 |
最大值 |
最小值 |
典型值 |
最大值 |
最小值 |
典型值 |
最大值 |
|
CAN_High(V) |
2.0 |
2.5 |
3.0 |
2.75 |
3.5 |
4.5 |
1.6 |
1.75 |
1.9 |
3.85 |
4.0 |
5.0 |
CAN_Low(V) |
2.0 |
2.5 |
3.0 |
0.5 |
1.5 |
2.25 |
3.10 |
3.25 |
3.4 |
0 |
1.0 |
1.15 |
High-Low電位差 (V) |
-0.5 |
0 |
0.05 |
1.5 |
2.0 |
3.0 |
-0.3 |
-1.5 |
- |
0.3 |
3.0 |
- |
圖 404 CAN的差分訊號(高速)
在CAN匯流排中,必須使它處於隱性電平(邏輯1)或顯性電平(邏輯0)中的其中一個狀態。假如有兩個CAN通訊節點,在同一時間,一個輸出隱性電平,另一個輸出顯性電平,類似I2C匯流排的”線與”特性將使它處於顯性電平狀態,顯性電平的名字就是這樣來的,即可以認為顯性具有優先的意味。
由於CAN匯流排協議的物理層只有1對差分線,在一個時刻只能表示一個訊號,所以對通訊節點來說,CAN通訊是半雙工的,收發資料需要分時進行。在CAN的通訊網路中,因為共用匯流排,在整個網路中同一時刻只能有一個通訊節點發送訊號,其餘的節點在該時刻都只能接收。
40.1.2 協議層
以上是CAN的物理層標準,約定了電氣特性,以下介紹的協議層則規定了通訊邏輯。
1. CAN的波特率及位同步
由於CAN屬於非同步通訊,沒有時鐘訊號線,連線在同一個匯流排網路中的各個節點會像串列埠非同步通訊那樣,節點間使用約定好的波特率進行通訊,特別地,CAN還會使用”位同步”的方式來抗干擾、吸收誤差,實現對匯流排電平訊號進行正確的取樣,確保通訊正常。
位時序分解
為了實現位同步,CAN協議把每一個數據位的時序分解成如圖 405所示的SS段、PTS段、PBS1段、PBS2段,這四段的長度加起來即為一個CAN資料位的長度。分解後最小的時間單位是Tq,而一個完整的位由8~25個Tq組成。為方便表示,圖 405中的高低電平直接代表訊號邏輯0或邏輯1(不是差分訊號)。
圖 405 CAN位時序分解圖
該圖中表示的CAN通訊訊號每一個數據位的長度為19Tq,其中SS段佔1Tq,PTS段佔6Tq,PBS1段佔5Tq,PBS2段佔7Tq。訊號的取樣點位於PBS1段與PBS2段之間,通過控制各段的長度,可以對取樣點的位置進行偏移,以便準確地取樣。
各段的作用如介紹下:
SS段(SYNC SEG)
SS譯為同步段,若通訊節點檢測到總線上訊號的跳變沿被包含在SS段的範圍之內,則表示節點與匯流排的時序是同步的,當節點與匯流排同步時,取樣點採集到的匯流排電平即可被確定為該位的電平。SS段的大小固定為1Tq。
PTS段(PROP SEG)
PTS譯為傳播時間段,這個時間段是用於補償網路的物理延時時間。是總線上輸入比較器延時和輸出驅動器延時總和的兩倍。PTS段的大小可以為1~8Tq。
PBS1段(PHASE SEG1),
PBS1譯為相位緩衝段,主要用來補償邊沿階段的誤差,它的時間長度在重新同步的時候可以加長。PBS1段的初始大小可以為1~8Tq。
PBS2段(PHASE SEG2)
PBS2這是另一個相位緩衝段,也是用來補償邊沿階段誤差的,它的時間長度在重新同步時可以縮短。PBS2段的初始大小可以為2~8Tq。
通訊的波特率
總線上的各個通訊節點只要約定好1個Tq的時間長度以及每一個數據位佔據多少個Tq,就可以確定CAN通訊的波特率。
例如,假設上圖中的1Tq=1us,而每個資料位由19個Tq組成,則傳輸一位資料需要時間T1bit =19us,從而每秒可以傳輸的資料位個數為:
1x106/19 = 52631.6 (bps)
這個每秒可傳輸的資料位的個數即為通訊中的波特率。
同步過程分析
波特率只是約定了每個資料位的長度,資料同步還涉及到相位的細節,這個時候就需要用到資料位內的SS、PTS、PBS1及PBS2段了。
根據對段的應用方式差異,CAN的資料同步分為硬同步和重新同步。其中硬同步只是當存在”幀起始訊號”時起作用,無法確保後續一連串的位時序都是同步的,而重新同步方式可解決該問題,這兩種方式具體介紹如下:
(1) 硬同步
若某個CAN節點通過匯流排傳送資料時,它會發送一個表示通訊起始的訊號(即下一小節介紹的幀起始訊號),該訊號是一個由高變低的下降沿。而掛載到CAN總線上的通訊節點在不傳送資料時,會時刻檢測總線上的訊號。
見圖 406,可以看到當匯流排出現幀起始訊號時,某節點檢測到匯流排的幀起始訊號不在節點內部時序的SS段範圍,所以判斷它自己的內部時序與匯流排不同步,因而這個狀態的取樣點採集得的資料是不正確的。所以節點以硬同步的方式調整,把自己的位時序中的SS段平移至匯流排出現下降沿的部分,獲得同步,同步後取樣點就可以採集得正確資料了。
圖 406 硬同步過程圖
(2) 重新同步
前面的硬同步只是當存在幀起始訊號時才起作用,如果在一幀很長的資料內,節點訊號與匯流排訊號相位有偏移時,這種同步方式就無能為力了。因而需要引入重新同步方式,它利用普通資料位的高至低電平的跳變沿來同步(幀起始訊號是特殊的跳變沿)。重新同步與硬同步方式相似的地方是它們都使用SS段來進行檢測,同步的目的都是使節點內的SS段把跳變沿包含起來。
重新同步的方式分為超前和滯後兩種情況,以匯流排跳變沿與SS段的相對位置進行區分。第一種相位超前的情況如圖 407,節點從匯流排的邊沿跳變中,檢測到它內部的時序比匯流排的時序相對超前2Tq,這時控制器在下一個位時序中的PBS1段增加2Tq的時間長度,使得節點與匯流排時序重新同步。
圖 407 相位超前時的重新同步
第二種相位滯後的情況如圖 408,節點從匯流排的邊沿跳變中,檢測到它的時序比匯流排的時序相對滯後2Tq,這時控制器在前一個位時序中的PBS2段減少2Tq的時間長度,獲得同步。
圖 408 相位滯後時的重新同步
在重新同步的時候,PBS1和PBS2中增加或減少的這段時間長度被定義為”重新同步補償寬度SJW (reSynchronization Jump Width)“。一般來說CAN控制器會限定SJW的最大值,如限定了最大SJW=3Tq時,單次同步調整的時候不能增加或減少超過3Tq的時間長度,若有需要,控制器會通過多次小幅度調整來實現同步。當控制器設定的SJW極限值較大時,可以吸收的誤差加大,但通訊的速度會下降。
2. CAN的報文種類及結構
在SPI通訊中,片選、時鐘訊號、資料輸入及資料輸出這4個訊號都有單獨的訊號線,I2C協議包含有時鐘訊號及資料訊號2條訊號線,非同步串列埠包含接收與傳送2條訊號線,這些協議包含的訊號都比CAN協議要豐富,它們能輕易進行資料同步或區分資料傳輸方向。而CAN使用的是兩條差分訊號線,只能表達一個訊號,簡潔的物理層決定了CAN必然要配上一套更復雜的協議,如何用一個訊號通道實現同樣、甚至更強大的功能呢?CAN協議給出的解決方案是對資料、操作命令(如讀/寫)以及同步訊號進行打包,打包後的這些內容稱為報文。
報文的種類
在原始資料段的前面加上傳輸起始標籤、片選(識別)標籤和控制標籤,在資料的尾段加上CRC校驗標籤、應答標籤和傳輸結束標籤,把這些內容按特定的格式打包好,就可以用一個通道表達各種訊號了,各種各樣的標籤就如同SPI中各種通道上的訊號,起到了協同傳輸的作用。當整個資料包被傳輸到其它裝置時,只要這些裝置按格式去解讀,就能還原出原始資料,這樣的報文就被稱為CAN的”資料幀”。
為了更有效地控制通訊,CAN一共規定了5種類型的幀,它們的型別及用途說明如表 402。
表 402 幀的種類及其用途
幀 |
幀用途 |
資料幀 |
用於節點向外傳送資料 |
遙控幀 |
用於向遠端節點請求資料 |
錯誤幀 |
用於向遠端節點通知校驗錯誤,請求重新發送上一個資料 |
過載幀 |
用於通知遠端節點:本節點尚未做好接收準備 |
幀間隔 |
用於將資料幀及遙控幀與前面的幀分離開來 |
資料幀的結構
資料幀是在CAN通訊中最主要、最複雜的報文,我們來了解它的結構,見圖 409。
圖 409 資料幀的結構
資料幀以一個顯性位(邏輯0)開始,以7個連續的隱性位(邏輯1)結束,在它們之間,分別有仲裁段、控制段、資料段、CRC段和ACK段。
幀起始
SOF段(Start Of Frame),譯為幀起始,幀起始訊號只有一個數據位,是一個顯性電平,它用於通知各個節點將有資料傳輸,其它節點通過幀起始訊號的電平跳變沿來進行硬同步。
仲裁段
當同時有兩個報文被髮送時,匯流排會根據仲裁段的內容決定哪個資料包能被傳輸,這也是它名稱的由來。
仲裁段的內容主要為本資料幀的ID資訊(識別符號),資料幀具有標準格式和擴充套件格式兩種,區別就在於ID資訊的長度,標準格式的ID為11位,擴充套件格式的ID為29位,它在標準ID的基礎上多出18位。在CAN協議中,ID起著重要的作用,它決定著資料幀傳送的優先順序,也決定著其它節點是否會接收這個資料幀。CAN協議不對掛載在它之上的節點分配優先順序和地址,對匯流排的佔有權是由資訊的重要性決定的,即對於重要的資訊,我們會給它打包上一個優先順序高的ID,使它能夠及時地傳送出去。也正因為它這樣的優先順序分配原則,使得CAN的擴充套件性大大加強,在總線上增加或減少節點並不影響其它裝置。
報文的優先順序,是通過對ID的仲裁來確定的。根據前面對物理層的分析我們知道如果總線上同時出現顯性電平和隱性電平,匯流排的狀態會被置為顯性電平,CAN正是利用這個特性進行仲裁。
若兩個節點同時競爭CAN匯流排的佔有權,當它們傳送報文時,若首先出現隱性電平,則會失去對匯流排的佔有權,進入接收狀態。見圖 4010,在開始階段,兩個裝置傳送的電平一樣,所以它們一直繼續傳送資料。到了圖中箭頭所指的時序處,節點單元1傳送的為隱性電平,而此時節點單元2傳送的為顯性電平,由於匯流排的”線與”特性使它表達出顯示電平,因此單元2競爭匯流排成功,這個報文得以被繼續傳送出去。
圖 4010 仲裁過程
仲裁段ID的優先順序也影響著接收裝置對報文的反應。因為在CAN總線上資料是以廣播的形式傳送的,所有連線在CAN匯流排的節點都會收到所有其它節點發出的有效資料,因而我們的CAN控制器大多具有根據ID過濾報文的功能,它可以控制自己只接收某些ID的報文。
回看圖 409中的資料幀格式,可看到仲裁段除了報文ID外,還有RTR、IDE和SRR位。
(1) RTR位(Remote Transmission Request Bit),譯作遠端傳輸請求位,它是用於區分資料幀和遙控幀的,當它為顯性電平時表示資料幀,隱性電平時表示遙控幀。
(2) IDE位(Identifier Extension Bit),譯作識別符號擴充套件位,它是用於區分標準格式與擴充套件格式,當它為顯性電平時表示標準格式,隱性電平時表示擴充套件格式。
(3) SRR位(Substitute Remote Request Bit),只存在於擴充套件格式,它用於替代標準格式中的RTR位。由於擴充套件幀中的SRR位為隱性位,RTR在資料幀為顯性位,所以在兩個ID相同的標準格式報文與擴充套件格式報文中,標準格式的優先順序較高。
控制段
在控制段中的r1和r0為保留位,預設設定為顯性位。它最主要的是DLC段(Data Length Code),譯為資料長度碼,它由4個數據位組成,用於表示本報文中的資料段含有多少個位元組,DLC段表示的數字為0~8。
資料段
資料段為資料幀的核心內容,它是節點要傳送的原始資訊,由0~8個位元組組成,MSB先行。
CRC段
為了保證報文的正確傳輸,CAN的報文包含了一段15位的CRC校驗碼,一旦接收節點算出的CRC碼跟接收到的CRC碼不同,則它會向傳送節點反饋出錯資訊,利用錯誤幀請求它重新發送。CRC部分的計算一般由CAN控制器硬體完成,出錯時的處理則由軟體控制最大重發數。
在CRC校驗碼之後,有一個CRC界定符,它為隱性位,主要作用是把CRC校驗碼與後面的ACK段間隔起來。
ACK段
ACK段包括一個ACK槽位,和ACK界定符位。類似I2C匯流排,在ACK槽位中,傳送節點發送的是隱性位,而接收節點則在這一位中傳送顯性位以示應答。在ACK槽和幀結束之間由ACK界定符間隔開。
幀結束
EOF段(End Of Frame),譯為幀結束,幀結束段由傳送節點發送的7個隱性位表示結束。
其它報文的結構
關於其它的CAN報文結構,不再展開講解,其主要內容見圖 4011。
圖 4011 各種CAN報文的結構
40.2 STM32的CAN外設簡介
STM32的晶片中具有bxCAN控制器 (Basic Extended CAN),它支援CAN協議2.0A和2.0B標準。
該CAN控制器支援最高的通訊速率為1Mb/s;可以自動地接收和傳送CAN報文,支援使用標準ID和擴充套件ID的報文;外設中具有3個傳送郵箱,傳送報文的優先順序可以使用軟體控制,還可以記錄傳送的時間;具有2個3級深度的接收FIFO,可使用過濾功能只接收或不接收某些ID號的報文;可配置成自動重發;不支援使用DMA進行資料收發。
40.2.1 STM32的CAN架構剖析
圖 4012 STM32的CAN外設架構圖
STM32的有兩組CAN控制器,其中CAN1是主裝置,框圖中的”儲存訪問控制器”是由CAN1控制的,CAN2無法直接訪問儲存區域,所以使用CAN2的時候必須使能CAN1外設的時鐘。框圖中主要包含CAN控制核心、傳送郵箱、接收FIFO以及驗收篩選器,下面對框圖中的各個部分進行介紹。
1. CAN控制核心
框圖中標號處的CAN控制核心包含了各種控制暫存器及狀態暫存器,我們主要講解其中的主控制暫存器CAN_MCR及位時序暫存器CAN_BTR。
主控制暫存器CAN_MCR
主控制暫存器CAN_MCR負責管理CAN的工作模式,它使用以下暫存器位實現控制。
(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暫存器位可以控制使用正常模式、靜默模式、迴環模式及靜默迴環模式,見圖 4013。
圖 4013 四種工作模式
各個工作模式介紹如下:
正常模式
正常模式下就是一個正常的CAN節點,可以向匯流排傳送資料和接收資料。
靜默模式
靜默模式下,它自己的輸出端的邏輯0資料會直接傳輸到它自己的輸入端,邏輯1可以被髮送到匯流排,所以它不能向匯流排傳送顯性位(邏輯0),只能傳送隱性位(邏輯1)。輸入端可以從匯流排接收內容。由於它只可傳送的隱性位不會強制影響匯流排的狀態,所以把它稱為靜默模式。這種模式一般用於監測,它可以用於分析總線上的流量,但又不會因為傳送顯性位而影響匯流排。
迴環模式
迴環模式下,它自己的輸出端的所有內容都直接傳輸到自己的輸入端,輸出端的內容同時也會被傳輸到總線上,即也可使用匯流排監測它的傳送內容。輸入端只接收自己傳送端的內容,不接收來自總線上的內容。使用迴環模式可以進行自檢。
迴環靜默模式
迴環靜默模式是以上兩種模式的結合,自己的輸出端的所有內容都直接傳輸到自己的輸入端,並且不會向匯流排傳送顯性位影響匯流排,不能通過匯流排監測它的傳送內容。輸入端只接收自己傳送端的內容,不接收來自總線上的內容。這種方式可以在”熱自檢”時使用,即自我檢查的時候,不會干擾匯流排。
以上說的各個模式,是不需要修改硬體接線的,如當輸出直連輸入時,它是在STM32晶片內部連線的,傳輸路徑不經過STM32的CAN_Tx/Rx引腳,更不經過外部連線的CAN收發器,只有輸出資料到匯流排或從匯流排接收的情況下才會經過CAN_Tx/Rx引腳和收發器。
(2) 位時序及波特率
STM32外設定義的位時序與我們前面解釋的CAN標準時序有一點區別,見圖 4014。
圖 4014 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段。
瞭解位時序後,我們就可以配置波特率了。通過配置位時序暫存器CAN_BTR的TS1[3:0]及TS2[2:0]暫存器位設定BS1及BS2段的長度後,我們就可以確定每個CAN資料位的時間:
BS1段時間:
TS1=Tq x (TS1[3:0] + 1),
BS2段時間:
TS2= Tq x (TS2[2:0] + 1),
一個數據位的時間:
T1bit =1Tq+TS1+TS2 =1+ (TS1[3:0] + 1)+ (TS2[2:0] + 1)= N Tq
其中單個時間片的長度Tq與CAN外設的所掛載的時鐘匯流排及分頻器配置有關,CAN1和CAN2外設都是掛載在APB1總線上的,而位時序暫存器CAN_BTR中的BRP[9:0]暫存器位可以設定CAN外設時鐘的分頻值,所以:
Tq = (BRP[9:0]+1) x TPCLK
其中的PCLK指APB1時鐘,預設值為45MHz。
最終可以計算出CAN通訊的波特率:
BaudRate = 1/N Tq
例如表 403說明了一種把波特率配置為1Mbps的方式。
表 403 一種配置波特率為1Mbps的方式
引數 |
說明 |
SYNC_SE段 |
固定為1Tq |
BS1段 |
設定為5Tq (實際寫入TS1[3:0]的值為4) |
BS2段 |
設定為3Tq (實際寫入TS2[2:0]的值為2) |
TPCLK |
APB1按預設配置為F=45MHz,TPCLK=1/45M |
CAN外設時鐘分頻 |
設定為5分頻(實際寫入BRP[9:0]的值為4) |
1Tq時間長度 |
Tq = (BRP[9:0]+1) x TPCLK = 5 x 1/45M=1/9M |
1位的時間長度 |
T1bit =1Tq+TS1+TS2 = 1+5+3 = 9Tq |
波特率 |
BaudRate = 1/N Tq = 1/(1/9M x 9)=1Mbps |
2. CAN傳送郵箱
回到圖 245中的CAN外設框圖,在標號‚處的是CAN外設的傳送郵箱,它一共有3個傳送郵箱,即最多可以快取3個待發送的報文。
每個傳送郵箱中包含有識別符號暫存器CAN_TIxR、資料長度控制暫存器CAN_TDTxR及2個數據暫存器CAN_TDLxR、CAN_TDHxR,它們的功能見表 405。
表 404 傳送郵箱的暫存器
暫存器名 |
功能 |
識別符號暫存器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位擴充套件識別符號。
3. CAN接收FIFO
圖 245中的CAN外設框圖,在標號ƒ處的是CAN外設的接收FIFO,它一共有2個接收FIFO,每個FIFO中有3個郵箱,即最多可以快取6個接收到的報文。當接收到報文時,FIFO的報文計數器會自增,而STM32內部讀取FIFO資料之後,報文計數器會自減,我們通過狀態暫存器可獲知報文計數器的值,而通過前面主控制暫存器的RFLM位,可設定鎖定模式,鎖定模式下FIFO溢位時會丟棄新報文,非鎖定模式下FIFO溢位時新報文會覆蓋舊報文。
跟傳送郵箱類似,每個接收FIFO中包含有識別符號暫存器CAN_RIxR、資料長度控制暫存器CAN_RDTxR及2個數據暫存器CAN_RDLxR、CAN_RDHxR,它們的功能見表 405。
表 405 傳送郵箱的暫存器
暫存器名 |
功能 |
識別符號暫存器CAN_RIxR |
儲存收到報文的ID、擴充套件ID、IDE位及RTR位 |
資料長度控制暫存器CAN_RDTxR |
儲存收到報文的DLC段 |
低位資料暫存器CAN_RDLxR |
儲存收到報文資料段的Data0-Data3這四個位元組的內容 |
高位資料暫存器CAN_RDHxR |
儲存收到報文資料段的Data4-Data7這四個位元組的內容 |
通過中斷或狀態暫存器知道接收FIFO有資料後,我們再讀取這些暫存器的值即可把接收到的報文載入到STM32的記憶體中。
4. 驗收篩選器
圖 245中的CAN外設框圖,在標號„處的是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種狀態。
圖 4015 篩選器的4種工作狀態
每組篩選器包含2個32位的暫存器,分別為CAN_FxR1和CAN_FxR2,它們用來儲存要篩選的ID或掩碼,各個暫存器位代表的意義與圖中兩個暫存器下面”對映”的一欄一致,各個模式的說明見表 406。
表 406 篩選器的工作狀態說明
模式 |
說明 |
32位掩碼模式 |
CAN_FxR1儲存ID,CAN_FxR2儲存哪個位必須要與CAN_FxR1中的ID一致,2個暫存器表示1組掩碼。 |
32位識別符號模式 |
CAN_FxR1和CAN_FxR2各儲存1個ID,2個暫存器表示2個篩選的ID |
16位掩碼模式 |
CAN_FxR1高16位儲存ID,低16位儲存哪個位必須要與高16位的ID一致; CAN_FxR2高16位儲存ID,低16位儲存哪個位必須要與高16位的ID一致 2個暫存器表示2組掩碼。 |
16位識別符號模式 |
CAN_FxR1和CAN_FxR2各儲存2個ID,2個暫存器表示4個篩選的ID |
例如下面的表格所示,在掩碼模式時,第一個暫存器儲存要篩選的ID,第二個暫存器儲存掩碼,掩碼為1的部分表示該位必須與ID中的內容一致,篩選的結果為表中第三行的ID值,它是一組包含多個的ID值,其中x表示該位可以為1可以為0。
ID |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
… |
掩碼 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
… |
篩選的ID |
1 |
0 |
1 |
x |
x |
0 |
x |
… |
而工作在識別符號模式時,2個暫存器儲存的都是要篩選的ID,它只包含2個要篩選的ID值(32位模式時)。
如果使能了篩選器,且報文的ID與所有篩選器的配置都不匹配,CAN外設會丟棄該報文,不存入接收FIFO。
5. 整體控制邏輯
回到圖 245結構框圖,圖中的標號…處表