摘要:自從上世紀(jì)80年代引入CAN以來(lái),在其規(guī)范和需求方面出現(xiàn)了巨大演變。由于其擴(kuò)展能力,使得其在眾多應(yīng)用中得以廣泛使用,從汽車(chē)到工業(yè)機(jī)器和工業(yè)自動(dòng)化。隨著其廣泛使用,實(shí)施復(fù)雜性也在兩個(gè)層面上相應(yīng)增加:
* CAN控制器設(shè)計(jì)從基本控制器轉(zhuǎn)向全CAN控制器,在某些情況下,甚至為擴(kuò)展的全CAN控制器。
* CAN軟件堆棧從汽車(chē)通信堆棧變?yōu)镃ANOpen,以及DeviceNet。
假定CAN僅是汽車(chē)系統(tǒng)中的單個(gè)組件,開(kāi)發(fā)人員僅需面對(duì)盡可能少的挑戰(zhàn)就能實(shí)現(xiàn)它,那么就能夠?qū)⒐ぷ髦攸c(diǎn)放在系統(tǒng)級(jí)功能上面,而不是糾纏于外圍配置。在本文中,將研究CAN接口,討論不同的實(shí)施、配置方式,以及調(diào)試接口以簡(jiǎn)化設(shè)計(jì)。
控制器區(qū)域網(wǎng)絡(luò)(CAN)最早是由Robert Bosch引入的,用于處理不斷增加的車(chē)輛功能和網(wǎng)絡(luò)復(fù)雜性。在嵌入式系統(tǒng)開(kāi)發(fā)的早期階段,模塊中包含單個(gè)MCU,可執(zhí)行單個(gè)或多個(gè)簡(jiǎn)單功能,如通過(guò)ADC讀取傳感器電平信號(hào)并控制直流電機(jī)等。隨著這些功能日益復(fù)雜,設(shè)計(jì)人員采用分布式模塊架構(gòu),在同一PCB(印刷電路板)的2個(gè)或多個(gè)MCU中實(shí)現(xiàn)其功能,并使用I2C或SPI協(xié)議執(zhí)行這些功能之間的通訊。對(duì)于前面的相同示例,綜合模塊則具有用于執(zhí)行所有系統(tǒng)功能、診斷和故障保證的主MCU,同時(shí)另一MCU負(fù)責(zé)BLDC電機(jī)控制功能。以較低的成本采用廣泛使用的通用MCU即可實(shí)現(xiàn)該目的。
在當(dāng)前的車(chē)輛中,功能分布于車(chē)輛中而不僅僅是模塊內(nèi),模塊間的通信協(xié)議需要高的故障容差,,因而在汽車(chē)市場(chǎng)中設(shè)計(jì)并引入了CAN。

圖1 –CAN 介紹
到上世紀(jì)90 年代中,隨著DeviceNet 和CANOpen 協(xié)議的引入,CAN 以及工業(yè)控制已在汽車(chē)之外的范圍得到廣泛應(yīng)用。
受市場(chǎng)中這類(lèi)需求的推動(dòng),很多MCU 供應(yīng)商內(nèi)部集成了CAN 控制器,用于推廣這類(lèi)市場(chǎng)。雖然在高層面上CAN 的功能看上去類(lèi)似于I2C 或SPI,允許兩個(gè)節(jié)點(diǎn)之間的通信,但在控制器層面上CAN 通信與他們存在本質(zhì)不同,下面列出CAN 能提供的服務(wù):
· CAN 通信基于消息,而不是基于地址。
· CAN 節(jié)點(diǎn)能夠在總線上發(fā)送或請(qǐng)求消息。
· 復(fù)雜的錯(cuò)誤處理機(jī)制。
· 使用CRC-15(循環(huán)冗余校驗(yàn))保護(hù),能夠探測(cè)一行中出現(xiàn)的5 個(gè)損壞位。
由于是基于消息而不是基于地址,CAN 總線上的節(jié)點(diǎn)可擁有多條傳輸?shù)南ⅲ簿褪钦f(shuō),制動(dòng)器模塊可能具有包含車(chē)輛速度信息的消息,包含傳感器信息的消息(如輪速傳感器),以及包含診斷信息的消息,后者具有最高的傳輸優(yōu)先級(jí)。
首先考察節(jié)點(diǎn)中的消息優(yōu)先級(jí)和消息ID 解碼,人們或許認(rèn)為CAN 會(huì)使CPU 產(chǎn)生高的負(fù)荷,從而阻止更多復(fù)雜功能的集成。這類(lèi)問(wèn)題是可以通過(guò)不同類(lèi)型的CAN 控制器解釋?zhuān)鐖D2 所示。

圖2 - 基本CAN 控制器和全CAN 控制器
· 基本CAN 控制器:在CAN 控制器硬件中實(shí)現(xiàn)了十分基本的過(guò)濾功能,減少了消息處理,具有較高的CPU 負(fù)荷。在基本CAN 控制器中,CPU 會(huì)從CAN 控制器收到多條中斷信號(hào),以便接收、確認(rèn)和分析消息,也會(huì)從應(yīng)用程序一側(cè)收到多條中斷信號(hào),以便確定是否要根據(jù)所收到消息的ID 傳輸應(yīng)答。基本CAN 控制器僅應(yīng)在低波特率、低消息通信數(shù)量的情形下使用,從而使得CPU 能夠處理額外的非通信任務(wù)。
· 全 CAN 控制器:提供了擴(kuò)展的消息過(guò)濾功能,以及硬件消息分析功能,解放了CPU,使其無(wú)需再對(duì)每一接收到的消息做出回應(yīng)。可對(duì)全CAN 控制器進(jìn)行配置,僅當(dāng)消息ID 已在控制器中設(shè)為接受時(shí),才會(huì)中斷CPU。全CAN 控制器還設(shè)置了多個(gè)消息對(duì)象,相當(dāng)于郵箱,郵箱能夠儲(chǔ)存特定的消息信息,如收到的ID 和數(shù)據(jù)字節(jié),以供CPU 檢索。在該情形下,CPU 可在任何時(shí)間檢索消息,但必須在更新所收到的相同消息并改寫(xiě)郵箱當(dāng)前內(nèi)容之前完成任務(wù)。這類(lèi)情形在最終類(lèi)型的CAN 控制器中得到了解決。
· 擴(kuò)展的全CAN 控制器:通過(guò)提供用于接收消息的硬件FIFO,提供了額外層面的硬件實(shí)施功能。通過(guò)這類(lèi)實(shí)施方案,在中斷CPU 中斷之前,可保存相同消息一個(gè)以上的情況,因而防止了高頻率消息的丟失,通過(guò)該功能,CPU 甚至能夠在較長(zhǎng)的時(shí)間段內(nèi)專(zhuān)注于主要的模塊功能。
請(qǐng)注意,DeviceNet 將過(guò)濾判據(jù)擴(kuò)展到了ID 字段之外,擴(kuò)展到數(shù)據(jù)的前兩個(gè)字節(jié),在實(shí)施該協(xié)議時(shí),必須使用全CAN 控制器或擴(kuò)展的全CAN 控制器。
根據(jù)具體的消息結(jié)構(gòu),上述兩種配置可共存于單個(gè)模塊中,以便實(shí)現(xiàn)高的消息優(yōu)先級(jí),并改善CPU 對(duì)所收到消息的處理。例如,對(duì)于接收一條消息(如ID = 0x250)中實(shí)效保護(hù)信息以及另一消息(如ID = 0x3FF)中溫度傳感器信息的模塊,可將第一個(gè)CAN 控制器配置為全CAN 控制器,并將第2 個(gè)配置為具有4 緩沖FIFO 的擴(kuò)展全CAN 控制器:收到每條失效保護(hù)消息時(shí),以及溫度傳感器消息時(shí),CPU 被中斷。在圖3 中,給出了這類(lèi)CAN 控制器的配置圖,它具有一個(gè)可定制的虛擬CAN 控制器,能夠快速實(shí)現(xiàn)復(fù)雜的消息處理,這三種類(lèi)型的CAN 控制器可共存于其中:
· 消息5 基本CAN 郵箱。
· 消息0x250 全CAN 郵箱。
· 消息0x3FF 擴(kuò)展的全CAN 郵箱。

圖3 – PSoC Creator – CAN 控制器配置
除了其功能方面的優(yōu)勢(shì)外,CAN 還因其高的容錯(cuò)性而得到廣泛應(yīng)用。其比特率高達(dá)1Mbps、總線長(zhǎng)度可達(dá)1000 米(在50Kbps 下),因而必須遵照CAN 比特時(shí)序,以便在電子噪音環(huán)境下工作,同時(shí)保持高水平的故障檢測(cè)和校錯(cuò)特性。
為了確保高水平的容錯(cuò)性能,與CAN 一起引入了亞比特時(shí)序結(jié)構(gòu),能夠?qū)崿F(xiàn)更嚴(yán)格的控制,確保每一CAN 總線的正確總線狀態(tài)。
一個(gè)單獨(dú)的CAN 位由4 個(gè)段表示:
· Sync_Seg:用于同步總線上的各種節(jié)點(diǎn)。
· Prop_Seg:對(duì)物理延遲進(jìn)行補(bǔ)償(物理總線和內(nèi)部CAN 節(jié)點(diǎn)上的傳播延遲)。
· Phase_Seg1,Phase_Seg2:用于補(bǔ)償相位邊緣誤差。在在同步過(guò)程中,會(huì)縮短或加長(zhǎng)這些段。
僅具有3 個(gè)段的CAN 控制器也很常見(jiàn),其中,Prop_Seg 添加到了Phase_Seg1 上。
在圖4 中,顯示了位時(shí)序表征,以及實(shí)現(xiàn)它所需要的所有參數(shù):

圖4 - 位時(shí)序表征
請(qǐng)注意,所有的CAN 位時(shí)序計(jì)算均基于時(shí)間量(TQ),它定義為固定的時(shí)間單位,由振蕩器導(dǎo)出,取值介于8 和25 之間。按照時(shí)間方面的觀點(diǎn),1 個(gè)TQ 等效于1Mbps 總線速度下1 微秒位長(zhǎng)度的1/25th 位或40 納秒。