1 引言
隨著汽車電子技術(shù)的不斷發(fā)展,車上的電子裝置越來越多,并與傳感器和執(zhí)行器一起共同組成了許多復(fù)雜的電子控制系統(tǒng)。結(jié)果連接這些電子裝置的電子線路迅速膨脹,布線變得越來越困難,導(dǎo)致了車身重量明顯增加,車輛運行的可靠性降低。傳統(tǒng)點對點的連接方式已經(jīng)無法滿足現(xiàn)代汽車電子技術(shù)發(fā)展的要求,多路傳輸?shù)能囕d網(wǎng)絡(luò)技術(shù)成為解決這些問題的必然選擇。德國BOSCH 公司[1]推出的控制局域網(wǎng)CAN(Controller Area Network)依靠其穩(wěn)定的性能、低廉的價格和很高的可靠性和實時性,現(xiàn)在已經(jīng)被廣泛地應(yīng)用于汽車內(nèi)部網(wǎng)絡(luò)。CAN總線的采用使汽車內(nèi)部的信息數(shù)據(jù)共享成為現(xiàn)實。然而,現(xiàn)在信息數(shù)據(jù)的共享不僅僅局限于汽車內(nèi)部,許多數(shù)據(jù)信息需要與外界進(jìn)行交換。這些信息主要用于汽車導(dǎo)航、汽車GPS 定位、汽車防盜、汽車遠(yuǎn)程監(jiān)控、汽車遠(yuǎn)程調(diào)度和收費等方面。由于汽車可移動性的特點,很多與外界交互的信息需要通過無線傳輸,所以我們選擇具有覆蓋面廣、接入速度快、按流量計費等優(yōu)點的通用分組無線業(yè)務(wù)GPRS(General Packet Radio Service)來承載無線數(shù)據(jù)通信。GPRS 是在GSM 基礎(chǔ)上發(fā)展起來的一種無線分組交換技術(shù)[2],被稱為2.5G,最高帶寬可達(dá)171.2Kb/s,可較好的滿足無線通信的要求。
2 總體網(wǎng)絡(luò)拓?fù)?br>總體網(wǎng)絡(luò)拓?fù)淙鐖D 1 所示,汽車內(nèi)部的電子控制單元都掛接到CAN 網(wǎng)上,汽車的內(nèi)部數(shù)據(jù)信息通過CAN 總線進(jìn)行傳遞,而需要與外界交互的數(shù)據(jù)則通過CAN/GPRS 無線車載網(wǎng)關(guān)進(jìn)行收發(fā)。
數(shù)據(jù)經(jīng)過基站收發(fā)信機(jī) BTS(Base Transceiver Station)、基站控制器BSC(Base Station Controller)和GPRS 服務(wù)支持節(jié)點SGSN(Serving GPRS Support Node)進(jìn)入GPRS 骨干網(wǎng);然后再通過GPRS 網(wǎng)關(guān)支持節(jié)點GGSN(Gateway GPRS Support Node),進(jìn)入Internet 互聯(lián)網(wǎng);并可以通過TCP 或UDP 協(xié)議把數(shù)據(jù)傳送到Internet 遠(yuǎn)程服務(wù)器。
3 CAN/GPRS 無線車載網(wǎng)關(guān)硬件實現(xiàn)
因為整個汽車內(nèi)部CAN網(wǎng)與外界交互的數(shù)據(jù)都需要通過CAN/GPRS無線車載網(wǎng)關(guān)進(jìn)行收發(fā),所以網(wǎng)關(guān)需要配備一個性能較高的微處理器。我們選擇具有較高性價比的一款三星公司的32 位ARM9 微處理器S3C2410X 來作為網(wǎng)關(guān)的主控制器。S3C2410X 包含ARM920T核,最高處理速度為203MHz[6],豐富的外圍設(shè)備包括3 通道的UART、4 通道的DMA、2個SPI 接口、117 個通用I/O 口和24 個外部中斷源等。采用一片三星的K9F1208 NAND Flash芯片(64M *8Bit)來儲存網(wǎng)關(guān)軟件系統(tǒng)的Bootloader,Linux 內(nèi)核,根文件系統(tǒng)和網(wǎng)關(guān)程序。由兩片HYNIX 的HY57V561620 DRAM 芯片(4Banks*4M*16Bit)構(gòu)成64M 的SDRAM,用于加載Linux 操作系統(tǒng)和運行程序。采用12MHz 的有源晶振。設(shè)計了一個20 針JTAG 接口,用來燒寫B(tài)ootloader。使用1 片MAX3232 構(gòu)成UART 調(diào)試接口。因為整個系統(tǒng)的輸入電壓為5V,所以需使用AMS1117-3.3 和AMS1117-1.8 分別得到穩(wěn)定的3.3V 和1.8V 電壓。
CAN 控制器選擇Microchip 的MCP2510,CAN 收發(fā)器選擇Philips 的TJA1050 以組成網(wǎng)關(guān)的CAN 通信模塊。MCP2510 支持CAN 總線V2.0A 和V2.0B 技術(shù)規(guī)范,通信數(shù)率可達(dá)1Mb/s,擁有3 個發(fā)送緩沖器、2 個接收緩沖器,高速SPI 接口支持0,0 和1,1SPI 模式。TJA1050具有對總線差分信號的收發(fā)功能和抗汽車環(huán)境下的瞬間干擾等能力。網(wǎng)關(guān)的GPRS 接口采用SIMCOM 公司的SIM300 GSM/GPRS 模塊,該模塊可為GSM 語音、短消息和GPRS 上網(wǎng)等業(yè)務(wù)提供無線接口。采用6 腳SIM 卡座來連接SIM 卡。網(wǎng)關(guān)的硬件結(jié)構(gòu)如圖2 所示。

在實際硬件連接時,S3C2410 的SPI 接口與MCP2510 的SPI 接口直接相連。MCP2510的TXCAN、RXCAN 引腳分別與TJA1050 的TXD、RXD 引腳相連,而TJA1050 的CANH和CANL 引腳分別接到CAN 總線的CANH 線和CANL 線上。因為S3C2410 的UART 口并沒有引出DCD、 DTR、DSR 和RI 信號引腳,要通過SIM300 無線聯(lián)網(wǎng),最好使用全部的信號引腳,所以我們使用PHILIPS 的SC16C550 從S3C2410 上擴(kuò)展出標(biāo)準(zhǔn)的UART 接口與
SIM300 的UART 接口進(jìn)行連接。CAN/GPRS 網(wǎng)關(guān)主要通信模塊的硬件電路原理圖如圖3 所示。
4 CAN/GPRS 無線車載網(wǎng)關(guān)軟件實現(xiàn)
4.1 ARM-Linux 操作系統(tǒng)移植.使用韓國 MIZI 公司開發(fā)的VIVI 作為bootloader、選擇2.6 內(nèi)核的ARM-Linux 作為嵌入式操作系統(tǒng),并用busybox 制作Linux 的根文件系統(tǒng)。在K9F1208 NAND Flash 芯片上存儲區(qū)域的劃分如表1 所示。

4.2 ARM-Linux 下SPI 驅(qū)動程序編寫
使用 S3C2410 自帶的SPI 通道0 與MCP2510 進(jìn)行通信,其SPI 驅(qū)動程序流程[3]如下:
(1)寫SPPRE0 寄存器,設(shè)置波特率。
(2)寫SPCON0 寄存器,設(shè)置數(shù)據(jù)傳輸為0,0SPI 模式。
(3)向SPIDAT0 寄存器寫10 次0xFF,以初始化MCP2510。
(4)設(shè)置GPIO 引腳,用來充當(dāng)片選,設(shè)定低電平以激活MCP2510。
(5)檢查SPSTA0 寄存器的發(fā)送狀態(tài)位REDY 是否為1,若是,則可以向SPTDAT0 寄存器寫數(shù)據(jù)并發(fā)送出去。
(6)SPCON0 寄存器的TAGD 不使能,向SPTDAT0 寄存器寫入0xFF,在確認(rèn)REDY 有效后,可從SPRDAT0 寄存器中讀數(shù)據(jù);TAGD 使能,確認(rèn)REDY 后,也可從SPRDAT0 寄存器中讀數(shù)據(jù)。
(7)設(shè)置GPIO 引腳,信號設(shè)為高電平,片選不使能。
4.3 ARM-Linux 下CAN 驅(qū)動程序編寫
因為 CAN 應(yīng)用層協(xié)議是基于CAN2.0B 技術(shù)規(guī)范設(shè)計的,所以通信報文采用CAN2.0B擴(kuò)展幀格式。
初始化:(1)發(fā)送0xc0 復(fù)位指令,MCP2510 復(fù)位;(2)進(jìn)入配置模式,設(shè)置CAN 總線波特率,關(guān)中斷;(3) 設(shè)置屏蔽寄存器RXM(0、1)SID(L/H)、RXM(0、1)EID(8/0)和濾波寄存器RXF(0~5)SID(L/H)、RXF(0、1)EID(8/0)并啟動;(4)設(shè)置CAN 設(shè)備為普通模式并切換到正常模式;(5)清空接收和發(fā)送緩沖區(qū)。(6)開啟接收或發(fā)送緩沖區(qū),開啟中斷。發(fā)送報文:(1)寫標(biāo)識符寄存器TXB(0~2)SID(L/H)、TXB(0~2)EID(8/0);(2)向發(fā)送緩沖器數(shù)據(jù)長度寄存器TXB(0~2)DLC 寫入要發(fā)送的報文長度;(3) 寫數(shù)據(jù)時,需依次向MCP2510 發(fā)送0x02 寫指令、發(fā)送緩沖器數(shù)據(jù)寄存器TXB(0~2)DM 的8 位地址碼和需要發(fā)送的報文數(shù)據(jù);(4)必須進(jìn)行發(fā)送有效性檢測,即:檢測發(fā)送緩沖器控制寄存器TXB(0~2)CTRL 的TXREQ 位。為1 時,說明正在發(fā)送報文,須等待;當(dāng)此報文發(fā)送完畢后,該位將被自動清零,這時才可寫入下一個將要發(fā)送的報文數(shù)據(jù)。接收報文:(1) 向MCP2510 發(fā)送0xA0 狀態(tài)讀指令,并不斷檢測中斷標(biāo)志寄存器CANINTF,當(dāng)發(fā)現(xiàn)RX(0、1)IF 位為1,說明接收緩沖器已收到報文;(2)這時可從接收緩沖器標(biāo)識符寄存器中讀出幀的ID,從接收緩沖器數(shù)據(jù)長度寄存器RX(0、1)BDLC 讀出收到的報文長度;(3)讀數(shù)據(jù)時,需依次向MCP2510 發(fā)送0x03 讀指令、接收緩沖器數(shù)據(jù)寄存器RXB(0、1)DM 的8 位地址碼后MCP2510 才會將數(shù)據(jù)通過SO 引腳發(fā)送出來。讀完數(shù)據(jù),RX(0、1)IF 位需清零。
4.4 ARM-Linux 下串口驅(qū)動程序修改及加載
因為我們使用的是與 16c550 寄存器兼容的UART 控制器芯片SC16C550,所以需要加載其在Linux 下的驅(qū)動程序serial_8250.c。但SC16C550 芯片是通過外部總線和S3C2410 微處理器連接的,所以在驅(qū)動程序的serial8250_isa_init_ports 函數(shù)中需加入對SC16C550 芯片所在Bank 空間的初始化,包括設(shè)置讀/寫時序、速度和總線寬度等信息[4]。
4.5 ARM-Linux 下GPRS 聯(lián)網(wǎng)
GPRS 通過PPP(Point-to-Point Protocol,點對點協(xié)議)來完成聯(lián)網(wǎng)。PPP 是在直接連接的串行鏈路上創(chuàng)建和運行IP 網(wǎng)際協(xié)議或其他網(wǎng)絡(luò)協(xié)議的一個方案。在ARM-Linux 下對PPP的支持需要內(nèi)核和應(yīng)用程序配合管理。對于Linux2.6 內(nèi)核,在配置內(nèi)核時需要選擇對PPP的支持,如:在Network device support 菜單下,選擇支持PPP 協(xié)議、PPP 異步/同步串口通信和PPP 壓縮。此外,還需要移植Linux 下PPP 的應(yīng)用程序工具包,即把交叉編譯后得到的pppd、chat 程序加入根文件系統(tǒng)。在根文件系統(tǒng)的/etc/ppp 目錄下,還需編寫3 個腳本文件:options(pppd 配置腳本)、gprs-connect(pppd 連接腳本)、gprs-disconnect(pppd 斷開腳本)。在options 腳本中需指定串口控制臺設(shè)備/dev/ttse/0、連接波特率115200、連接和斷開腳本的存放路徑; 在gprs-connect 腳本中運行chat 程序, 并指定APN 接入點, 如:'AT+CGDCONT=1,"IP","CMNET","",0,0'和ISP 呼叫號碼:'ATD*99***1#'等。這樣系統(tǒng)啟動
后,直接使用pppd &命令即可實現(xiàn)GPRS 無線接入互聯(lián)網(wǎng)。
4.6 CAN 應(yīng)用層協(xié)議與UDP 或TCP 協(xié)議轉(zhuǎn)換
因為 GPRS 網(wǎng)絡(luò)是建立在TCP/IP 協(xié)議基礎(chǔ)上的,所以通過GPRS 網(wǎng)絡(luò)與Internet 遠(yuǎn)程服務(wù)器通信可以使用UDP 或TCP 協(xié)議。由于S3C2410 上不僅移植了Arm-Linux 操作系統(tǒng),其本身已支持TCP/IP 協(xié)議,而且我們也把CAN 的應(yīng)用層協(xié)議加載了上去。所以在網(wǎng)關(guān)上無線發(fā)送數(shù)據(jù)時,只需將汽車CAN 網(wǎng)上的CAN 數(shù)據(jù)包數(shù)據(jù)域中的數(shù)據(jù)加上UDP 或TCP包頭即可發(fā)送出去;當(dāng)在網(wǎng)關(guān)上無線接收數(shù)據(jù)時,只需去掉UDP 或TCP 數(shù)據(jù)包的包頭,得
到的數(shù)據(jù)可以遵照CAN 應(yīng)用層協(xié)議的報文格式向CAN 網(wǎng)上發(fā)送。協(xié)議轉(zhuǎn)換如圖4 所示。

4.7 心跳程序的實現(xiàn)
因為 CAN/GPRS 無線網(wǎng)關(guān)與Internet 遠(yuǎn)程服務(wù)器通信時,可能會出現(xiàn)連接的異常情況,所以需要使用心跳程序來檢測異常情況的發(fā)生,并通過心跳程序重新?lián)芴杹肀WC無線通信鏈路的正常連接[5]。我們可以定時Ping 遠(yuǎn)程服務(wù)器,若能Ping 通,則表示無線通信鏈路工作正常;若多次無法Ping 通,則必須斷開連接,重新?lián)芴枴?br>5 結(jié)論
本文詳細(xì)介紹了 CAN/GPRS 無線車載網(wǎng)關(guān)的實現(xiàn),所實現(xiàn)的網(wǎng)關(guān)在實驗通信網(wǎng)絡(luò)中能較好地完成汽車內(nèi)部CAN 網(wǎng)數(shù)據(jù)信息與外界的交互任務(wù),并能長時間穩(wěn)定運行,基本上達(dá)到了工作要求。
本文作者創(chuàng)新點:在CAN/GPRS 無線車載網(wǎng)關(guān)上能成功地運行ARM-Linux 嵌入式操作系統(tǒng)、心跳程序和底層硬件驅(qū)動程序,完成了CAN 應(yīng)用層協(xié)議與TCP 或UDP 協(xié)議的轉(zhuǎn)換,使得汽車內(nèi)部CAN 網(wǎng)能與外界進(jìn)行無線數(shù)據(jù)通信。
電子發(fā)燒友App


























評論