由于CAN總線的高性能和可靠性,所以被廣泛地應用于工業(yè)自動化、船舶、醫(yī)療設備、工業(yè)設備等方面。而目前多數(shù)嵌入式處理器都不帶CAN總線控制器,本文基于深圳恒天智信科技公司的GT2440開發(fā)板和MSG-3CM型CAN總線模塊開發(fā)板,在linux操作系統(tǒng)環(huán)境下,詳細介紹了開發(fā)CAN總線設備驅(qū)動程序的方法與過程。
GT2440是一款具有極高性價比的嵌入式開發(fā)系統(tǒng),CPU處理器采用Samsung S3C2440A,主頻400MHz;板載64M SDRAM、256M Nand Flash、2 M Nor Flash;板載5線異步串行口(UART0)、10M以太網(wǎng)RJ-45接口、USB HOST接口、USB Slave B型接口和一個SD卡存儲接口;集成了4線電阻式觸摸屏接口和JTAG接口等。
S3C2440A是由三星公司推出的16/32位RISC微處理器,最高主頻可達533MHz,處理器內(nèi)部集成SDRAM控制器、LCD控制器、4通道DMA、3通道UART、I2C總線接口、I2S音頻編解碼器接口、SD接口、2路SPI接口、8通道10位A/D控制器和camera接口等。
CAN通信電路主要由CAN控制器和CAN收發(fā)器組成,本文采用的是MSG-3CM型CAN總線模塊開發(fā)板,其原理圖如圖1所示。圖中13~16引腳連著CPU,其余的除了INT和中斷相關之外,都連著TJA1050收發(fā)器。
MSG-3CM型CAN總線模塊開發(fā)板的控制芯片是MICROCHIP公司的MCP2515[1],MCP2515是Microchip Technology Inc.(美國微芯科技有限公司)生產(chǎn)的一款控制局域網(wǎng)絡(CAN)協(xié)議的控制器,完全支持CAN總線V2.0A/B技術規(guī)范;能夠發(fā)送和接收標準和擴展報文。它還同時具備驗收過濾以及報文管理功能;該器件包含三個發(fā)送緩沖器和兩個接收緩沖器。其與GT2440開發(fā)板的通訊是通過行業(yè)標準串行外設接口(SPI)來實現(xiàn)的,其數(shù)據(jù)傳輸速率高達5Mb/s。
TJA1050作為CAN總線收發(fā)器芯片,提供了CAN控制器與物理總線之間的接口,有對CAN總線的差動發(fā)送和接受功能[2]。當CAN控制器要從TJA1050接受一個數(shù)據(jù)時,首先RXnBF信號必須有效(為低電平),然后TJA1050收發(fā)器將數(shù)據(jù)通過RXCAN引腳傳入到對應的第n+1個緩沖區(qū);同理,當CAN控制器要發(fā)送數(shù)據(jù)給TJA1050時,TXnRTS信號必須有效(為低電平),然后控制器將第n+1個緩沖區(qū)的數(shù)據(jù)通過TXCAN引腳傳入到收發(fā)器TJA1050。
搭建開發(fā)環(huán)境的過程為:
(1)在Win7系統(tǒng)下安裝虛擬機vmware6.0,在虛擬機里安裝RHEL5操作系統(tǒng)。在RHEL5操作系統(tǒng)下用交叉編譯工具編譯開發(fā)板所需的鏡像和文件,使用Samba服務器實現(xiàn)了Win7和RHEL5的文件共享,在Win7系統(tǒng)下可以通過串口或USB直接下載鏡像和文件到GT2440開發(fā)板上。
(2)由于win7系統(tǒng)不帶超級終端,所以串口終端使用的是SecureCRT5.5軟件,SecureCRT是一款支持SSH(SSH1和SSH2)的終端仿真程序,同時支持Telnet和rlogin協(xié)議,SecureCRT是一款用于連接運行包括Windows、UNIX和VMS的遠程系統(tǒng)的理想工具。筆記本電腦和開發(fā)板之間使用USB轉(zhuǎn)串口線連接,這樣就可以在筆記本電腦上對開發(fā)板進行開發(fā)操作。
本設計使用的bootloader是深圳恒天智信科技公司自己開發(fā)的u-boot,用J-LINK V8仿真器連接好開發(fā)板和筆記本電腦,打開j-flash進行相關的配置,然后將u-boot燒寫進NOR Flash,然后重啟就可以在secureCRT串口終端打印出u-boot相關信息,根據(jù)提示就可以進行下載操作了。從官方網(wǎng)站上下載Linux2.6.38內(nèi)核源代碼,通過Samba服務器將源代碼復制到RHEL5操作系統(tǒng)共享目錄下,使用tar命令解壓到/opt目錄。在/opt/linux-2.6.38.6/目錄下使用交叉編譯工具對內(nèi)核進行修改、配置和編譯。在移植CAN總線驅(qū)動之前,需要移植板載256M NAND Flash的驅(qū)動、yaffs2文件系統(tǒng)等。
Linux系統(tǒng)設備[3]分為三種基本類型:字符設備、塊設備、網(wǎng)絡設備。CAN總線屬于字符設備,是個能夠像字節(jié)流(類似文件)一樣被訪問的設備。在Linux系統(tǒng)中,以文件名的形式在/dev目錄下建立CAN總線設備文件,應用程序可以通過系統(tǒng)調(diào)用函數(shù)open()打開此文件,建立起與設備的連接,然后通過函數(shù)read()、write()、release()、ioctl()等函數(shù)調(diào)用對目標設備進行操作。內(nèi)核是通過主設備號將設備驅(qū)動程序和設備文件相連的,而構成驅(qū)動程序的一個重要數(shù)據(jù)結構就是file_operations,內(nèi)核就是通過這個結構來訪問驅(qū)動程序的。file_operations中的成員為一系列指向各操作函數(shù)的指針,這些操作函數(shù)主要負責系統(tǒng)調(diào)用的實現(xiàn),不同類型的設備文件系統(tǒng)有不同類型file_operations結構。
CAN總線的file_operations結構[4]定義為:
圖1 MSG-3CM型CAN總線模塊開發(fā)板原理圖
根據(jù)CAN通信協(xié)議和系統(tǒng)應用的需要,在驅(qū)動程序中定義了CanData的數(shù)據(jù)結構以傳輸數(shù)據(jù),結構如下:
根據(jù)需要定義一個Mcp2515_DEV的數(shù)據(jù)結構,用于記錄接收緩沖區(qū)運行的各種狀態(tài):
定義并初始化完成file_operations結構后,必須定義一個初始化函數(shù),在這里定義了一個名為GT2440_MCP2515_init()的函數(shù),主要完成的工作有:
(1)軟件復位,進入配置模式,設置CAN總線波特率,清空接收和發(fā)送緩沖區(qū),切換MCP2515到正常狀態(tài),聲明CAN的數(shù)據(jù)格式等。
(2)注冊設備。注冊設備所使用的函數(shù)原型是:int register_chrdev(unsigned int major,const char*name,struct file_operations *fops)其中major是主設備號,name是設備名稱,fops就是內(nèi)核訪問設備的接口。
(3)注冊設備使用的中斷。因為中斷信號往往是通過特定的中斷信號線傳輸?shù)?,任何一款芯片留給中斷信號的接口都是有限的,所以內(nèi)核會維護一個中斷信號線注冊表,模塊要使用中斷就得向它申請一個中斷通道,當它使用完該通道之后要釋放該通道。這里使用的就是函數(shù)request_irq(MCP2515_IRQ,s3c2440_isr_mcp2515,SA_INTERRUPT,DEVICE_NAME,s3c2440_isr_mcp2515)。
對驅(qū)動程序的編譯添加一般有兩種方式:靜態(tài)編譯進內(nèi)核和模塊方式。為了便于調(diào)試,本文選擇模塊方式,首先將驅(qū)動程序復制到/linux-2.6.38.6/drivers/char中,然后經(jīng)過相關配置后,使用insmod工具將編譯好的模塊加載到內(nèi)核中,然后編寫CAN總線測試程序,經(jīng)過交叉編譯后將測試程序下載到GT2440開發(fā)板中,最后在SecureCRT終端運行測試程序,驗證了方案的可行性。
本文介紹了在GT2440和linux平臺下擴展CAN總線控制器的具體方法,同時詳細給出了開發(fā)CAN總線驅(qū)動程序的過程。隨著嵌入式系統(tǒng)的發(fā)展,CAN通信設備與嵌入式系統(tǒng)的實際應用結合會越來越廣泛。
[1]Microchip.帶有SPI接口的獨立CAN控制器[M].Microchip,2005.
[2]饒運濤.現(xiàn)場總線CAN原理與應用技術[M].北京:北京航空航天大學出版社,2007.
[3]宋寶華.linux設備驅(qū)動開發(fā)詳解[M].北京:人民郵電出版社,2008.
[4]佟鳴宇,彭開香.基于ARM芯片的CAN總線接口設計與實現(xiàn)[J].計算機工程與設計,2009,30(7):1574-1576.