1. 控制器局域網協議 (CAN)
can是指控制器局域網(controller area network)協議。它最初由德國電氣公司博世在1986年開發,主要應用于汽車通信系統。如今,can通信協議已成為iso國際標準化的串行通信協議之一。根據不同的網絡和距離需求,can協議可以配置不同的速度,最高可達1mbit/s。整個can協議被劃分為三個層次,對應于iso模型的不同部分,具體如圖1.1所示:
-
這一層是CAN協議的最高層,負責定義通信的對象及其屬性。它決定了數據在網絡中的結構和組織方式。
-
CAN傳輸層 (The Transfer Layer)
傳輸層位于協議的中間層,承擔著數據傳輸的責任。它負責確保數據的可靠傳輸,并處理錯誤檢測和糾正,以保證通信的穩定性和準確性。
-
CAN物理層 (The Physical Layer)
物理層是CAN協議的最底層,它定義了數據在網絡中的傳輸方式和電氣特性。這一層面向硬件,負責實際的信號傳輸和接收。
圖1.1
對象層和傳輸層包括所有由ISO/OSI模型定義的數據鏈路層的服務和功能。
1.1 對象層的作用范圍包括:
(1)查找被發送的報文。
(2)確定由實際要使用的傳輸層接收哪一個報文。
(3)為應用層相關硬件提供接口。
1.2 傳輸層的作用主要:
(1)傳送規則,也就是控制幀結構、執行仲裁、錯誤檢測、出錯標定、故障界定。
(2)總線上什么時候開始發送新報文及什么時候開始接收報文均在傳輸層里確定。
(3)位定時的一些普通功能也可以看作是傳輸層的一部分。
(4)傳輸層的修改是受到限制的。
1.3 物理層的作用:
在不同節點之間根據所有的電氣屬性進行位信息的實際傳輸。當然,同一網絡內,物理層對于所有的節點必須是相同的。盡管如此,在選擇物理層方面還是很自由的。
2. Linux下Socket CAN驅動模型
Linux下Socket CAN驅動屬于網絡設備的一部分。Linux下Socket CAN分層模型見圖2.1:
圖2.1
Linux下Socket CAN的驅動模型見圖2.2:
圖2.2
3. Socket CAN驅動框架的重要數據結構
3.1 Struct net_device_ops結構體
struct net_device_ops定義了網絡設備的操作方法,.ndo_open開啟網絡設備的操作,.ndo_stop停止網絡設備,.ndo_start_xmit發送網絡數據,.ndo_change_mtu網絡設備一次最大傳輸單元。
3.2 struct can_frame 結構體
其中can_id表示can frame的id,can_dlc表示can frame數據的長度,data[CAN_MAX_DLEN]表示攜帶的數據。
3.3 struct platform_driver 結構體
其中probe是驅動初始化函數入口,初始化本地結構體,remove是驅動卸載函數入口。
4. Linux下NAPI機制
CAN協議所對應的ISO模型見圖1.1:linux下網絡數據接收機制NAPI:混合使用中斷與輪詢,而不使用純粹的中斷事件驅動模型。這樣就提高了系統的性能,當設備產生一個數據接收中斷后,新機制的軟中斷處理函數就會輪詢設備的入口隊列,直到入口隊列中沒有數據了,再開啟中斷。NAPI數據接收的流程為:
a、接收中斷來臨
b、關閉接收中斷
c、以輪詢方式接收所有數據包直到收空
d、開啟接收中斷
NAPI驅動程序各部分的調用關系見圖4.1:
圖4.1
5. 數據發送接收流程
Linux下Socket CAN在用戶空間提供socket接口,在內核空間實現CAN Frame協議,并協同CAN控制器驅動控制CAN控制器的驅動,實現CAN通信。
5.1 發送流程
圖5.1
5.2 接收流程