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

圖1 –CAN 介紹
到上世紀90 年代中,隨著DeviceNet 和CANOpen 協議的引入,CAN 以及工業控制已在汽車之外的范圍得到廣泛應用。
受市場中這類需求的推動,很多MCU 供應商內部集成了CAN 控制器,用于推廣這類市場。雖然在高層面上CAN 的功能看上去類似于I2C 或SPI,允許兩個節點之間的通信,但在控制器層面上CAN 通信與他們存在本質不同,下面列出CAN 能提供的服務:
· CAN 通信基于消息,而不是基于地址。
· CAN 節點能夠在總線上發送或請求消息。
· 復雜的錯誤處理機制。
· 使用CRC-15(循環冗余校驗)保護,能夠探測一行中出現的5 個損壞位。
由于是基于消息而不是基于地址,CAN 總線上的節點可擁有多條傳輸的消息,也就是說,制動器模塊可能具有包含車輛速度信息的消息,包含傳感器信息的消息(如輪速傳感器),以及包含診斷信息的消息,后者具有最高的傳輸優先級。
首先考察節點中的消息優先級和消息ID 解碼,人們或許認為CAN 會使CPU 產生高的負荷,從而阻止更多復雜功能的集成。這類問題是可以通過不同類型的CAN 控制器解釋,如圖2 所示。

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

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

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