背景介紹
CAN 是控制器局域網(wǎng)絡(luò)(Controller Area Network,CAN)的簡稱浓冒,是一種能夠?qū)崿F(xiàn)分布式實時控制的串行通信網(wǎng)絡(luò)
CAN 的發(fā)展歷史節(jié)點(diǎn):
- 1983年笋颤,BOSCH開始著手開發(fā)CAN總線;
- 1986 年,在SAE會議上,CAN總線正式發(fā)布
- 1987 年诡必,Intel和Philips 推出第一款CAN控制器芯片
- 1991年脊框,奔馳 500E 是世界上第一款基于CAN總線系統(tǒng)的量產(chǎn)車型
- 1991年,Bosch發(fā)布CAN 2.0標(biāo)準(zhǔn)单雾,分 CAN 2.0A (11位標(biāo)識符)和 CAN 2.0B (29位標(biāo)識符)赚哗;
-
1991年, ISO發(fā)布CAN總線標(biāo)準(zhǔn)(ISO 11898)硅堆,隨后該標(biāo)準(zhǔn)主要有三部分:
- ISO 11898-1:數(shù)據(jù)鏈路層協(xié)議
- ISO 11898-2:高速CAN總線物理層協(xié)議屿储,通信速度為 125kbps-1Mbps。
- ISO 11898-3:(整合了ISO11519)低速CAN總線物理層協(xié)議硬萍,通信速度為 125kbps 以下扩所。
- 2011 年,開始CAN FD協(xié)議的開發(fā)朴乖。
- 2015年祖屏,ISO11898-1進(jìn)行了修訂,將CAN FD加入其中买羞。
CAN 總線協(xié)議介紹
CAN總線協(xié)議有CAN1.0袁勺、CAN2.0(CAN2.0A,CAN2.0B),其中CAN2.0對比1.0,主要是增加了CAN的擴(kuò)展幀定義⌒笃眨現(xiàn)在我們所說的CAN通常都是指CAN2.0標(biāo)準(zhǔn)的總線
CAN-FD協(xié)議在原有的CAN協(xié)議基礎(chǔ)上期丰,增加了可變波特率、擴(kuò)大數(shù)據(jù)場吃挑、提升校驗算法安全性等改進(jìn)钝荡。
本文主要講述CAN的數(shù)據(jù)通信
CAN 的物理通信形式
通過兩條通信線(雙絞線)產(chǎn)生的電壓差傳輸數(shù)據(jù),一個CAN網(wǎng)絡(luò)里的所有節(jié)點(diǎn)都掛在這兩條通信線上舶衬,使用差分信號半雙工通信埠通。
CAN 使用稱為CANH/CANL 的通信線程執(zhí)行傳輸和接收。電位差較小的電信號稱為隱性(Recessive)信號逛犹,其邏輯值為1 端辱。電位差較大的電信號稱為顯性(Dominant)信號,其邏輯值0.如果通信總線上發(fā)生顯性和隱性沖突虽画,則顯性優(yōu)先舞蔽。總線空閑時保持隱性码撰。
CAN總線的物理層邏輯電平渗柿,分為高速ISO11898標(biāo)準(zhǔn)(125kbps ~ 1Mbps)和低速ISO11519標(biāo)準(zhǔn)(10kbps ~ 125kbps);
低速的物理電平如圖
而我們現(xiàn)在通常使用的CAN2.0脖岛,都是使用高速CAN標(biāo)準(zhǔn)做祝,其物理層電平如圖:
對于高速CAN,總結(jié)一下砾省,也就是:
- CAN_H - CAN_L < 0.5V 時候為隱性的,邏輯信號表現(xiàn)為 “邏輯1”- 高電平
- CAN_H - CAN_L > 0.9V 時候為顯性的混槐,邏輯信號表現(xiàn)為 “邏輯0”-低電平
關(guān)于CAN 通信的電平傳輸编兄,一個重要概念就是:
CAN 總線在電平 傳輸上,具有判斷邏輯声登,優(yōu)先級為:顯性(低電平)> 隱性(高電平)
在理解CAN總線傳輸過程中狠鸳,要清楚這一規(guī)則在傳輸時的靈活運(yùn)用,及便理解各種幀形式的優(yōu)先級
CAN的數(shù)據(jù)格式
CAN的數(shù)據(jù)定義了有5種幀類型
幀 | 幀用途 |
---|---|
數(shù)據(jù)幀 | 用于節(jié)點(diǎn)向外傳送數(shù)據(jù) |
遙控幀 | 用于向運(yùn)端節(jié)點(diǎn)請求數(shù)據(jù) |
錯誤幀 | 用于向遠(yuǎn)端節(jié)點(diǎn)通知校驗錯誤悯嗓,請求重新發(fā)送上一個數(shù)據(jù) |
過載幀 | 用于通知遠(yuǎn)端節(jié)點(diǎn):本節(jié)點(diǎn)尚未做好接收準(zhǔn)備 |
幀間隔 | 用于將數(shù)據(jù)幀及遙控幀與前面的幀分離開來 |
其中件舵,遙控幀也常被稱為遠(yuǎn)程幀。CAN的應(yīng)用開發(fā)者只能使用“數(shù)據(jù)幀”和“遙控幀”脯厨,其他的3種幀類型是由CAN的底層固件自動幫我們在特定場景下進(jìn)行收發(fā)铅祸,開發(fā)者無需擔(dān)心也無法直接參與控制。
所以合武,本文把“數(shù)據(jù)幀”和“遙控幀”與其他的3種幀類型分別進(jìn)行介紹临梗。
數(shù)據(jù)幀與遙控幀
關(guān)于數(shù)據(jù)幀,也就是我們最常用的幀類型稼跳,用于數(shù)據(jù)的收發(fā)盟庞;也是CAN通信里最主要的內(nèi)容。
而遙控幀汤善,只是CAN網(wǎng)絡(luò)里的某一節(jié)點(diǎn)發(fā)送一個遙控幀請求其他的節(jié)點(diǎn)反饋數(shù)據(jù)給自己什猖,關(guān)于遙控幀其實在實際使用中,顯得很雞肋红淡,原因有:
1不狮、CAN通信作為一種半雙工通信形式,在實際使用中的應(yīng)用層通信協(xié)議往往會定義好數(shù)據(jù)的應(yīng)答機(jī)制與時間間隔在旱,節(jié)點(diǎn)與節(jié)點(diǎn)之間只要按照協(xié)議規(guī)定進(jìn)行數(shù)據(jù)的收發(fā)即可摇零。
2、遙控幀與數(shù)據(jù)幀對比颈渊,其實就是一條數(shù)據(jù)長度為0的數(shù)據(jù)幀而已,只是在幀格式里的仲裁段RTR位為隱性终佛。那么俊嗽,似乎有數(shù)據(jù)幀就足夠了。
3铃彰、遙控幀的概念定義只是一個預(yù)定義绍豁,所謂的請求其他節(jié)點(diǎn)給自己發(fā)送數(shù)據(jù)并不是強(qiáng)制的,與數(shù)據(jù)幀一樣完全根據(jù)應(yīng)用層協(xié)議來規(guī)定其具體的使用牙捉。
綜上所述竹揍,CAN里定義的遙控幀實際作用不大敬飒,而且可以用數(shù)據(jù)幀配合應(yīng)用協(xié)議的定義,進(jìn)行替代芬位。所以在后來的CAN-FD中已經(jīng)取消了遙控幀的定義了无拗。
數(shù)據(jù)幀 與 遙控幀的數(shù)據(jù)格式
不管理Classic CAN Frame 還是CANFD Frame ,其幀結(jié)構(gòu)都由以下7個段組成:
-- SOF 幀起始
-- arbitration field 仲裁段
-- control field 控制段
-- data field 數(shù)據(jù)段
-- CRC field CRC段
-- ACK field ACK段
-- EOF 幀結(jié)束
依次排序為
幀起始 | 仲裁段 | 控制段 | 數(shù)據(jù)段 | CRC段 | ACK段 | 結(jié)束段 |
---|
這7個段昧碉,每個段里又都 有自已的格式細(xì)分英染,有兩種格式:標(biāo)準(zhǔn)備格式和擴(kuò)展格展格式。
CAN的應(yīng)用開發(fā)者只使用其中的仲裁段被饿、控制段和數(shù)據(jù)段四康。其他部分都由CAN底層固件自動封裝!
由上圖可以看到狭握,對于仲裁段和控制段在標(biāo)準(zhǔn)幀與擴(kuò)展幀里有不同的定義闪金,其他段一致。
幀起始與幀結(jié)束
- SOF 幀起始:由一個顯性位(低電平)組成论颅,發(fā)送節(jié)點(diǎn)發(fā)送幀起始哎垦,其他節(jié)點(diǎn)同步于幀起始
- EOF幀結(jié)束:由7個隱形位(高電平)組成
仲裁段內(nèi)容
- RTR位:用于指于這包數(shù)據(jù)是遙控幀還是數(shù)據(jù)幀,數(shù)據(jù)幀的RTR 位為顯性電平(值為0)嗅辣,遠(yuǎn)程幀為隱性電平(值為1)
所以幀格式和幀ID相同的懷脫 下撼泛,數(shù)據(jù)幀優(yōu)先于遠(yuǎn)程幀
- IDE : 用于指于這包數(shù)據(jù)是標(biāo)準(zhǔn)幀還是擴(kuò)展幀,標(biāo)準(zhǔn)幀的IDE位為顯性電平(值為0)澡谭,擴(kuò)展幀的IDE位為隱性電平愿题。
對于前11位ID相同的標(biāo)準(zhǔn)幀和擴(kuò)展幀,標(biāo)準(zhǔn)幀優(yōu)先級比擴(kuò)展幀高
數(shù)據(jù)段
一個數(shù)據(jù)幀傳輸?shù)臄?shù)據(jù)量為0~8個字節(jié)蛙奖,遙控幀的數(shù)據(jù)長度固定為0