一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于CAN協(xié)議的總結(jié)筆記

STM32嵌入式開發(fā) ? 來源:CSDN-Wireless_Link ? 2023-02-24 11:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一. CAN協(xié)議概念

1.1 CAN 協(xié)議簡介

CAN 是控制器局域網(wǎng)絡(luò) (Controller Area Network) 的簡稱,它是由研發(fā)和生產(chǎn)汽車電子產(chǎn)品著稱的德國 BOSCH 公司開發(fā)的,并最終成為國際標(biāo)準(zhǔn)(ISO11519以及ISO11898),是國際上應(yīng)用最廣泛的現(xiàn)場總線之一。差異點如下:a4da7f12-b365-11ed-bfe3-dac502259ad0.png

CAN 總線協(xié)議已經(jīng)成為汽車計算機(jī)控制系統(tǒng)嵌入式工業(yè)控制局域網(wǎng)的標(biāo)準(zhǔn)總線,并且擁有以CAN 為底層協(xié)議專為大型貨車和重工機(jī)械車輛設(shè)計的 J1939 協(xié)議。近年來,它具有的高可靠性和良好的錯誤檢測能力受到重視,被廣泛應(yīng)用于汽車計算機(jī)控制系統(tǒng)和環(huán)境溫度惡劣、電磁輻射強(qiáng)及振動大的工業(yè)環(huán)境。

我們來貼圖一個車載網(wǎng)絡(luò)構(gòu)想圖:a4ed92a0-b365-11ed-bfe3-dac502259ad0.png

1.2 CAN 物理層

I2C、SPI 等具有時鐘信號的同步通訊方式不同,CAN 通訊并不是以時鐘信號來進(jìn)行同步的,它是一種異步通訊,只具有 CAN_High 和 CAN_Low 兩條信號線,共同構(gòu)成一組差分信號線,以差分信號的形式進(jìn)行通訊。我們來看一個示意圖a51a7608-b365-11ed-bfe3-dac502259ad0.png

1.2.1 閉環(huán)總線網(wǎng)絡(luò)

CAN 物理層的形式主要有兩種,圖中的 CAN 通訊網(wǎng)絡(luò)是一種遵循 ISO11898 標(biāo)準(zhǔn)的高速、短距離“閉環(huán)網(wǎng)絡(luò)”,它的總線最大長度為 40m,通信速度最高為 1Mbps,總線的兩端各要求有一個“120 歐”的電阻a52bebf4-b365-11ed-bfe3-dac502259ad0.png

1.2.2 開環(huán)總線網(wǎng)絡(luò)

圖中的是遵循 ISO11519-2 標(biāo)準(zhǔn)的低速、遠(yuǎn)距離“開環(huán)網(wǎng)絡(luò)”,它的最大傳輸距離為 1km,最高通訊速率為 125kbps,兩根總線是獨立的、不形成閉環(huán),要求每根總線上各串聯(lián)有一個“2.2千歐”的電阻。a538a77c-b365-11ed-bfe3-dac502259ad0.png

1.2.3 通訊節(jié)點

從 CAN 通訊網(wǎng)絡(luò)圖可了解到,CAN 總線上可以掛載多個通訊節(jié)點,節(jié)點之間的信號經(jīng)過總線傳輸,實現(xiàn)節(jié)點間通訊。由于 CAN 通訊協(xié)議不對節(jié)點進(jìn)行地址編碼,而是對數(shù)據(jù)內(nèi)容進(jìn)行編碼的,所以網(wǎng)絡(luò)中的節(jié)點個數(shù)理論上不受限制,只要總線的負(fù)載足夠即可,可以通過中繼器增強(qiáng)負(fù)載。CAN 通訊節(jié)點由一個 CAN 控制器及 CAN 收發(fā)器組成,控制器與收發(fā)器之間通過 CAN_Tx 及CAN_Rx 信號線相連,收發(fā)器與 CAN 總線之間使用 CAN_High 及 CAN_Low 信號線相連。其中CAN_Tx 及 CAN_Rx 使用普通的類似 TTL 邏輯信號,而 CAN_High 及 CAN_Low 是一對差分信號線,使用比較特別的差分信號,下一小節(jié)再詳細(xì)說明。當(dāng) CAN 節(jié)點需要發(fā)送數(shù)據(jù)時,控制器把要發(fā)送的二進(jìn)制編碼通過 CAN_Tx 線發(fā)送到收發(fā)器,然后由收發(fā)器把這個普通的邏輯電平信號轉(zhuǎn)化成差分信號,通過差分線 CAN_High 和 CAN_Low 線輸出到 CAN 總線網(wǎng)絡(luò)。而通過收發(fā)器接收總線上的數(shù)據(jù)到控制器時,則是相反的過程,收發(fā)器把總線上收到的 CAN_High 及 CAN_Low 信號轉(zhuǎn)化成普通的邏輯電平信號,通過 CAN_Rx 輸出到控制器中。例如,STM32 的 CAN 片上外設(shè)就是通訊節(jié)點中的控制器,為了構(gòu)成完整的節(jié)點,還要給它外接一個收發(fā)器,在我們實驗板中使用型號為 TJA1050 的芯片作為 CAN 收發(fā)器。CAN 控制器與 CAN收發(fā)器的關(guān)系如同 TTL 串口與 MAX3232 電平轉(zhuǎn)換芯片的關(guān)系, MAX3232 芯片把 TTL 電平的串口信號轉(zhuǎn)換成 RS-232 電平的串口信號,CAN 收發(fā)器的作用則是把 CAN 控制器的 TTL 電平信號轉(zhuǎn)換成差分信號 (或者相反) 。目前有以下CAN電平轉(zhuǎn)換芯片(不全)a55eed4c-b365-11ed-bfe3-dac502259ad0.png

我們來用TJA1050來看下原理圖:

a570d73c-b365-11ed-bfe3-dac502259ad0.png

1.2.4 差分信號

差分信號又稱差模信號,與傳統(tǒng)使用單根信號線電壓表示邏輯的方式有區(qū)別,使用差分信號傳輸時,需要兩根信號線,這兩個信號線的振幅相等,相位相反,通過兩根信號線的電壓差值來表示邏輯 0 和邏輯 1。見圖,它使用了 V+ 與 V-信號的差值表達(dá)出了圖下方的信號。a581cdee-b365-11ed-bfe3-dac502259ad0.png相對于單信號線傳輸?shù)姆绞?,使用差分信號傳輸具有如下?yōu)點:? 抗干擾能力強(qiáng),當(dāng)外界存在噪聲干擾時,幾乎會同時耦合到兩條信號線上,而接收端只關(guān)心兩個信號的差值,所以外界的共模噪聲可以被完全抵消。舉一個例子,正常的單線假設(shè)邏輯1是3.3V,邏輯0假設(shè)是0V,但是如果有噪聲,把3.3V弄成了0V(極端),把0V弄成了-3.3V,此時就邏輯錯誤,但是有Can高/Can低一般都作用于兩根線,所以兩個雖然都有噪聲影響,但是差值還是不變的? 能有效抑制它對外部的電磁干擾,同樣的道理,由于兩根信號的極性相反,他們對外輻射的電磁場可以相互抵消,耦合的越緊密,泄放到外界的電磁能量越少。舉一個例子,假設(shè)一根是10V,一根是-10V,單跟都會對外部造成電磁干擾,但是CAN可以把線擰在一起,跟編麻花一樣,可以互相抵消電子干擾? 時序定位精確,由于差分信號的開關(guān)變化是位于兩個信號的交點,而不像普通單端信號依靠高低兩個閾值電壓判斷,因而受工藝,溫度的影響小,能降低時序上的誤差,同時也更適合于低幅度信號的電路。由于差分信號線具有這些優(yōu)點,所以在 USB 協(xié)議、485 協(xié)議、以太網(wǎng)協(xié)議及 CAN 協(xié)議的物理層中,都使用了差分信號傳輸。

1.2.5 CAN 協(xié)議中的差分信號

CAN 協(xié)議中對它使用的 CAN_High 及 CAN_Low 表示的差分信號做了規(guī)定,見表及圖。以高速 CAN 協(xié)議為例,當(dāng)表示邏輯 1 時 (隱性電平) ,CAN_High 和 CAN_Low 線上的電壓均為 2.5v,即它們的電壓差 VH-VL=0V;而表示邏輯 0 時 (顯性電平) ,CAN_High 的電平為 3.5V,CAN_Low 線的電平為 1.5V,即它們的電壓差為 VH-VL=2V。例如,當(dāng) CAN收發(fā)器從 CAN_Tx 線接收到來自 CAN 控制器的低電平信號時 (邏輯 0),它會使 CAN_High 輸出3.5V,同時 CAN_Low 輸出 1.5V,從而輸出顯性電平表示邏輯 0 。a59b2974-b365-11ed-bfe3-dac502259ad0.pnga5b1e290-b365-11ed-bfe3-dac502259ad0.png

在 CAN 總線中,必須使它處于隱性電平 (邏輯 1) 或顯性電平 (邏輯 0) 中的其中一個狀態(tài)。假如有兩個 CAN 通訊節(jié)點,在同一時間,一個輸出隱性電平,另一個輸出顯性電平,類似 I2C 總線的“線與”特性將使它處于顯性電平狀態(tài),顯性電平的名字就是這樣來的,即可以認(rèn)為顯性具有優(yōu)先的意味。

由于 CAN 總線協(xié)議的物理層只有 1 對差分線,在一個時刻只能表示一個信號,所以對通訊節(jié)點來說,CAN 通訊是半雙工的,收發(fā)數(shù)據(jù)需要分時進(jìn)行。在 CAN 的通訊網(wǎng)絡(luò)中,因為共用總線,在整個網(wǎng)絡(luò)中同一時刻只能有一個通訊節(jié)點發(fā)送信號,其余的節(jié)點在該時刻都只能接收。

1.3 CAN 協(xié)議層

1.3.1 CAN 的波特率及位同步

由于 CAN 屬于異步通訊,沒有時鐘信號線,連接在同一個總線網(wǎng)絡(luò)中的各個節(jié)點會像串口異步通訊那樣,節(jié)點間使用約定好的波特率進(jìn)行通訊,特別地, CAN 還會使用“位同步”的方式來抗干擾、吸收誤差,實現(xiàn)對總線電平信號進(jìn)行正確的采樣,確保通訊正常。

1.3.2 位時序分解

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

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

各段的作用如介紹下:? SS 段 (SYNC SEG)SS 譯為同步段,若通訊節(jié)點檢測到總線上信號的跳變沿被包含在 SS 段的范圍之內(nèi),則表示節(jié)點與總線的時序是同步的,當(dāng)節(jié)點與總線同步時,采樣點采集到的總線電平即可被確定為該位的電平。SS 段的大小固定為 1Tq。? PTS 段 (PROP SEG)PTS 譯為傳播時間段,這個時間段是用于補(bǔ)償網(wǎng)絡(luò)的物理延時時間。是總線上輸入比較器延時和輸出驅(qū)動器延時總和的兩倍。PTS 段的大小可以為 1~8Tq。? PBS1 段 (PHASE SEG1),PBS1 譯為相位緩沖段,主要用來補(bǔ)償邊沿階段的誤差,它的時間長度在重新同步的時候可以加長。PBS1 段的初始大小可以為 1~8Tq。? PBS2 段 (PHASE SEG2)PBS2 這是另一個相位緩沖段,也是用來補(bǔ)償邊沿階段誤差的,它的時間長度在重新同步時可以縮短。PBS2 段的初始大小可以為 2~8Tq。

1.3.3 通訊的波特率

總線上的各個通訊節(jié)點只要約定好 1 個 Tq 的時間長度以及每一個數(shù)據(jù)位占據(jù)多少個 Tq,就可以確定 CAN 通訊的波特率。例如,假設(shè)上圖中的 1Tq=1us,而每個數(shù)據(jù)位由 19 個 Tq 組成,則傳輸一位數(shù)據(jù)需要時間 T1bit=19us,從而每秒可以傳輸?shù)臄?shù)據(jù)位個數(shù)為:1x10次方/19 = 52631.6 (bps)這個每秒可傳輸?shù)臄?shù)據(jù)位的個數(shù)即為通訊中的波特率。

1.3.4 同步過程分析

波特率只是約定了每個數(shù)據(jù)位的長度,數(shù)據(jù)同步還涉及到相位的細(xì)節(jié),這個時候就需要用到數(shù)據(jù)位內(nèi)的 SS、PTS、PBS1 及 PBS2 段了。根據(jù)對段的應(yīng)用方式差異, CAN 的數(shù)據(jù)同步分為硬同步和重新同步。其中硬同步只是當(dāng)存在“幀起始信號”時起作用,無法確保后續(xù)一連串的位時序都是同步的,而重新同步方式可解決該問題,這兩種方式具體介紹如下:(1) 硬同步若某個 CAN 節(jié)點通過總線發(fā)送數(shù)據(jù)時,它會發(fā)送一個表示通訊起始的信號 (即下一小節(jié)介紹的幀起始信號),該信號是一個由高變低的下降沿。而掛載到 CAN 總線上的通訊節(jié)點在不發(fā)送數(shù)據(jù)時,會時刻檢測總線上的信號。見圖 ,可以看到當(dāng)總線出現(xiàn)幀起始信號時,某節(jié)點檢測到總線的幀起始信號不在節(jié)點內(nèi)部時序的 SS 段范圍,所以判斷它自己的內(nèi)部時序與總線不同步,因而這個狀態(tài)的采樣點采集得的數(shù)據(jù)是不正確的。所以節(jié)點以硬同步的方式調(diào)整,把自己的位時序中的 SS 段平移至總線出現(xiàn)下降沿的部分,獲得同步,同步后采樣點就可以采集得正確數(shù)據(jù)了。a5cf834a-b365-11ed-bfe3-dac502259ad0.png

(2) 重新同步

前面的硬同步只是當(dāng)存在幀起始信號時才起作用,如果在一幀很長的數(shù)據(jù)內(nèi),節(jié)點信號與總線信號相位有偏移時,這種同步方式就無能為力了。因而需要引入重新同步方式,它利用普通數(shù)據(jù)位的高至低電平的跳變沿來同步 (幀起始信號是特殊的跳變沿)。重新同步與硬同步方式相似的地方是它們都使用 SS 段來進(jìn)行檢測,同步的目的都是使節(jié)點內(nèi)的 SS 段把跳變沿包含起來。重新同步的方式分為超前和滯后兩種情況,以總線跳變沿與 SS 段的相對位置進(jìn)行區(qū)分。第一種相位超前的情況如圖 ,節(jié)點從總線的邊沿跳變中,檢測到它內(nèi)部的時序比總線的時序相對超前 2Tq,這時控制器在下一個位時序中的 PBS1 段增加 2Tq 的時間長度,使得節(jié)點與總線時序重新同步。a5dfc8b8-b365-11ed-bfe3-dac502259ad0.png

第二種相位滯后的情況如圖 ,節(jié)點從總線的邊沿跳變中,檢測到它的時序比總線的時序相對滯后 2Tq,這時控制器在前一個位時序中的 PBS2 段減少 2Tq 的時間長度,獲得同步。

a693d222-b365-11ed-bfe3-dac502259ad0.png

在重新同步的時候,PBS1 和 PBS2 中增加或減少的這段時間長度被定義為“重新同步補(bǔ)償寬度SJW* (reSynchronization Jump Width)”。一般來說 CAN 控制器會限定 SJW 的最大值,如限定了最大 SJW=3Tq 時,單次同步調(diào)整的時候不能增加或減少超過 3Tq 的時間長度,若有需要,控制器會通過多次小幅度調(diào)整來實現(xiàn)同步。當(dāng)控制器設(shè)置的 SJW 極限值較大時,可以吸收的誤差加大,但通訊的速度會下降

1.3.5 CAN 的報文種類及結(jié)構(gòu)

在 SPI 通訊中,片選、時鐘信號、數(shù)據(jù)輸入及數(shù)據(jù)輸出這 4 個信號都有單獨的信號線,I2C 協(xié)議包含有時鐘信號及數(shù)據(jù)信號 2 條信號線,異步串口包含接收與發(fā)送 2 條信號線,這些協(xié)議包含的信號都比 CAN 協(xié)議要豐富,它們能輕易進(jìn)行數(shù)據(jù)同步或區(qū)分?jǐn)?shù)據(jù)傳輸方向。而 CAN 使用的是兩條差分信號線,只能表達(dá)一個信號,簡潔的物理層決定了 CAN 必然要配上一套更復(fù)雜的協(xié)議,如何用一個信號通道實現(xiàn)同樣、甚至更強(qiáng)大的功能呢?CAN 協(xié)議給出的解決方案是對數(shù)據(jù)、操作命令 (如讀/寫) 以及同步信號進(jìn)行打包,打包后的這些內(nèi)容稱為報文。
1.3.5.1 報文的種類
在原始數(shù)據(jù)段的前面加上傳輸起始標(biāo)簽、片選 (識別) 標(biāo)簽和控制標(biāo)簽,在數(shù)據(jù)的尾段加上 CRC校驗標(biāo)簽、應(yīng)答標(biāo)簽和傳輸結(jié)束標(biāo)簽,把這些內(nèi)容按特定的格式打包好,就可以用一個通道表達(dá)各種信號了,各種各樣的標(biāo)簽就如同 SPI 中各種通道上的信號,起到了協(xié)同傳輸?shù)淖饔?。?dāng)整個數(shù)據(jù)包被傳輸?shù)狡渌O(shè)備時,只要這些設(shè)備按格式去解讀,就能還原出原始數(shù)據(jù),這樣的報文就被稱為 CAN 的“數(shù)據(jù)幀”。為了更有效地控制通訊,CAN 一共規(guī)定了 5 種類型的幀,它們的類型及用途說明如表a6acfbf8-b365-11ed-bfe3-dac502259ad0.png
1.3.5.2 數(shù)據(jù)幀的結(jié)構(gòu)
數(shù)據(jù)幀是在 CAN 通訊中最主要、最復(fù)雜的報文,我們來了解它的結(jié)構(gòu),見圖a6cdafec-b365-11ed-bfe3-dac502259ad0.png

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

? 幀起始SOF 段 (Start OfFrame),譯為幀起始,幀起始信號只有一個數(shù)據(jù)位,是一個顯性電平,它用于通知各個節(jié)點將有數(shù)據(jù)傳輸,其它節(jié)點通過幀起始信號的電平跳變沿來進(jìn)行硬同步。? 仲裁段當(dāng)同時有兩個報文被發(fā)送時,總線會根據(jù)仲裁段的內(nèi)容決定哪個數(shù)據(jù)包能被傳輸,這也是它名稱的由來。仲裁段的內(nèi)容主要為本數(shù)據(jù)幀的 ID 信息 (標(biāo)識符),數(shù)據(jù)幀具有標(biāo)準(zhǔn)格式和擴(kuò)展格式兩種,區(qū)別就在于 ID 信息的長度,標(biāo)準(zhǔn)格式的 ID 為 11 位,擴(kuò)展格式的 ID 為 29 位,它在標(biāo)準(zhǔn) ID 的基礎(chǔ)上多出 18 位。在 CAN 協(xié)議中, ID 起著重要的作用,它決定著數(shù)據(jù)幀發(fā)送的優(yōu)先級,也決定著其它節(jié)點是否會接收這個數(shù)據(jù)幀。CAN 協(xié)議不對掛載在它之上的節(jié)點分配優(yōu)先級和地址,對總線的占有權(quán)是由信息的重要性決定的,即對于重要的信息,我們會給它打包上一個優(yōu)先級高的 ID,使它能夠及時地發(fā)送出去。也正因為它這樣的優(yōu)先級分配原則,使得 CAN 的擴(kuò)展性大大加強(qiáng),在總線上增加或減少節(jié)點并不影響其它設(shè)備。報文的優(yōu)先級,是通過對 ID 的仲裁來確定的。根據(jù)前面對物理層的分析我們知道如果總線上同時出現(xiàn)顯性電平和隱性電平,總線的狀態(tài)會被置為顯性電平,CAN 正是利用這個特性進(jìn)行仲裁。若兩個節(jié)點同時競爭 CAN 總線的占有權(quán),當(dāng)它們發(fā)送報文時,若首先出現(xiàn)隱性電平,則會失去對總線的占有權(quán),進(jìn)入接收狀態(tài)。見圖 ,在開始階段,兩個設(shè)備發(fā)送的電平一樣,所以它們一直繼續(xù)發(fā)送數(shù)據(jù)。到了圖中箭頭所指的時序處,節(jié)點單元 1 發(fā)送的為隱性電平,而此時節(jié)點單元 2 發(fā)送的為顯性電平,由于總線的“線與”特性使它表達(dá)出顯示電平,因此單元 2 競爭總線成功,這個報文得以被繼續(xù)發(fā)送出去。a701647c-b365-11ed-bfe3-dac502259ad0.png

仲裁段 ID 的優(yōu)先級也影響著接收設(shè)備對報文的反應(yīng)。因為在 CAN 總線上數(shù)據(jù)是以廣播的形式發(fā)送的,所有連接在 CAN 總線的節(jié)點都會收到所有其它節(jié)點發(fā)出的有效數(shù)據(jù),因而我們的 CAN

控制器大多具有根據(jù) ID 過濾報文的功能,它可以控制自己只接收某些 ID 的報文。回看數(shù)據(jù)幀格式,可看到仲裁段除了報文 ID 外,還有 RTR、IDE 和 SRR 位。(1) RTR 位 (Remote Transmission Request Bit),譯作遠(yuǎn)程傳輸請求位,它是用于區(qū)分?jǐn)?shù)據(jù)幀和遙控幀的,當(dāng)它為顯性電平時表示數(shù)據(jù)幀,隱性電平時表示遙控幀。(2) IDE 位 (Identifier ExtensionBit),譯作標(biāo)識符擴(kuò)展位,它是用于區(qū)分標(biāo)準(zhǔn)格式與擴(kuò)展格式,當(dāng)它為顯性電平時表示標(biāo)準(zhǔn)格式,隱性電平時表示擴(kuò)展格式。(3) SRR 位 (Substitute Remote Request Bit),只存在于擴(kuò)展格式,它用于替代標(biāo)準(zhǔn)格式中的 RTR位。由于擴(kuò)展幀中的 SRR 位為隱性位,RTR 在數(shù)據(jù)幀為顯性位,所以在兩個 ID 相同的標(biāo)準(zhǔn)格式報文與擴(kuò)展格式報文中,標(biāo)準(zhǔn)格式的優(yōu)先級較高。? 控制段在控制段中的 r1 和 r0 為保留位,默認(rèn)設(shè)置為顯性位。它最主要的是 DLC 段 (Data Length Code),譯為數(shù)據(jù)長度碼,它由 4 個數(shù)據(jù)位組成,用于表示本報文中的數(shù)據(jù)段含有多少個字節(jié), DLC 段表示的數(shù)字為 0~8。? 數(shù)據(jù)段數(shù)據(jù)段為數(shù)據(jù)幀的核心內(nèi)容,它是節(jié)點要發(fā)送的原始信息,由 0~8 個字節(jié)組成,MSB 先行。? CRC 段為了保證報文的正確傳輸,CAN 的報文包含了一段 15 位的 CRC 校驗碼,一旦接收節(jié)點算出的CRC 碼跟接收到的 CRC 碼不同,則它會向發(fā)送節(jié)點反饋出錯信息,利用錯誤幀請求它重新發(fā)送。CRC 部分的計算一般由 CAN 控制器硬件完成,出錯時的處理則由軟件控制最大重發(fā)數(shù)。在 CRC 校驗碼之后,有一個 CRC 界定符,它為隱性位,主要作用是把 CRC 校驗碼與后面的 ACK段間隔起來。? ACK 段ACK 段包括一個 ACK 槽位,和 ACK 界定符位。類似 I2C 總線,在 ACK 槽位中,發(fā)送節(jié)點發(fā)送的是隱性位,而接收節(jié)點則在這一位中發(fā)送顯性位以示應(yīng)答。在 ACK 槽和幀結(jié)束之間由 ACK 界定符間隔開。? 幀結(jié)束EOF 段 (End Of Frame),譯為幀結(jié)束,幀結(jié)束段由發(fā)送節(jié)點發(fā)送的 7 個隱性位表示結(jié)束。
1.3.5.3 其它報文的結(jié)構(gòu)
a724f324-b365-11ed-bfe3-dac502259ad0.pnga738db5a-b365-11ed-bfe3-dac502259ad0.png

二. STM32 CAN 控制器介紹

STM32 的芯片中具有 bxCAN 控制器 (Basic Extended CAN),它支持 CAN 協(xié)議 2.0A 和 2.0B 標(biāo)準(zhǔn)。該 CAN 控制器支持最高的通訊速率為 1Mb/s;可以自動地接收和發(fā)送 CAN 報文,支持使用標(biāo)準(zhǔn)ID 和擴(kuò)展 ID 的報文;外設(shè)中具有 3 個發(fā)送郵箱,發(fā)送報文的優(yōu)先級可以使用軟件控制,還可以記錄發(fā)送的時間;具有 2 個 3 級深度的接收 FIFO,可使用過濾功能只接收或不接收某些 ID 號的報文;可配置成自動重發(fā);不支持使用 DMA 進(jìn)行數(shù)據(jù)收發(fā)。框架示意圖如下:a770f4a4-b365-11ed-bfe3-dac502259ad0.png

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

2.1 CAN 控制內(nèi)核

框圖中標(biāo)號處的 CAN 控制內(nèi)核包含了各種控制寄存器及狀態(tài)寄存器,我們主要講解其中的主控制寄存器 CAN_MCR 及位時序寄存器 CAN_BTR。

2.1.1 主控制寄存器 CAN_MCR

主控制寄存器 CAN_MCR 負(fù)責(zé)管理 CAN 的工作模式,它使用以下寄存器位實現(xiàn)控制。a7acf67a-b365-11ed-bfe3-dac502259ad0.png

(1) DBF 調(diào)試凍結(jié)功能

DBF(Debug freeze) 調(diào)試凍結(jié),使用它可設(shè)置 CAN 處于工作狀態(tài)或禁止收發(fā)的狀態(tài),禁止收發(fā)時仍可訪問接收 FIFO 中的數(shù)據(jù)。這兩種狀態(tài)是當(dāng) STM32 芯片處于程序調(diào)試模式時才使用的,平時使用并不影響。(2) TTCM 時間觸發(fā)模式TTCM(Time triggered communication mode) 時間觸發(fā)模式,它用于配置 CAN 的時間觸發(fā)通信模式,在此模式下,CAN 使用它內(nèi)部定時器產(chǎn)生時間戳,并把它保存在CAN_RDTxR、CAN_TDTxR 寄存器中。內(nèi)部定時器在每個 CAN 位時間累加,在接收和發(fā)送的幀起始位被采樣,并生成時間戳。利用它可以實現(xiàn) ISO 11898-4 CAN 標(biāo)準(zhǔn)的分時同步通信功能。(3) ABOM 自動離線管理ABOM (Automatic bus-off management) 自動離線管理,它用于設(shè)置是否使用自動離線管理功能。當(dāng)節(jié)點檢測到它發(fā)送錯誤或接收錯誤超過一定值時,會自動進(jìn)入離線狀態(tài),在離線狀態(tài)中, CAN 不能接收或發(fā)送報文。處于離線狀態(tài)的時候,可以軟件控制恢復(fù)或者直接使用這個自動離線管理功能,它會在適當(dāng)?shù)臅r候自動恢復(fù)。(4) AWUM 自動喚醒AWUM (Automatic bus-off management),自動喚醒功能,CAN 外設(shè)可以使用軟件進(jìn)入低功耗的睡眠模式,如果使能了這個自動喚醒功能,當(dāng) CAN 檢測到總線活動的時候,會自動喚醒。(5) NART 自動重傳NART(No automatic retransmission) 報文自動重傳功能,設(shè)置這個功能后,當(dāng)報文發(fā)送失敗時會自動重傳至成功為止。若不使用這個功能,無論發(fā)送結(jié)果如何,消息只發(fā)送一次。(6) RFLM 鎖定模式RFLM(Receive FIFO locked mode)FIFO 鎖定模式,該功能用于鎖定接收 FIFO 。鎖定后,當(dāng)接收 FIFO 溢出時,會丟棄下一個接收的報文。若不鎖定,則下一個接收到的報文會覆蓋原報文。(7) TXFP 報文發(fā)送優(yōu)先級的判定方法TXFP(Transmit FIFO priority) 報文發(fā)送優(yōu)先級的判定方法,當(dāng) CAN 外設(shè)的發(fā)送郵箱中有多個待發(fā)送報文時,本功能可以控制它是根據(jù)報文的 ID 優(yōu)先級還是報文存進(jìn)郵箱的順序來發(fā)送。

2.1.2 位時序寄存器 (CAN_BTR) 及波特率

a7cc8cba-b365-11ed-bfe3-dac502259ad0.png

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

2.1.2.1 模式
位31 SILM:靜默模式(調(diào)試)(Silent mode (debug))0:正常工作1:靜默模式位30 LBKM:環(huán)回模式(調(diào)試)(Loop back mode (debug))0:禁止環(huán)回模式1:使能環(huán)回模式為方便調(diào)試,STM32 的 CAN 提供了測試模式,配置位時序寄存器 CAN_BTR 的 SILM 及 LBKM寄存器位可以控制使用正常模式、靜默模式、回環(huán)模式及靜默回環(huán)模式,見圖。a7dff14c-b365-11ed-bfe3-dac502259ad0.png

各個工作模式介紹如下:

? 正常模式正常模式下就是一個正常的 CAN 節(jié)點,可以向總線發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。? 靜默模式靜默模式下,它自己的輸出端的邏輯 0 數(shù)據(jù)會直接傳輸?shù)剿约旱妮斎攵耍壿?1 可以被發(fā)送到總線,所以它不能向總線發(fā)送顯性位 (邏輯 0),只能發(fā)送隱性位 (邏輯 1)。輸入端可以從總線接收內(nèi)容。由于它只可發(fā)送的隱性位不會強(qiáng)制影響總線的狀態(tài),所以把它稱為靜默模式。這種模式一般用于監(jiān)測,它可以用于分析總線上的流量,但又不會因為發(fā)送顯性位而影響總線。? 回環(huán)模式回環(huán)模式下,它自己的輸出端的所有內(nèi)容都直接傳輸?shù)阶约旱妮斎攵?,輸出端的?nèi)容同時也會被傳輸?shù)娇偩€上,即也可使用總線監(jiān)測它的發(fā)送內(nèi)容。輸入端只接收自己發(fā)送端的內(nèi)容,不接收來自總線上的內(nèi)容。使用回環(huán)模式可以進(jìn)行自檢。? 回環(huán)靜默模式回環(huán)靜默模式是以上兩種模式的結(jié)合,自己的輸出端的所有內(nèi)容都直接傳輸?shù)阶约旱妮斎攵?,并且不會向總線發(fā)送顯性位影響總線,不能通過總線監(jiān)測它的發(fā)送內(nèi)容。輸入端只接收自己發(fā)送端的內(nèi)容,不接收來自總線上的內(nèi)容。這種方式可以在“熱自檢”時使用,即自我檢查的時候,不會干擾總線。以上說的各個模式,是不需要修改硬件接線的,例如,當(dāng)輸出直接連輸入時,它是在 STM32 芯片內(nèi)部連接的,傳輸路徑不經(jīng)過 STM32 的 CAN_Tx/Rx 引腳,更不經(jīng)過外部連接的 CAN 收發(fā)器,只有輸出數(shù)據(jù)到總線或從總線接收的情況下才會經(jīng)過 CAN_Tx/Rx 引腳和收發(fā)器
2.1.2.2 位時序及波特率
STM32 外設(shè)定義的位時序與我們前面解釋的 CAN 標(biāo)準(zhǔn)時序有一點區(qū)別,見圖a7fa9790-b365-11ed-bfe3-dac502259ad0.png

STM32 的 CAN 外設(shè)位時序中只包含 3 段,分別是同步段 SYNC_SEG、位段 BS1 及位段 BS2,采樣點位于 BS1 及 BS2 段的交界處。其中 SYNC_SEG 段固定長度為 1Tq,而 BS1 及 BS2 段可以

在位時序寄存器 CAN_BTR 設(shè)置它們的時間長度,它們可以在重新同步期間增長或縮短,該長度SJW 也可在位時序寄存器中配置。理解 STM32 的 CAN 外設(shè)的位時序時,可以把它的 BS1 段理解為是由前面介紹的 CAN 標(biāo)準(zhǔn)協(xié)議中 PTS 段與 PBS1 段合在一起的,而 BS2 段就相當(dāng)于 PBS2 段。了解位時序后,我們就可以配置波特率了。通過配置位時序寄存器 CAN_BTR 的 TS1[3:0] 及TS2[2:0] 寄存器位設(shè)定 BS1 及 BS2 段的長度后,我們就可以確定每個 CAN 數(shù)據(jù)位的時間:BS1 段時間:TS1=Tq x (TS1[3:0] + 1),BS2 段時間:TS2= Tq x (TS2[2:0] + 1),一個數(shù)據(jù)位的時間:T1bit =1Tq+TS1+TS2=1+ (TS1[3:0] + 1)+ (TS2[2:0] + 1)= N Tq其中單個時間片的長度 Tq 與 CAN 外設(shè)的所掛載的時鐘總線及分頻器配置有關(guān),CAN1 和 CAN2外設(shè)都是掛載在 APB1 總線上的,而位時序寄存器 CAN_BTR 中的 BRP[9:0] 寄存器位可以設(shè)置CAN波特率=Fpclk1/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler)其中clk為42M!a80adf38-b365-11ed-bfe3-dac502259ad0.pnga828f9c8-b365-11ed-bfe3-dac502259ad0.png

推薦一個CAN波特率計算器:

a84581d8-b365-11ed-bfe3-dac502259ad0.png

CAN波特率計算 f103AHP1_36M f407AHP1_42M 采樣點軟件有說明.rar

2.2 CAN 發(fā)送郵箱

回到圖 中的 CAN 外設(shè)框圖,在標(biāo)號處的是 CAN 外設(shè)的發(fā)送郵箱,它一共有 3 個發(fā)送郵箱,即最多可以緩存 3 個待發(fā)送的報文。每個發(fā)送郵箱中包含有標(biāo)識符寄存器 CAN_TIxR、數(shù)據(jù)長度控制寄存器 CAN_TDTxR 及 2 個數(shù)據(jù)寄存器 CAN_TDLxR、CAN_TDHxR,它們的功能見表a872a4c4-b365-11ed-bfe3-dac502259ad0.png

當(dāng)我們要使用 CAN 外設(shè)發(fā)送報文時,把報文的各個段分解,按位置寫入到這些寄存器中,并對標(biāo)識符寄存器 CAN_TIxR 中的發(fā)送請求寄存器位 TMIDxR_TXRQ 置 1,即可把數(shù)據(jù)發(fā)送出去。其中標(biāo)識符寄存器 CAN_TIxR 中的 STDID 寄存器位比較特別。我們知道 CAN 的標(biāo)準(zhǔn)標(biāo)識符的總位數(shù)為 11 位,而擴(kuò)展標(biāo)識符的總位數(shù)為 29 位的。當(dāng)報文使用擴(kuò)展標(biāo)識符的時候,標(biāo)識符寄存器 CAN_TIxR 中的 STDID[10:0] 等效于 EXTID[18:28] 位,它與 EXTID[17:0] 共同組成完整的 29位擴(kuò)展標(biāo)識符。

2.3 CAN 接收 FIFO

圖 中的 CAN 外設(shè)框圖,在標(biāo)號處的是 CAN 外設(shè)的接收 FIFO,它一共有 2 個接收 FIFO,每個 FIFO 中有 3 個郵箱,即最多可以緩存 6 個接收到的報文。當(dāng)接收到報文時,F(xiàn)IFO 的報文計數(shù)器會自增,而 STM32 內(nèi)部讀取 FIFO 數(shù)據(jù)之后,報文計數(shù)器會自減,我們通過狀態(tài)寄存器可獲知報文計數(shù)器的值,而通過前面主控制寄存器的 RFLM 位,可設(shè)置鎖定模式,鎖定模式下 FIFO溢出時會丟棄新報文,非鎖定模式下 FIFO 溢出時新報文會覆蓋舊報文。跟發(fā)送郵箱類似,每個接收 FIFO 中包含有標(biāo)識符寄存器 CAN_RIxR、數(shù)據(jù)長度控制寄存器CAN_RDTxR 及 2 個數(shù)據(jù)寄存器 CAN_RDLxR、CAN_RDHxR,它們的功能見表。a899a754-b365-11ed-bfe3-dac502259ad0.png

通過中斷或狀態(tài)寄存器知道接收 FIFO 有數(shù)據(jù)后,我們再讀取這些寄存器的值即可把接收到的報文加載到 STM32 的內(nèi)存中

2.4 驗收篩選器

圖 中的 CAN 外設(shè)框圖,在標(biāo)號處的是 CAN 外設(shè)的驗收篩選器,一共有 28 個篩選器組,每個篩選器組有 2 個寄存器,CAN1 和 CAN2 共用的篩選器的。在 CAN 協(xié)議中,消息的標(biāo)識符與節(jié)點地址無關(guān),但與消息內(nèi)容有關(guān)。因此,發(fā)送節(jié)點將報文廣播給所有接收器時,接收節(jié)點會根據(jù)報文標(biāo)識符的值來確定軟件是否需要該消息,為了簡化軟件的工作,STM32 的 CAN 外設(shè)接收報文前會先使用驗收篩選器檢查,只接收需要的報文到 FIFO中。篩選器工作的時候,可以調(diào)整篩選 ID 的長度及過濾模式。根據(jù)篩選 ID 長度來分類有有以下兩種:(1) 檢查 STDID[10:0]、EXTID[17:0]、IDE 和 RTR 位,一共 31 位。(2) 檢查 STDID[10:0]、RTR、IDE 和 EXTID[17:15],一共 16 位。通過配置篩選尺度寄存器 CAN_FS1R 的 FSCx 位可以設(shè)置篩選器工作在哪個尺度。而根據(jù)過濾的方法分為以下兩種模式:(1) 標(biāo)識符列表模式,它把要接收報文的 ID 列成一個表,要求報文 ID 與列表中的某一個標(biāo)識符完全相同才可以接收,可以理解為白名單管理。(2) 掩碼模式,它把可接收報文 ID 的某幾位作為列表,這幾位被稱為掩碼,可以把它理解成關(guān)鍵字搜索,只要掩碼 (關(guān)鍵字) 相同,就符合要求,報文就會被保存到接收 FIFO。通過配置篩選模式寄存器 CAN_FM1R 的 FBMx 位可以設(shè)置篩選器工作在哪個模式。不同的尺度和不同的過濾方法可使篩選器工作在圖 的 4 種狀態(tài)。a8a9826e-b365-11ed-bfe3-dac502259ad0.png

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

a8cedf46-b365-11ed-bfe3-dac502259ad0.png

例如下面的表格所示,在掩碼模式時,第一個寄存器存儲要篩選的 ID,第二個寄存器存儲掩碼,掩碼為 1 的部分表示該位必須與 ID 中的內(nèi)容一致,篩選的結(jié)果為表中第三行的 ID 值,它是一組包含多個的 ID 值,其中 x 表示該位可以為 1 可以為 0。

a8e00172-b365-11ed-bfe3-dac502259ad0.png

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

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

2.5 整體控制邏輯

回到圖 結(jié)構(gòu)框圖,圖中的標(biāo)號處表示的是 CAN2 外設(shè)的結(jié)構(gòu),它與 CAN1 外設(shè)是一樣的,他們共用篩選器且由于存儲訪問控制器由 CAN1 控制,所以要使用 CAN2 的時候必須要使能CAN1 的時鐘。其中 STM32F103 系列芯片不具有 CAN2 控制器。

2.6 STM32 HAL庫代碼邏輯

2.6.1 初始化

注意:網(wǎng)絡(luò)上基本上用的很久的HAL庫,我們采用很新的1.25.2,最新的庫還是差異挺大的!從 STM32 的 CAN 外設(shè)我們了解到它的功能非常多,控制涉及的寄存器也非常豐富,而使用STM32 HAL 庫提供的各種結(jié)構(gòu)體及庫函數(shù)可以簡化這些控制過程。跟其它外設(shè)一樣,STM32HAL 庫提供了 CAN 初始化結(jié)構(gòu)體及初始化函數(shù)來控制 CAN 的工作方式,提供了收發(fā)報文使用的結(jié)構(gòu)體及收發(fā)函數(shù),還有配置控制篩選器模式及 ID 的結(jié)構(gòu)體。這些內(nèi)容都定義在庫文件“STM32F4xx_hal_can.h”及“STM32F4xx_hal_can.c”中,編程時我們可以結(jié)合這兩個文件內(nèi)的注釋使用或參考庫幫助文檔。首先我們來學(xué)習(xí)初始化結(jié)構(gòu)體的內(nèi)容,見代碼清單 1。代碼清單 CAN 初始化結(jié)構(gòu)

		
typedef struct
{
  uint32_t Prescaler;  /* 配置 CAN 外設(shè)的時鐘分頻,可設(shè)置為 1-1024*/
  uint32_t Mode;       /* 配置 CAN 的工作模式,回環(huán)或正常模式 */
  uint32_t SyncJumpWidth;  /* 配置 SJW 極限值 */
  uint32_t TimeSeg1;   /* 配置 BS1 段長度 */
  uint32_t TimeSeg2;   /* 配置 BS2 段長度 */
  FunctionalState TimeTriggeredMode;   /* 是否使能 TTCM 時間觸發(fā)功能 */
  FunctionalState AutoBusOff;     /* 是否使能 ABOM 自動離線管理功能 */
  FunctionalState AutoWakeUp;   /* 是否使能 AWUM 自動喚醒功能 */
  FunctionalState AutoRetransmission;  /* 是否使能 NART 自動重傳功能 */
  FunctionalState ReceiveFifoLocked;   /* 是否使能 RFLM 鎖定 FIFO 功能 */
  FunctionalState TransmitFifoPriority;/* 配置 TXFP 報文優(yōu)先級的判定方法 */
} CAN_InitTypeDef;
體這些結(jié)構(gòu)體成員說明如下,其中括號內(nèi)的文字是對應(yīng)參數(shù)在 STM32 HAL 庫中定義的宏(1) Prescaler本成員設(shè)置 CAN 外設(shè)的時鐘分頻,它可控制時間片 Tq 的時間長度,這里設(shè)置的值最終會減 1 后再寫入 BRP 寄存器位,即前面介紹的 Tq 計算公式:Tq = (BRP[9:0]+1) x TPCLK等效于:Tq = CAN_Prescaler x TPCLK(2) Mode本成員設(shè)置 CAN 的工作模式,可設(shè)置為正常模式 (CAN_MODE_NORMAL)、回環(huán)模式 (CAN_MODE_LOOPBACK)、靜默模式 (CAN_MODE_SILENT) 以及回環(huán)靜默模式(CAN_MODE_SILENT_LOOPBACK)。(3) SyncJumpWidth本成員可以配置 SJW 的極限長度,即 CAN 重新同步時單次可增加或縮短的最大長度,它可以被配置為 1-4Tq(CAN_SJW_1/2/3/4tq)。(4) TimeSeg1本成員用于設(shè)置 CAN 位時序中的 BS1 段的長度,它可以被配置為 1-16 個 Tq 長度(CAN_BS1_1/2/3…16tq)。(5) TimeSeg2本成員用于設(shè)置 CAN 位時序中的 BS2 段的長度,它可以被配置為 1-8 個 Tq 長度(CAN_BS2_1/2/3…8tq)。SYNC_SEG、 BS1 段及 BS2 段的長度加起來即一個數(shù)據(jù)位的長度,即前面介紹的原來計算公式:T1bit =1Tq+TS1+TS2=1+ (TS1[3:0] + 1)+ (TS2[2:0] + 1)等效于:T1bit= 1Tq+CAN_BS1+CAN_BS2(6) TimeTriggeredMode本成員用于設(shè)置是否使用時間觸發(fā)功能 (ENABLE/DISABLE),時間觸發(fā)功能在某些CAN 標(biāo)準(zhǔn)中會使用到。(7) AutoBusOff本成員用于設(shè)置是否使用自動離線管理 (ENABLE/DISABLE),使用自動離線管理可以在節(jié)點出錯離線后適時自動恢復(fù),不需要軟件干預(yù)。(8) AutoWakeUp本成員用于設(shè)置是否使用自動喚醒功能 (ENABLE/DISABLE),使能自動喚醒功能后它會在監(jiān)測到總線活動后自動喚醒。(9) AutoWakeUp本成員用于設(shè)置是否使用自動離線管理功能 (ENABLE/DISABLE),使用自動離線管理可以在出錯時離線后適時自動恢復(fù),不需要軟件干預(yù)。(10) AutoRetransmission本成員用于設(shè)置是否使用自動重傳功能 (ENABLE/DISABLE),使用自動重傳功能時,會一直發(fā)送報文直到成功為止。(11) ReceiveFifoLocked本成員用于設(shè)置是否使用鎖定接收 FIFO(ENABLE/DISABLE),鎖定接收 FIFO 后,若FIFO 溢出時會丟棄新數(shù)據(jù),否則在 FIFO 溢出時以新數(shù)據(jù)覆蓋舊數(shù)據(jù)。(12) TransmitFifoPriority本成員用于設(shè)置發(fā)送報文的優(yōu)先級判定方法 (ENABLE/DISABLE),使能時,以報文存入發(fā)送郵箱的先后順序來發(fā)送,否則按照報文 ID 的優(yōu)先級來發(fā)送。配置完這些結(jié)構(gòu)體成員后,我們調(diào)用庫函數(shù) HAL_CAN_Init 即可把這些參數(shù)寫入到 CAN 控制寄存器中,實現(xiàn) CAN 的初始化

2.6.2 CAN 發(fā)送及接收結(jié)構(gòu)體

在發(fā)送或接收報文時,需要往發(fā)送郵箱中寫入報文信息或從接收 FIFO 中讀取報文信息,利用STM32HAL 庫的發(fā)送及接收結(jié)構(gòu)體可以方便地完成這樣的工作,它們的定義見代碼清單 。代碼清單 39?2 CAN 發(fā)送及接收結(jié)構(gòu)體

		
typedef struct
{
  uint32_t StdId;    /* 存儲報文的標(biāo)準(zhǔn)標(biāo)識符 11 位,0-0x7FF. */
  uint32_t ExtId;    /* 存儲報文的擴(kuò)展標(biāo)識符 29 位,0-0x1FFFFFFF. */
  uint32_t IDE;     /* 存儲 IDE 擴(kuò)展標(biāo)志 */
  uint32_t RTR;    /* 存儲 RTR 遠(yuǎn)程幀標(biāo)志 */
  uint32_t DLC;     /* 存儲報文數(shù)據(jù)段的長度,0-8 */
  FunctionalState TransmitGlobalTime; 
} CAN_TxHeaderTypeDef;
typedef struct
{
  uint32_t StdId;    /* 存儲報文的標(biāo)準(zhǔn)標(biāo)識符 11 位,0-0x7FF. */
  uint32_t ExtId;    /* 存儲報文的擴(kuò)展標(biāo)識符 29 位,0-0x1FFFFFFF. */
  uint32_t IDE;     /* 存儲 IDE 擴(kuò)展標(biāo)志 */
  uint32_t RTR;      /* 存儲 RTR 遠(yuǎn)程幀標(biāo)志 */
  uint32_t DLC;     /* 存儲報文數(shù)據(jù)段的長度,0-8 */
  uint32_t Timestamp; 
  uint32_t FilterMatchIndex; 
} CAN_RxHeaderTypeDef;
這些結(jié)構(gòu)體成員, 說明如下:(1) StdId本成員存儲的是報文的 11 位標(biāo)準(zhǔn)標(biāo)識符,范圍是 0-0x7FF。(2) ExtId本成員存儲的是報文的 29 位擴(kuò)展標(biāo)識符,范圍是 0-0x1FFFFFFF。ExtId 與 StdId 這兩個成員根據(jù)下面的 IDE 位配置,只有一個是有效的。(3) IDE本成員存儲的是擴(kuò)展標(biāo)志 IDE 位,當(dāng)它的值為宏 CAN_ID_STD 時表示本報文是標(biāo)準(zhǔn)幀,使用 StdId 成員存儲報文 ID;當(dāng)它的值為宏 CAN_ID_EXT 時表示本報文是擴(kuò)展幀,使用 ExtId 成員存儲報文 ID。(4) RTR本成員存儲的是報文類型標(biāo)志 RTR 位,當(dāng)它的值為宏 CAN_RTR_Data 時表示本報文是數(shù)據(jù)幀;當(dāng)它的值為宏 CAN_RTR_Remote 時表示本報文是遙控幀,由于遙控幀沒有數(shù)據(jù)段,所以當(dāng)報文是遙控幀時,數(shù)據(jù)是無效的(5) DLC本成員存儲的是數(shù)據(jù)幀數(shù)據(jù)段的長度,它的值的范圍是 0-8,當(dāng)報文是遙控幀時 DLC值為 0。

2.6.3 CAN 篩選器結(jié)構(gòu)體

CAN 的篩選器有多種工作模式,利用篩選器結(jié)構(gòu)體可方便配置,它的定義見代碼清單 。代碼清單CAN 篩選器結(jié)構(gòu)體

		
typedef struct
{
  uint32_t FilterIdHigh;         /*CAN_FxR1 寄存器的高 16 位 */
  uint32_t FilterIdLow;         /*CAN_FxR1 寄存器的低 16 位 */
  uint32_t FilterMaskIdHigh;   /*CAN_FxR2 寄存器的高 16 位 */
  uint32_t FilterMaskIdLow;    /*CAN_FxR2 寄存器的低 16 位 */
  uint32_t FilterFIFOAssignment;  /* 設(shè)置經(jīng)過篩選后數(shù)據(jù)存儲到哪個接收 FIFO */
  uint32_t FilterBank;            /* 篩選器編號,范圍 0-27,數(shù)據(jù)手冊上說0-27是CAN1/CAN2共享,但是實測發(fā)現(xiàn)并不是這樣,CAN1是0-13,CAN2是14-27 */
  uint32_t FilterMode;            /* 篩選器模式 */
  uint32_t FilterScale;           /* 設(shè)置篩選器的尺度 */
  uint32_t FilterActivation;      /* 是否使能本篩選器 */
  uint32_t SlaveStartFilterBank;  
} CAN_FilterTypeDef;
這些結(jié)構(gòu)體成員都是“41.2.14 驗收篩選器”小節(jié)介紹的內(nèi)容,可對比閱讀,各個結(jié)構(gòu)體成員的介紹如下:(1) FilterIdHighFilterIdHigh 成員用于存儲要篩選的 ID,若篩選器工作在 32 位模式,它存儲的是所篩選 ID 的高 16 位;若篩選器工作在 16 位模式,它存儲的就是一個完整的要篩選的 ID。(2) FilterIdLow類似地,F(xiàn)ilterIdLow 成員也是用于存儲要篩選的 ID,若篩選器工作在 32 位模式,它存儲的是所篩選 ID 的低 16 位;若篩選器工作在 16 位模式,它存儲的就是一個完整的要篩選的 ID。(3) FilterMaskIdHighFilterMaskIdHigh 存儲的內(nèi)容分兩種情況,當(dāng)篩選器工作在標(biāo)識符列表模式時,它的功能與 FilterIdHigh 相同,都是存儲要篩選的 ID;而當(dāng)篩選器工作在掩碼模式時,它存儲的是 FilterIdHigh 成員對應(yīng)的掩碼,與 FilterIdLow 組成一組篩選器。(4) FilterMaskIdLow類似地, FilterMaskIdLow 存儲的內(nèi)容也分兩種情況,當(dāng)篩選器工作在標(biāo)識符列表模式時,它的功能與 FilterIdLow 相同,都是存儲要篩選的 ID;而當(dāng)篩選器工作在掩碼模式時,它存儲的是 FilterIdLow 成員對應(yīng)的掩碼,與 FilterIdLow 組成一組篩選器。上面四個結(jié)構(gòu)體的存儲的內(nèi)容很容易讓人糊涂,請結(jié)合前面的圖 39_0_15 和下面的表 39?7 理解,如果還搞不清楚,再結(jié)合庫函數(shù) FilterInit 的源碼來分析。表不同模式下各結(jié)構(gòu)體成員的內(nèi)容:a8edc5e6-b365-11ed-bfe3-dac502259ad0.png

對這些結(jié)構(gòu)體成員賦值的時候,還要注意寄存器位的映射,即注意哪部分代表 STID,哪部分代表 EXID 以及 IDE、RTR 位。

(5) FilterFIFOAssignment本成員用于設(shè)置當(dāng)報文通過篩選器的匹配后,該報文會被存儲到哪一個接收 FIFO,它的可選值為 FIFO0 或 FIFO1(宏 CAN_FILTER_FIFO0/1)。(6) FilterBank本成員用于設(shè)置篩選器的編號,即本過濾器結(jié)構(gòu)體配置的是哪一組篩選器,CAN 一共有 28 個篩選器,所以它的可輸入?yún)?shù)范圍為 0-27。(7) FilterMode本 成 員 用 于 設(shè) 置 篩 選 器 的 工 作 模 式, 可 以 設(shè) 置 為 列 表 模 式 (宏CAN_FILTERMODE_IDLIST) 及掩碼模式 (宏 CAN_FILTERMODE_IDMASK)。(8) FilterScale本成員用于設(shè)置篩選器的尺度,可以設(shè)置為 32 位長 (宏 CAN_FILTERSCALE_32BIT)及 16 位長 (宏 CAN_FILTERSCALE_16BIT)。(9) FilterActivation本成員用于設(shè)置是否激活這個篩選器 (宏 ENABLE/DISABLE)。

三. CAN Cubemx配置

我們通過問題來熟悉下cubemx配置,你熟悉了這些問題基本就知道怎么配置了!問題:Parameter Settings分別都是設(shè)置什么的?答案:如圖a92824d4-b365-11ed-bfe3-dac502259ad0.png

問題:怎么配置波特率呢?

答案:用我上面貼的工具(CAN波特率計算 f103AHP1_36M f407AHP1_42M 采樣點軟件有說明.rar)直接配置,舉兩個個例子例子1:我們要配置成500KHz,那么我們這樣配置a935c224-b365-11ed-bfe3-dac502259ad0.pnga94df9fc-b365-11ed-bfe3-dac502259ad0.png

我們用采集點為80%,所以BS1為4tq,BS2為2tq,分頻系數(shù)為12,代進(jìn)公式Fpclk1/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler)=42M/(4+2+1)/12=500kHz

例子2:我們要配置成1M Hz,那么我們這樣配置a960ebac-b365-11ed-bfe3-dac502259ad0.png

我們用采集點為75%,所以BS1為3tq,BS2為2tq,分頻系數(shù)為7,代進(jìn)公式Fpclk1/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler)=42M/(3+2+1)/7=1MHz

a9b2d5ca-b365-11ed-bfe3-dac502259ad0.png

問題:Basic Parameter分別是啥意思呢?

a9c24a1e-b365-11ed-bfe3-dac502259ad0.png

Timer Triggered Communication Mode:否使用時間觸發(fā)功能 (ENABLE/DISABLE),時間觸發(fā)功能在某些CAN 標(biāo)準(zhǔn)中會使用到。

Automatic Bus-Off Management:用于設(shè)置是否使用自動離線管理功能 (ENABLE/DISABLE),使用自動離線管理可以在出錯時離線后適時自動恢復(fù),不需要軟件干預(yù)。Automatic Wake-Up Mode:用于設(shè)置是否使用自動喚醒功能 (ENABLE/DISABLE),使能自動喚醒功能后它會在監(jiān)測到總線活動后自動喚醒。Automatic Retransmission:用于設(shè)置是否使用自動重傳功能 (ENABLE/DISABLE),使用自動重傳功能時,會一直發(fā)送報文直到成功為止。Receive Fifo Locked Mode:用于設(shè)置是否使用鎖定接收 FIFO(ENABLE/DISABLE),鎖定接收 FIFO 后,若FIFO 溢出時會丟棄新數(shù)據(jù),否則在 FIFO 溢出時以新數(shù)據(jù)覆蓋舊數(shù)據(jù)。Transmit Fifo Priority:用于設(shè)置發(fā)送報文的優(yōu)先級判定方法 (ENABLE/DISABLE),使能時,以報文存入發(fā)送郵箱的先后順序來發(fā)送,否則按照報文 ID 的優(yōu)先級來發(fā)送。配置完這些結(jié)構(gòu)體成員后,我們調(diào)用庫函數(shù) HAL_CAN_Init 即可把這些參數(shù)寫入到 CAN 控制寄存器中,實現(xiàn) CAN 的初始化

問題:為啥CAN分為RX0,RX1中斷呢?

a9d2ec70-b365-11ed-bfe3-dac502259ad0.png

答案:STM32有2個3級深度的接收緩沖區(qū):FIFO0和FIFO1,每個FIFO都可以存放3個完整的報文,它們完全由硬件來管理。如果是來自FIFO0的接收中斷,則用CAN1_RX0_IRQn中斷來處理。如果是來自FIFO1的接收中斷,則用CAN1_RX1_IRQn中斷來處理,如圖:

a9e24a62-b365-11ed-bfe3-dac502259ad0.png

問題:CAN SCE中斷時什么?

aa05f278-b365-11ed-bfe3-dac502259ad0.png

答案:status chanege error,錯誤和狀態(tài)變化中斷!

四.CAN分析工具的使用

下面我們會用到CAN分析工具,還是比較好用的,此部分使用作為自己使用
https://www.zhcxgd.com/h-col-112.html

五. 實驗

1.Normal模式測試500K 波特率(定時發(fā)送,輪詢接收)

1.1 CubeMx配置

aa19bce0-b365-11ed-bfe3-dac502259ad0.pngaa3127ae-b365-11ed-bfe3-dac502259ad0.png

1.2 設(shè)置Filter過濾,我們只使能FIFO0,并且不過濾任何消息


		
uint8_t bsp_can1_filter_config(void)
{
    CAN_FilterTypeDef filter = {0};
    filter.FilterActivation = ENABLE;
    filter.FilterMode = CAN_FILTERMODE_IDMASK;
    filter.FilterScale = CAN_FILTERSCALE_32BIT;
    filter.FilterBank = 0;
    filter.FilterFIFOAssignment = CAN_FILTER_FIFO0;
    filter.FilterIdLow = 0;
    filter.FilterIdHigh = 0;
    filter.FilterMaskIdLow = 0;
    filter.FilterMaskIdHigh = 0;
    HAL_CAN_ConfigFilter(&hcan1, &filter);
    return BSP_CAN_OK;
}

1.3 開啟CAN(注意,默認(rèn)Cubemx生成的代碼并沒有can start)


		
HAL_CAN_Start(&hcan1);

1.4 編寫發(fā)送函數(shù)

我們開出了幾個參數(shù),id_type是擴(kuò)展幀還是標(biāo)準(zhǔn)幀,basic_id標(biāo)準(zhǔn)幀ID(在標(biāo)準(zhǔn)幀中有效),ex_id擴(kuò)展幀ID(在擴(kuò)展幀中有效),data要發(fā)送的數(shù)據(jù),data_len要發(fā)送的數(shù)據(jù)長度。

		
uint8_t bsp_can1_send_msg(uint32_t id_type,uint32_t basic_id,uint32_t ex_id,uint8_t *data,uint32_t data_len)
{
    uint8_t index = 0;
    uint32_t *msg_box;
 uint8_t send_buf[8] = {0};
    CAN_TxHeaderTypeDef send_msg_hdr;
    send_msg_hdr.StdId = basic_id;
    send_msg_hdr.ExtId = ex_id;
    send_msg_hdr.IDE = id_type;
    send_msg_hdr.RTR = CAN_RTR_DATA;
    send_msg_hdr.DLC = data_len;
 send_msg_hdr.TransmitGlobalTime = DISABLE;
 for(index = 0; index < data_len; index++)
          send_buf[index] = data[index];
 
    HAL_CAN_AddTxMessage(&hcan1,&send_msg_hdr,send_buf,msg_box);
    return BSP_CAN_OK;
}
我們在main函數(shù)中1s發(fā)送一幀,標(biāo)準(zhǔn)幀跟擴(kuò)展幀交叉調(diào)用,代碼如下:

		
send_data[0]++;
send_data[1]++;
send_data[2]++;
send_data[3]++;
send_data[4]++;
send_data[5]++;
send_data[6]++;
send_data[7]++;
if(id_type_std == 1)
{
    bsp_can1_send_msg(CAN_ID_STD,1,2,send_data,8);
    id_type_std = 0;
}
else
{
    bsp_can1_send_msg(CAN_ID_EXT,1,2,send_data,8);
    id_type_std = 1;
}
HAL_Delay(1000);
我們通過CAN協(xié)議分析儀來抓下結(jié)果:aa4087d0-b365-11ed-bfe3-dac502259ad0.png

1.5 編寫輪詢接收函數(shù)


		
uint8_t bsp_can1_polling_recv_msg(uint32_t *basic_id,uint32_t *ex_id,uint8_t *data,uint32_t *data_len)
{
 uint8_t index = 0;
 uint8_t recv_data[8];
    CAN_RxHeaderTypeDef header;
 
    while (HAL_CAN_GetRxFifoFillLevel(&hcan1, CAN_RX_FIFO0) != 0)
    {
        if (__HAL_CAN_GET_FLAG(&hcan1, CAN_FLAG_FOV0) != RESET)
            printf("[CAN] FIFO0 overrun!
");


        HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &header, recv_data);
        if(header.IDE == CAN_ID_STD)
        {
            printf("StdId ID:%d
",header.StdId);
        }
        else
        {
            printf("ExtId ID:%d
",header.ExtId);
        }
        printf("CAN IDE:0x%x
",header.IDE);
        printf("CAN RTR:0x%x
",header.RTR);
        printf("CAN DLC:0x%x
",header.DLC);
        printf("RECV DATA:");
        for(index = 0; index < header.DLC; index++)
        {
            printf("0x%x ",recv_data[index]);
        }
        printf("
");
    }
}
實驗一總結(jié):1.沒用調(diào)用HAL_CAN_Start(&hcan1);使能CAN2.沒有編寫Filter函數(shù),我開始自認(rèn)為不設(shè)置就默認(rèn)不過濾,現(xiàn)在看來是我想多了,其實想想也合理,你如果不過濾分配FIFO,STM32怎么決定把收到的放到哪個FIFO中待提升:1.目前只用到FIFO0,待把FIFO1使用起來2.Normal模式測試500K 波特率(定時發(fā)送,中斷接收)

2.1 CubeMx配置

aa4ecd18-b365-11ed-bfe3-dac502259ad0.pngaa5c529e-b365-11ed-bfe3-dac502259ad0.png

步驟2,3,4跟polling完全一致,我們來直接說下中斷怎么用(主要是使能notifity就行了)


		
static void MX_CAN1_Init(void)
{
  /* USER CODE BEGIN CAN1_Init 0 */
  /* USER CODE END CAN1_Init 0 */
  /* USER CODE BEGIN CAN1_Init 1 */
  /* USER CODE END CAN1_Init 1 */
  hcan1.Instance = CAN1;
  hcan1.Init.Prescaler = 12;
  hcan1.Init.Mode = CAN_MODE_NORMAL;
  hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan1.Init.TimeSeg1 = CAN_BS1_4TQ;
  hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
  hcan1.Init.TimeTriggeredMode = DISABLE;
  hcan1.Init.AutoBusOff = ENABLE;
  hcan1.Init.AutoWakeUp = ENABLE;
  hcan1.Init.AutoRetransmission = DISABLE;
  hcan1.Init.ReceiveFifoLocked = DISABLE;
  hcan1.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CAN1_Init 2 */
  bsp_can1_filter_config();
 HAL_CAN_Start(&hcan1);
 HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);
  /* USER CODE END CAN1_Init 2 */
}
下面我們來編寫下中斷函數(shù):

		
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
 uint8_t index = 0;
 uint8_t recv_data[8];
      CAN_RxHeaderTypeDef header;
 
 HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &header, recv_data);
 if(header.IDE == CAN_ID_STD)
 {
          printf("StdId ID:%d
",header.StdId);
 }
 else
 {
          printf("ExtId ID:%d
",header.ExtId);
 }
 printf("CAN IDE:0x%x
",header.IDE);
 printf("CAN RTR:0x%x
",header.RTR);
 printf("CAN DLC:0x%x
",header.DLC);
 printf("RECV DATA:");
 for(index = 0; index < header.DLC; index++)
 {
          printf("0x%x ",recv_data[index]);
 }
 printf("
");
}

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    17100

    瀏覽量

    184219
  • CAN
    CAN
    +關(guān)注

    關(guān)注

    57

    文章

    2919

    瀏覽量

    467744
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1804

    瀏覽量

    95907
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1541

    瀏覽量

    127796
  • 總線協(xié)議
    +關(guān)注

    關(guān)注

    0

    文章

    130

    瀏覽量

    15275

原文標(biāo)題:長文 | 關(guān)于CAN協(xié)議的總結(jié)筆記,先收藏了!

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    關(guān)于TCP/IP協(xié)議的知識總結(jié)

    今天浩道跟大家分享關(guān)于TCP/IP協(xié)議的硬核干貨總結(jié),我常常跟小伙伴說,一個簡短硬核的知識總結(jié),可以讓大家快速掌握這些知識體系,喜歡的小伙伴可以收藏起來,隨時查看復(fù)習(xí)!
    的頭像 發(fā)表于 10-31 11:48 ?1699次閱讀
    <b class='flag-5'>關(guān)于</b>TCP/IP<b class='flag-5'>協(xié)議</b>的知識<b class='flag-5'>總結(jié)</b>

    汽車通信協(xié)議資料總結(jié)

    1.常見的汽車通信協(xié)議總結(jié)。包括can通信, 診斷協(xié)議uds . LIN通信 ,j1939, ISO14229, ISO15675,OBD 等等希望有需要的可以學(xué)習(xí)學(xué)習(xí)!
    發(fā)表于 09-06 20:39

    關(guān)于VoIP協(xié)議標(biāo)準(zhǔn)的知識點總結(jié)的太棒了

    關(guān)于VoIP協(xié)議標(biāo)準(zhǔn)的知識點總結(jié)的太棒了
    發(fā)表于 05-27 06:53

    關(guān)于晶體三極管的學(xué)習(xí)筆記總結(jié)的太棒了

    關(guān)于晶體三極管的學(xué)習(xí)筆記總結(jié)的太棒了
    發(fā)表于 06-08 06:14

    CAN-FD協(xié)議你了解多少

    關(guān)注+星標(biāo)公眾號,不錯過精彩內(nèi)容來源 |安富萊電子編排 |strongerHuang之前給大家分享過很多關(guān)于CAN的文章:CANOpen系列教程CAN-FD協(xié)議你了解多少?第三代
    發(fā)表于 08-19 08:13

    學(xué)習(xí)CAN協(xié)議過程中的理解總結(jié)

    的。靜下心來慢慢看就好了!我在這里記錄一些我學(xué)習(xí)CAN協(xié)議過程中的理解總結(jié),希望能幫到一些初學(xué)者。 CAN的組成框圖下圖為互聯(lián)網(wǎng)型的雙CAN
    發(fā)表于 08-20 07:48

    CAN協(xié)議及標(biāo)準(zhǔn)規(guī)格

    ISO 標(biāo)準(zhǔn)化的CAN 協(xié)議CAN 協(xié)議經(jīng)ISO 標(biāo)準(zhǔn)化后有ISO11898 標(biāo)準(zhǔn)和ISO11519-2 標(biāo)準(zhǔn)兩種。ISO11898 和ISO11519-2 標(biāo)準(zhǔn)對于數(shù)據(jù)鏈路層的定義相
    發(fā)表于 03-25 09:18 ?272次下載
    <b class='flag-5'>CAN</b><b class='flag-5'>協(xié)議</b>及標(biāo)準(zhǔn)規(guī)格

    CAN 的較高層協(xié)議和子協(xié)議

    CAN 的較高層協(xié)議和子協(xié)議 本文主要介紹了幾個基于CAN 的較高層協(xié)議CAL/CANopen DeviceNet SDS 并且對這幾個較
    發(fā)表于 03-22 15:31 ?34次下載

    基于CAN的較高層協(xié)議和子協(xié)議

    基于CAN的較高層協(xié)議和子協(xié)議
    發(fā)表于 10-18 16:38 ?21次下載
    基于<b class='flag-5'>CAN</b>的較高層<b class='flag-5'>協(xié)議</b>和子<b class='flag-5'>協(xié)議</b>

    CAN總線和基于CAN總線的高層協(xié)議

    針對不同的目的和要求的基于CAN協(xié)議的較高層協(xié)議標(biāo)準(zhǔn)。下面就對CAN 協(xié)議及其較高層協(xié)議Devi
    發(fā)表于 05-09 10:26 ?2978次閱讀
    <b class='flag-5'>CAN</b>總線和基于<b class='flag-5'>CAN</b>總線的高層<b class='flag-5'>協(xié)議</b>

    關(guān)于CAN的資料

    關(guān)于CAN的資料,CAN通信初學(xué)的一些入門資料。
    發(fā)表于 05-25 10:51 ?9次下載

    基于CAN的較高層協(xié)議和子協(xié)議

    基于CAN的較高層協(xié)議和子協(xié)議
    發(fā)表于 12-14 16:39 ?13次下載

    CAN總線協(xié)議是什么?CAN總線協(xié)議有哪些?CAN總線協(xié)議知識分析

    本文說的CAN即是一種總線,也是一種協(xié)議。因此,我們常聽見CAN總線,也常聽見CAN協(xié)議。CAN
    的頭像 發(fā)表于 10-03 19:53 ?7.6w次閱讀
    <b class='flag-5'>CAN</b>總線<b class='flag-5'>協(xié)議</b>是什么?<b class='flag-5'>CAN</b>總線<b class='flag-5'>協(xié)議</b>有哪些?<b class='flag-5'>CAN</b>總線<b class='flag-5'>協(xié)議</b>知識分析

    Can通信接口學(xué)習(xí)筆記

    Can通信接口學(xué)習(xí)筆記
    發(fā)表于 12-08 16:36 ?29次下載
    <b class='flag-5'>Can</b>通信接口學(xué)習(xí)<b class='flag-5'>筆記</b>

    CAN協(xié)議棧與LIN協(xié)議棧介紹

    CAN協(xié)議棧 汽車CAN協(xié)議棧是一種軟件組件,用于實現(xiàn)汽車電子系統(tǒng)中的CAN總線通信功能。它包含了一系列的功能軟件,用于處理
    的頭像 發(fā)表于 10-27 16:16 ?3817次閱讀
    <b class='flag-5'>CAN</b><b class='flag-5'>協(xié)議</b>棧與LIN<b class='flag-5'>協(xié)議</b>棧介紹