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