劉海龍,吳海波,張蕾
(湖南鐵道職業技術學院,湖南株洲 412001)
控制器局域網(Controller Area Network,CAN)總線是國際上應用最廣泛的現場總線之一,其屬于多主機半雙工異步串行通信總線,具有通信實時性好、傳輸速度快、抗干擾能力強和成本低等優點[1]。Wince 系統作為嵌入式系統中的重要組成部分,穩定性好,在工業應用領域占有重要地位,如車機系統、工業控制等領域應用廣泛[2]。CAN 總線通信可以集成于各類嵌入式軟硬件平臺,在多種嵌入式軟硬平臺上均有成熟研究和設計[3]。文獻[4]中介紹了基于VxWorks 系統平臺下CAN 驅動程序的設計方法[4];文獻[5]中給出了基于Linux 系統平臺下的獨立CAN控制器驅動設計和優化方案[5];文獻[6]中介紹了基于SPARC V8 硬件構架平臺下CAN 模塊的驅動設計方法[6]。上述關于CAN 的設計方案通道數大多是在2路以內,適合一些通信功能相對簡單,具有一定通用性的領域。文中CAN 通信應用于基于工業機器人的數控機床上下料過程中,需要滿足多六維力覺傳感器、雙目機器人視覺數據和機器人系統反饋信號等多路信號的實時通信要求,硬件平臺的I/O 也需要復用通道,因此現有的驅動設計方案無法滿足應用需求。
該文采用S3C6410 為硬件核心,Wince8 為軟件系統平臺研究開發CAN 總線驅動程序,S3C6410 是一款基于ARM1176JZF-S 核的終端設備通用處理器,16/32 位RISC,可穩定運行在667 MHz 主頻以上,性價比高,在工業終端領域有廣泛的應用[7-8]。CAN通信模塊采用Microchip 的MCP2515,該芯片有6 個驗收屏蔽寄存器和6 個驗收濾波寄存器,功能完全滿足現場應用需求[9]。以S3C6410 硬件平臺對Wince系統下的CAN 總線驅動的研究成果較少,在多板多通道CAN 通信過程中,存在中斷頻率高導致數據傳輸效率低下問題[10]。針對該問題,該文也在驅動設計中通信效率環節上進行了優化設計和驗證,提高整個系統通信的穩定性和高效性。
模塊采用的Microchip MCP2515,是一款獨立局域網絡協議控制器,支持CAN V2.0B 技術規范,能發送和接收標準、擴展數據幀及遠程幀[11-12]。收發器采用TAJ1051T,收發器的功能是提供控制器區域網絡CAN 協議控制S3C6410和物理雙線CAN MCP2515總線之間的接口,該收發器高速達1 Mbit/s,為控制器核心S3C6410 和CAN 協議控制器MCP2515 提供差分發射和接收功能[13]。其部分關鍵電路設計圖如圖1 所示,其中TXCAN 和RXCAN 連接S3C6410 收發I/O 引腳;連接CAN 通信的下位機分別為工業機器人上下料工作站傳感器信號采集終端、視覺信號采集終端,上位機為工業機器人信號控制器端,整個工作站通過CAN總線通信實現分布式結構。

圖1 硬件部分電路設計圖
基于Microchip MCP2515 驅動程序設計首先完成MCP2515 工作原理的流程結構設計,根據工作流程按功能分為地址映射、I/O 接口設計、系統接口處理、中斷處理功能和初始化函數等設計。
在基于Wince8 下的MCP2515 驅動程序設計中,由于系統內核程序不能直接讀取物理地址,需要將物理地址映射到虛擬空間,地址是由譯碼器確定的[14]。內核程序中設計了MmMapIoSpace()函數實現該功能,并配置了MCP2515 的兩種工作模式,分別為回環和標準模式,其中回環模式用于多終端的CAN 組網通信,標準模式用于標準的CAN 聯機通信[15]。其關鍵代碼如下:


隨后配置MODBUS 通信內容協議的位時間tbit參數,表示CAN 每幀數據組成段構成的時間分配參數,組合公式如下:

以上式中的各時間參數分別對應為同步段、傳播段、相位緩沖段PS1、相位緩沖段PS2,Microchip MCP2515 數據手冊中規定須滿足PS1>PS2 條件,因此該參數配置的關鍵代碼如下:

I/O 接口涉及的關鍵函數有CAN_Open、CAN_Close、CAN_Write、CAN_Read 和Init_MCP2515 共5 個,其中部分功能采用函數調用的方式實現,如CAN_IOControl 函數,用于上位機應用程序對I/O 端口的控制,使用中通過I/O 接口函數間接調用。
1)CAN_Open 函數設計
函數原型為DWORD CAN_Open(DWORD dwData,DWORD dwAccess,DWORD dwShareMode),主要是配置MCP2515 的工作模式,并提供上位機應用程序打開該驅動的接口;打開CAN_Open 函數時,需要對通信的波特率進行配置,調用波特率配置函數。


2)CAN_Close 函數設計
函數原型為BOOL CAN_Close(DWORD dwData),主要是配置MCP2515 驅動程序,關閉時為控制進行復位操作,調用了復位清零函數。上位機應用程序關閉該驅動的接口函數為CloseHandle(HANDLE),執行成功返回TURE,執行失敗則返回FALSE。
3)Init_MCP2515 函數設計
函數原型為void Init_MCP2515 (CanBandRate bandrate),主要用于配置MCP2515 的通道I/O 參數狀態初始化、波特率設定、濾波及工作模式參數等,該函數在執行CAN_Open 時需要被調用。其中涉及的所有S3C6410 連接I/O 端口均需要對其狀態進行初始化,否則可能會因為I/O 狀態不確定導致通信錯亂的現象,I/O 初始化部分代碼如下。

4)CAN_Write 函數設計
函數原型為DWORD CAN_Write(DWORD hOpen Context,LPCVOID pSourceBytes,DWORD NumberOf Bytes),主要用于向接收終端發送數據幀,數據緩存為pSourceBytes,數據位為NumberOfBytes,用于發送接收端數據校驗,提高通信的準確性。在應用程序中執行WriteFile()函數寫入設備數據,其寫入關鍵程序如下。

為降低中斷頻率,MCP2515 的發送中斷被禁用,發送前先查詢寄存器的緩沖器的狀態,緩沖器清零則立即發送幀數據,若緩沖器鎖定則輪詢方式循環查詢狀態,達到超時數值后返回并提示,函數的發送流程如圖2 所示。
5)CAN_Read 函數設計

圖2 CAN_Write函數發送流程
函數原型為DWORD CAN_Read(DWORD hO penContext,LPVOID pBuffer,DWORD count),主要用于讀取總線上的數據幀,pBuffer 為數據緩沖區,count 為數據位,用于校驗準確性。MCP2515 收到數據幀后觸發中斷,中斷處理發送消息列隊,該函數則讀取消息列隊,將數據讀取至緩沖區中。應用程序中執行ReadFile()函數讀取設備數據,由于系統采用分布式多設備的組網通信,在數據讀取時需要先讀取CAN 總線ID,每個ID 為唯一的,且對應具體的設備終端,其關鍵代碼如下。


其工作流程和CAN_Write 函數類似,其流程圖此處不再贅述。
對于嵌入式實時操作系統,為了滿足系統對硬件的實時性響應需求,需要通過高效的中斷服務程序來滿足要求[16]。MCP2515 的中斷類型有發送中斷、接收中斷、錯誤中斷等,采用低電平中斷[17-18]。中斷處理的設計思路為先判斷中斷狀態再執行相應的處理,對于發送與接收中斷,當發送或接收數據緩沖區釋放后自動執行中斷的清除。
S3C6410 的WINCE BSP 中已經對CPU 中斷端口進行了定義和事件綁定,在該文的應用中對CPU 中斷I/O 進行了效率優化,所有外部中斷均集成至一個CPU,避免了外部中斷過多導致的可維護性差、運行效率低的缺點。中斷的事件創建和等待事件部分關鍵程序如下:

該文在S3C6410 主板上對CAN 通信進行驅動調試與測試分析,主要測試CAN 總線的幀傳輸效率和驅動程序的穩定性。傳輸速率主要是測試數據幀的發送、接收速度以及中斷響應頻率。由于CAN 總線通信是采用多終端組網數據采集和控制,若各個通信終端中斷頻率高,會占用過多的系統硬件資源導致性能下降,甚至出現死機現象。通過中斷處理優化,在數據通信時,CAN 上位機中斷響應明顯下降,幾乎不存在丟幀問題,性能穩定。
驅動程序的組網穩定性測試則主要是測試多設備聯機情況下CAN 運行情況,該文測試采用了單臺S3C6410 主機連接6 臺STM32 數據采集終端,當任意斷開1~3 臺STM32 終端,造成CAN 通信模塊異常。測試優化前當1 號CAN 模塊異常時,第2 號CAN 模塊通道則變為8~15,造成通道沖突報錯。優化后當1號CAN 模塊異常時,第2 號CAN 模塊正常工作,不會受影響,異常模塊則被隔離。具體結果如表1 所示。

表1 優化前后測試數據
測試結果表明,驅動程序中的接口功能函數、中斷服務程序優化后,能夠有效提高CAN 多終端設備的穩定組網和高速通信,降低系統中斷頻率,提高了系統性能,保證了整個系統的穩定運行。
該文以S3C6410 為硬件平臺,在Wince8 嵌入式系統下,提出一種針對Microchip MCP2515 的CAN 驅動程序的設計與優化方案,該驅動程序集成于BSP中。該驅動程序支持多設備終端的組網和CAN 總線通信,實現了多種STM32 終端與S3C6410 上位機之間的數據通信,且下位機終端設備具有良好的擴展性,通信協議確定后終端設備具有通用性。實驗結果表明,該驅動程序能夠穩定運行,性能可靠。