蔡花,朱宏翔
(西安蘭德新能源汽車技術開發有限公司,陜西 西安 710043)
基于MC9S12X的CAN 通訊的底層代碼設計
蔡花,朱宏翔
(西安蘭德新能源汽車技術開發有限公司,陜西 西安 710043)
CAN 總線因其高實時性能、高可靠性、穩定的傳輸性能、高抗電磁干擾性,使得它在汽車業中應用非常普遍。MC9S12X是一款高性能的16位處理器,可作為整車控制器的MCU,帶有5個CAN通訊模塊,可實現多路CAN 通訊。論文給出了CAN底層代碼的設計方法,并驗證了代碼,實現了MC9S12X與CAN助手之間的通訊,具有一定的實用價值。
MC9S12X;CAN通訊
CLC NO.: U462.1 Document Code: A Article ID: 1671-7988(2015)01-04-03
MC9S12X單片機具有豐富的I/O模塊和工業控制專用的通信模塊,采用5V供電,總線速度可達40MHz,非常適合應用在汽車業中。在汽車級的控制器中,CAN總線是汽車各個控制單元之間聯系的紐帶,是實現數據交互的媒介,它的可靠運行是汽車正常行駛的前提。在選擇控制芯片時,芯片具有的CAN 模塊個數是一個重要的考慮因素,MC9S12X芯片帶有5個CAN模塊,滿足多路CAN通訊的需求。
CAN通訊的實現是建立在軟硬件基礎上,硬件電路實現電氣連接,軟件部分驅動硬件工作,二者缺一不可。本文論述CAN通訊的軟件實現,建立在具有CAN功能的MC9S12X芯片 和CAN收發器這兩個硬件基礎,實現MC9S12X 與CAN總線的通信,完成數據交互。
軟件設計主要是數據結構的設計和函數接口設計這兩個方面。
CAN 通訊的實現需要三個函數完成:初始化函數、發送函數和接收函數。
程序代碼用C 語言編寫,使用的CAN控制器支持CAN2.0B通訊協議,可以實現標準幀和擴展幀兩種類型的數據傳輸。
1.1 數據結構設計
(1)初始化數據結構設計:CAN 口初始化數據結構設計
其中BaudRateKb指CAN的工作頻率,以Kb/S為單位,CanNum指CAN口編號。
(2)CAN報文數據結構設計:發送/收報文數據類型的設計
1.2 初始化函數設計
初始化函數接口:
該函數包含一個參數 *Config 結構體指針。結構體包含兩個成員:BaudRateKb和CanNum。
初始化函數用來完成CAN模塊的選擇(即指定由哪一個CAN模塊實現報文的發送或者接收),設置CAN通訊的波特率,以及設置模塊的時鐘源。MC9S12X的CAN有兩種時鐘源可選擇,一個是板級晶振時鐘,另一個是總線時鐘,由于CAN通訊對總線傳輸速率的穩定性要求較高,所以在實際應用中,選擇晶振時鐘作為時鐘源。
初始化函數流程如下圖:
1.3 發送函數設計
發送函數接口:
該函數包含2個參數,其中一個是CAN模塊的編號,另一個是指向CAN報文的數據類型的一個指針。
參數num是用來發送CAN報文的CAN模塊號。*msg指針指向CAN報文數據結構,該結構包含5個成員。成員如下所述:
Extended參數是用來區分ID 類型,該參數取零值,表示ID是11位的;該參數取1,表示的是擴展ID(29位)。
Length參數用來設置發送數據的字節數,取值范圍0~8。
Remote參數用設置報文是遠程幀還是數據幀。
ID參數用來設置ID標識符。
Data[8]是存放數據的數組。
該函數的返回值是一個Can_ReturnType類型的值(0或1),表示總線正?;蛘卟徽?。
CAN發送函數的功能是實現報文發送,包括設置報文的類型(即數據幀或者遠程請求幀等),ID 類型(標準幀或者擴展幀),發送數據的長度(以字節為單位),以及發送的數據。
發送函數流程圖如下:
1.4 接收函數設計
接收函數接口:
該函數包含2個參數,其中一個是CAN模塊的編號,另一個是CAN報文數據類型的一個指針。
該函數的返回值是一個Can_ReturnType類型的值(0或1),表示接收是否完成。
CAN 接收函數的功能是接收其他控制設備發送到CAN總線上的數據。
接收函數流程圖如下:
主要針對接收功能,發送數據時,兩者的差異不明顯。接收數據時,兩者的差異較大。
差異一:
(1)初始化函數設計中,查詢方式接收不要求使能接收中斷使能位,接收完成標志位是在接收函數中清除的。
(2)中斷接收時,初始化函數中必須使能中斷使能位,接收完成標志位在中斷函數中清除。
差異二:
查詢方式接收時,整個過程中CPU一直查詢CANRFLG_進制RFG狀態,只有當它為1時,才接收數據,否則不接收。在這個過程中CPU不能做其他的事情,一直處于檢測CANRFLG_RFG的狀態,這樣會造成代碼運行效率低和CPU的浪費。
中斷方式接收時,一旦中斷標志位置1,CPU就轉到中斷函數去處理數據,當數據處理完成,CPU會轉向原來的任務繼續執行,這種方式不會造成CPU的浪費,提高了CPU的使用率。
在CodeWarriorv5.1中編譯和運行代碼,通過CAN助手發送8字節數據(0x01,0x02,0x03, 0x55,0x05,0x06,0x07,0x08)到CAN總線,MC9S12X對數據處理 (擴大兩倍) 之后再發送給CAN助手。試驗結果如下圖:
上圖所用的接收方式是中斷方式。
代碼設計和測試結果相一致,并且在MC9S12X上運行穩定,實現了CAN通訊功能。函數接口設計采用結構體指針方式,保證了函數接口的一致性,可移植性強。即使后期需要添加或者刪除結構體成員時,也不會影響其他函數對此函數的調用,保證了接口的統一性。
[1] 孫同景,陳桂友.Freescale 9S12十六位單片機原理及嵌入式開發技術[M].北京:機械工業出版社,2008.5:(8-15),61.
Design of CAN communication underlying code based on MC9S12X
Cai Hua, Zhu Hongxiang
(Xi'an Lande New Energy Vehicle Technology Development CO., Ltd., Shaanxi Xi'an 710043)
CAN bus is very widely apply in automobile industry, which is because of its high real-time performance, high reliability, stable performance, high resistance to electromagnetic interference.MC9S12X is a 16-bit high performance processor of Freescale, can be used as a vehicle controller MCU, with five CAN communication modules, can realize multi CAN communication. This paper presents the design method of the underlying code, and verifies the code, realize the communication between the MC9S12X and CAN assistant, which has a certain practical value.
MC9S12X;CAN communication
U462.1
A
1671-7988(2015)01-04-03
蔡花,就職于西安蘭德新能源汽車技術開發有限公司。