Linux應(yīng)用程序開發(fā)之CAN編程介紹
14.1 ?CAN介紹
14.1.1 ?CAN是什么?
CAN,全稱為“Controller Area Network”,即控制器局域網(wǎng),是國際上應(yīng)用最廣泛的現(xiàn)場總線之一。
最初,CAN被設(shè)計(jì)作為汽車環(huán)境中的微控制器通訊,在車載各電子控制裝置 ECU 之間交換信息,形成汽車電子控制網(wǎng)絡(luò)。比如:發(fā)動(dòng)機(jī)管理系統(tǒng)、變速箱控制器、儀表裝備、電子主干系統(tǒng)中,均嵌入CAN控制裝置。
一個(gè)由 CAN 總線構(gòu)成的單一網(wǎng)絡(luò)中,理論上可以掛接無數(shù)個(gè)節(jié)點(diǎn)。實(shí)際應(yīng)用中,節(jié)點(diǎn)數(shù)目受網(wǎng)絡(luò)硬件 的電氣特性所限制。例如,當(dāng)使用 Philips P82C250 作為CAN收發(fā)器時(shí),同一網(wǎng)絡(luò)中允許掛接110個(gè)節(jié)點(diǎn)。
CAN可提供高達(dá)1Mbit/s的數(shù)據(jù)傳輸速率,這使實(shí)時(shí)控制變得非常容易。另外,硬件的錯(cuò)誤檢定特性也增強(qiáng)了CAN的抗電磁干擾能力。?
14.1.2 CAN的起源
CAN最初出現(xiàn)在 80 年代末的汽車工業(yè)中,由德國 Bosch 公司最先提出。當(dāng)時(shí),由于消費(fèi)者對于汽車功能的要求越來越多,而這些功能的實(shí)現(xiàn)大多是基于電子操作的,這就使得電子裝置之間的通訊越來越復(fù)雜同時(shí)意味著需要更多的連接信號線。
提出 CAN 總線的最初動(dòng)機(jī)就是為了解決現(xiàn)代汽車中龐大的電子控制裝置之間的通訊,減少不斷增加的信號線。于是,他們設(shè)計(jì)了一個(gè)單一的網(wǎng)絡(luò)總線,所有的外圍器件可以被掛接在該總線上。
1993 年,CAN已成為國際標(biāo)準(zhǔn)ISO11898(高速應(yīng)用)和 ISO11519(低速應(yīng)用)。 CAN 是一種多主方式的串行通訊總線,基本設(shè)計(jì)規(guī)范要求有高的位速率,高抗電磁干擾性,而且能夠檢測出產(chǎn)生的任何錯(cuò)誤。
當(dāng)信號傳輸距離達(dá)到 10Km 時(shí),CAN 仍可提供高達(dá) 50Kbit/s 的數(shù)據(jù)傳輸速率。由于 CAN 總線具有很高的實(shí)時(shí)性能,因此,CAN 已經(jīng)在汽車工業(yè)、航空工業(yè)、工業(yè)控制、安全防護(hù)等領(lǐng) 域中得到了廣泛應(yīng)用。?
CAN 通訊協(xié)議主要描述設(shè)備之間的信息傳遞方式。CAN 層的定義與開放系統(tǒng)互連模型(OSI)一致。每 一層與另一設(shè)備上相同的那一層通訊。實(shí)際的通訊發(fā)生在每一設(shè)備上相鄰的兩層,而設(shè)備只通過模型物理層的物理介質(zhì)互連。
CAN 的規(guī)范定義了模型的最下面兩層:數(shù)據(jù)鏈路層和物理層。下表中展示了 OSI 開放 式互連模型的各層。應(yīng)用層協(xié)議可以由 CAN 用戶定義成適合特別工業(yè)領(lǐng)域的任何方案。已在工業(yè)控制和制造業(yè)領(lǐng)域得到廣泛應(yīng)用的標(biāo)準(zhǔn)是 DeviceNet,這是為 PLC 和智能傳感器設(shè)計(jì)的。在汽車工業(yè),許多制造商都應(yīng)用他們自己的標(biāo)準(zhǔn)。

雖然CAN傳輸協(xié)議參考了OSI 七層模型,但是實(shí)際上CAN協(xié)議只定義了兩層“物理層”和“數(shù)據(jù)鏈路層”,因此出現(xiàn)了各種不同的“應(yīng)用層”協(xié)議,比如用在自動(dòng)化技術(shù)的現(xiàn)場總線標(biāo)準(zhǔn)DeviceNet,用于工業(yè)控制的CanOpen,用于乘用車的診斷協(xié)議OBD、UDS(統(tǒng)一診斷服務(wù),ISO14229),用于商用車的CAN總線協(xié)議SAEJ1939。

14.1.4 CAN網(wǎng)絡(luò)拓?fù)?/span>
CAN總線是一種分布式的控制總線。CAN總線作為一種控制器局域網(wǎng),和普通以太網(wǎng)一樣,它的網(wǎng)絡(luò)很多CAN節(jié)點(diǎn)構(gòu)成。其網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如下圖所示:

CAN網(wǎng)絡(luò)的每個(gè)節(jié)點(diǎn)非常簡單,均由一個(gè)MCU(微控制器)、一個(gè)CAN控制器和一個(gè)CAN收發(fā)器構(gòu)成,然后使用雙絞線連接到CAN網(wǎng)絡(luò)中。?
14.1.5 CAN物理特性
CAN總線遵循國際標(biāo)準(zhǔn)ISO11898,如ISO11898-1,ISO11898-2,ISO11898-3,ISO11898-4標(biāo)準(zhǔn)。

CAN 能夠使用多種物理介質(zhì),例如雙絞線、光纖等。最常用的就是雙絞線。信號使用差分電壓傳送,兩條信號線被稱為“CAN_H”和“CAN_L”。靜態(tài)時(shí)CAN_H和CAN_L均是 2.5V 左右,此時(shí)狀態(tài)表示為邏輯“1”,也可以叫做 “隱性”。用 CAN_H 比 CAN_L 高表示邏輯“0”,稱為“顯形”,此時(shí),通常電壓值為:CAN_H = 3.5V 和 CAN_L = 1.5V 。
目前實(shí)際常用的CAN收發(fā)器有如下幾種型號:

目前實(shí)際常用的CAN控制器有如下幾種型號:

14.1.6 CAN報(bào)文幀
14.1.6.1 CAN報(bào)文格式
標(biāo)準(zhǔn) CAN 的標(biāo)志符長度是 11 位,而擴(kuò)展格式 CAN 的標(biāo)志符長度可達(dá) 29 位。CAN 協(xié)議的 2.0A 版本 規(guī)定 CAN 控制器必須有一個(gè) 11 位的標(biāo)志符。同時(shí),在 2.0B 版本中規(guī)定,CAN 控制器的標(biāo)志符長度可以是 11 位或 29 位。遵循 CAN2.0B 協(xié)議的 CAN 控制器可以發(fā)送和接收 11 位標(biāo)識符的標(biāo)準(zhǔn)格式報(bào)文或 29 位標(biāo)識符的擴(kuò)展格式報(bào)文。標(biāo)準(zhǔn)幀&擴(kuò)展幀對比:

14.1.6.2 CAN報(bào)文幀類型
CAN報(bào)文類型又分如5種幀類型:數(shù)據(jù)幀:主要用于發(fā)送方向接收方傳輸數(shù)據(jù)的幀;遙控幀:主要用于接收方向具有相同ID的發(fā)送方請求數(shù)據(jù)的幀;錯(cuò)誤幀:主要用于當(dāng)檢測出錯(cuò)誤時(shí)向其他節(jié)點(diǎn)通知錯(cuò)誤的幀。過載幀:主要用于接收方通知其他尚未做好接收準(zhǔn)備的幀。間隔幀:主要用于將數(shù)據(jù)幀及遙控幀與前一幀分隔開來的幀。
其中數(shù)據(jù)幀是使用最多的幀類型,這里重點(diǎn)介紹以下數(shù)據(jù)幀。數(shù)據(jù)幀如下圖所示:

由上圖所示,數(shù)據(jù)幀包括:
(1)幀起始。表示數(shù)據(jù)幀開始的段。
(2)仲裁段。表示該幀優(yōu)先級的段。
(3)控制段。表示數(shù)據(jù)的字節(jié)數(shù)及保留位的段。
(4)數(shù)據(jù)段。數(shù)據(jù)的內(nèi)容,一幀可發(fā)送0~8個(gè)字節(jié)的數(shù)據(jù)。
(5)CRC段。檢查幀的傳輸錯(cuò)誤的段。
(6)ACK段。表示確認(rèn)正常接收的段。
(7)幀結(jié)束。表示數(shù)據(jù)幀結(jié)束的段。
具體介紹可以查看”CAN2.0A”、”CAN2.0B”詳細(xì)介紹。
我們主要關(guān)注我們編程所需要關(guān)注的幾個(gè)段:
ID: ?CAN報(bào)文ID;
IDE: 為0是標(biāo)準(zhǔn)幀,為1是擴(kuò)展幀;
RTR: 為0是數(shù)據(jù)幀,為1是遠(yuǎn)程幀;
DLC: CAN報(bào)文數(shù)據(jù)長度,范圍0~8字節(jié);
Data:數(shù)據(jù),0~8個(gè)字節(jié);
未完待續(xù)...關(guān)于CAN,還有很多內(nèi)容(70多頁),剩下內(nèi)容:
