侯慶果?成彥林


摘 要 以往的CAN總線設計往往采用單片機和外圍CAN控制器的方式設計,該設計集成度不高,軟件設計靈活度不高,本文介紹了內部集成了CAN控制器的單片機C8051F040的使用方法,設計了相應的外圍接口電路,分析了內部CAN控制器及通信接口的硬件及軟件設計,并給出了其軟件實現方法。
關鍵詞 C8051F040;CAN控制器;接口
引言
CAN總線最初應用在早期的汽車工業中,由德國Bosch公司最先提出。CAN總線是一種功能強大的控制器局域網總線,速率高達1Mbps,并且具有極強的抗干擾能力和軟件糾錯能力,軟硬件開發流程相對簡單,產品維護性好、可靠性高,此外,CAN總線傳輸數據實時性好,因此,在汽車工業、數控機床及軍工設備等領域得到廣泛應用。
1C8051F040內部CAN控制器
CAN 控制器包含一個CAN 控制器內核、消息RAM、消息處理狀態機和控制寄存器。因此, CAN控制器只能完成協議的解析,無法完成接口的物理驅動。圖1 所示為CAN 控制器的原理框圖。
CAN控制器內核由CAN協議控制器和用于消息傳輸的串行移位寄存器組成。消息RAM中的32個消息對象可以任意配置為數據傳輸對象。輸入數據、消息對象及其標識掩碼被協議控制器解析后存儲在CAN消息RAM中。在沒有CPU干預的情況下,CAN控制器即可完成所有數據傳輸過濾協議處理。 這樣可以最小化用于CAN通信的CPU帶寬[1]。
2CAN總線硬件接口設計
因為C8051F040中內部集成了CAN總線控制器,因此,硬件接口設計時只需外接總線接口驅動模塊以及相應的濾波電路就可建立CAN總線接口。本設計采用廣州金升陽公司生產的TD301DCANH3作為CAN總線接口驅動模塊,該驅動模塊是將隔離電源、芯片信號隔離及收發控制集成于一體的CAN總線收發模塊,可實現2500VDC的電氣隔離,并具有ESD保護功能。其硬件設計原理圖如圖2所示[2]。
3CAN總線接口軟件設計
CAN總線接口軟件主要完成各子模塊的設計,子模塊之間相互獨立,封裝性較好,可以方便地用于基于該單片機設計的相關項目的開發應用,對不同的工程或者要求可以很方便地進行新的功能開發。具體子模塊如下所示[3]。
3.1 系統初始化
系統初始化主要完成總線波特率設置并啟動CAN總線,軟件設計如下所示。
/************************************
* 函數名稱:StartCAN;
* 函數功能描述:CAN啟動函數;
***********************************/
void StartCAN (void)
{
SFRPAGE? = CAN0_PAGE;
CAN0CN? |= 0x41;
CAN0ADR? = BITREG;
CAN0DAT? = 0x5EC3;
CAN0ADR? = IF1CMDMSK;
CAN0DAT? = 0x0088;
CAN0ADR? = IF2CMDMSK;
CAN0DATL = 0x1F;
CAN0CN? ?|= 0x06;
CAN0CN? ?&= ~0x41;? //啟動CAN
}
3.2 發送和接收程序
發送接收程序通過設置或者讀取相關寄存器的值來完成數據的收發過程,具體發送及接收程序如下所示。
/************************************* 函數名稱:CANTransmitdata;
* 函數功能描述:CAN發送一幀數據函數;
************************************/
void CANTransmitdata(unsigned char MsgNumber,unsigned char *pdtr,unsigned char len)
{
unsigned char num;
SFRPAGE? = CAN0_PAGE;
CAN0ADR? = IF1CMDMSK;
CAN0DAT? = 0x0087;
CAN0ADR? = IF1DATA1;
for(num=0;num { CAN0DATH = *++pdtr; CAN0DATL = *--pdtr; pdtr=pdtr+2; } CAN0ADR? = IF1CMDRQST; CAN0DATL = MsgNumber; } /************************************* 函數名稱:CANReceivedata; * 函數功能描述:CAN接收一幀數據函數; ************************************/ void CANReceivedata (unsigned char MsgNumber,unsigned char *pdtr,unsigned char len) { unsigned char i; SFRPAGE? = CAN0_PAGE; CAN0ADR? = IF2CMDMSK; CAN0DATL = 0x0f; CAN0ADR? = IF2CMDRQST; CAN0DATL = MsgNumber; CAN0ADR? = IF2DATA1; for(i=0;i { *++pdtr = CAN0DATH; *--pdtr = CAN0DATL; pdtr=pdtr+2; } } 4結束語 本文論述了基于C8051F040 的CAN總線接口設計,介紹了CAN控制器內部原理、接口硬件及軟件設計方法,該設計硬件上簡單、可靠,軟件設計簡便、易懂,在速度控制伺服系統產品充分驗證了軟硬件運行的正確性及可靠性,達到了預期的效果。 參考文獻 [1] 童長飛.C8051F系列單片機開發與C語言編程[M].北京:北京航空航天大學出版社,2005:117. [2] 牛躍聽,周立功.CAN總線嵌入式開發[M].北京:北京航空航天大學出版社,2016:56. [3] 張培仁,孫力.C8051F系列單片機原理與應用[M].北京:清華大學出版社,2013:209. 作者簡介 侯慶果(1980-),男,江蘇南京人;現就職單位:南京長江電子信息產業集團有限公司,研究方向:電子設備整機技術管理。 成彥林(1980-),男,江蘇連云港人;現就職單位:南京長江電子信息產業集團有限公司,研究方向:電子設備整機系統聯調。