|
工業(yè)現(xiàn)場總線是工廠底層設(shè)備之間的通信網(wǎng)絡(luò),是計(jì)算機(jī)數(shù)字通信技術(shù)在自動化領(lǐng)域的應(yīng)用,為車間底層設(shè)備信息及生產(chǎn)過程信息集成提供了通信技術(shù)平臺。傳統(tǒng)的工業(yè)串行總線標(biāo)準(zhǔn)有RS232和RS485,CAN則是目前廣泛應(yīng)用的典型的現(xiàn)代工業(yè)現(xiàn)場總線標(biāo)準(zhǔn)。以太網(wǎng)是一種可應(yīng)用于工業(yè)以及辦公環(huán)境的通用網(wǎng)絡(luò)標(biāo)準(zhǔn)。這些不同的串行通信標(biāo)準(zhǔn),由于各種不同原因分別得到不同應(yīng)用。為了實(shí)現(xiàn)這些不同標(biāo)準(zhǔn)節(jié)點(diǎn)之間的數(shù)據(jù)通信,必須有一個(gè)實(shí)現(xiàn)這些不同標(biāo)準(zhǔn)之間協(xié)議轉(zhuǎn)換的網(wǎng)關(guān)設(shè)備,TC700就是為實(shí)現(xiàn)這個(gè)目的而設(shè)計(jì)的。 RS232、RS485串行總線標(biāo)準(zhǔn)主要是完成物理層之間的協(xié)議轉(zhuǎn)換工作,而CAN和以太網(wǎng)之間的協(xié)議轉(zhuǎn)換既包括物理層的轉(zhuǎn)換也包括數(shù)據(jù)鏈路層的轉(zhuǎn)換,是二層的轉(zhuǎn)換結(jié)構(gòu)。因此,TC700能夠?qū)崿F(xiàn)串口與網(wǎng)口、CAN口與網(wǎng)口之間的協(xié)議轉(zhuǎn)換功能,我們將其看作是一種復(fù)合型的工業(yè)總線網(wǎng)關(guān)設(shè)備。 1 TC700 的功能原理與硬件結(jié)構(gòu) 1.1 TC700 網(wǎng)關(guān)設(shè)備的功能原理 TC700網(wǎng)關(guān)采用嵌入式系統(tǒng)架構(gòu)進(jìn)行設(shè)計(jì),包括了RS232、RS485、CAN和以太網(wǎng)幾種類型的接口。TC700能夠支持簡單的路由功能,在把RS232、RS485、CAN接入IP網(wǎng)絡(luò)的同時(shí),可從IP網(wǎng)絡(luò)中對每個(gè)串口設(shè)備進(jìn)行訪問。在數(shù)據(jù)傳輸時(shí),TC700中的RS232、RS485與CAN接口均被分配一個(gè)IP地址,從串口接收到的負(fù)載數(shù)據(jù)能夠各自組成相應(yīng)格式的數(shù)據(jù)幀,通過網(wǎng)絡(luò)接口發(fā)送出去,在局域網(wǎng)甚至在廣域網(wǎng)進(jìn)行傳輸;反之,本地主機(jī)或遠(yuǎn)程主機(jī)也可以通過Internet遠(yuǎn)程訪問各個(gè)串行接口。TC700的原理框圖如圖1所示: 1.2 TC700 協(xié)議轉(zhuǎn)換器硬件總體結(jié)構(gòu) TC700協(xié)議轉(zhuǎn)換器使用了飛思卡爾公 司(原摩托羅拉公司)生產(chǎn)的微處理器 MPC850作為它的CPU,它是TC700總體結(jié) 構(gòu)的中心,對各個(gè)模塊進(jìn)行控制。這些模塊 分為兩部分,一部分是核心支持模塊,主要 包含電源模塊,存儲器模塊(SDRAM與Flash Memory),時(shí)鐘和復(fù)位模塊和通用I/O模塊。 另一部分為通信模塊,包括串口模塊,以太 網(wǎng)模塊、CAN接口模塊等。MPC850集成了 一個(gè)高性能的嵌入式PowerPC核和一個(gè)包 含特殊設(shè)計(jì)的32位RISC處理器的通信處理 器(CPM)。它的 CPM 支持6個(gè)串行通道: 一個(gè)串行通信控制器(SCC)、一個(gè)通用串 行總線通道(USB)、兩個(gè)串行管理控制器 (SMC)、一個(gè)I?C(Inter-Integrated Circuit) 接口和一個(gè)串行外圍接口電路(SPI)。本 文中,筆者著重介紹了TC700協(xié)議轉(zhuǎn)換器的 CAN接口驅(qū)動開發(fā)過程中的硬件設(shè)計(jì)和軟 件設(shè)計(jì)兩個(gè)部分。 2 CAN 接口硬件電路設(shè)計(jì) CAN總線是一種串行數(shù)據(jù)通信協(xié)議, 在CAN總線通信接口中集成了CAN協(xié)議的 物理層和數(shù)據(jù)鏈路層功能,可以完成對通信 數(shù)據(jù)成幀處理。CAN總線接口的設(shè)計(jì)有硬 件設(shè)計(jì)和軟件設(shè)計(jì)兩種方式。軟件設(shè)計(jì)方式 需要開發(fā)人員編寫相應(yīng)的程序來實(shí)現(xiàn)數(shù)據(jù) 的成幀、解幀和完成數(shù)據(jù)幀的收發(fā)功能。這 就增加了開發(fā)人員的負(fù)擔(dān),延長開發(fā)周期。 最重要的是軟件程序會增大系統(tǒng)運(yùn)行開銷, 使CPU利用率降低等,因此本文采用硬件開 發(fā)方式完成對CAN接口的設(shè)計(jì)。在CAN控制器的選擇上,由于TC700的CPU與CAN控制 器之間的通信是通過SPI接口來實(shí)現(xiàn)的,因 此除了選有帶有SPI接口的CPU芯片之外, CAN控制器也須選擇帶有SPI接口的芯片。 美國微芯科技有限公司生產(chǎn)的MCP2510是 一款帶有SPI 接口的CAN 控制器,它通過 SPI 接口與CPU進(jìn)行數(shù)據(jù)傳輸。MCP2510支 持CAN 技術(shù)規(guī)范V2.0A和 V2.0B,并能夠 發(fā)送和接收標(biāo)準(zhǔn)的和擴(kuò)展的信息幀, 同時(shí)具 有接收濾波和信息管理的功能,還具有靈活 的中斷管理能力。這些特點(diǎn)使得CPU 對 CAN 總線的操作變得非常簡便。另外, 筆者還選擇了PHILIP生產(chǎn)的PCA82C250芯 片作為TC700網(wǎng)關(guān)設(shè)備的CAN的收發(fā)器。 PCA82C250具有放大MCP2510與CAN總線 之間傳輸信號的功能,可以使CAN總線有充 分的負(fù)載能力與總線上其他設(shè)備進(jìn)行數(shù)據(jù) 交換。 (a) MCP2510接口電路圖 (b) PCA82C250 接口電路 圖 2 CAN 總線的接口電路 圖2是CAN總線的接口電路原理圖, MCP2510通過SPI接口的四個(gè)管腳SPIMISO、 SPIMOSI 、SPICLK 、SPI_SEL 分別與CPU 的 PB[28]、PB[29]、PB[30]、PD[7]管腳相連, 即實(shí)現(xiàn)了MCP2510與CPU雙方SPI接口的互 連。SPI接口間的通信協(xié)議也是可以采用軟 件算法的方式來實(shí)現(xiàn)的;CAN控制器MCP2510 與CAN 收發(fā)器PCA82C250 通過CAN_TX 和 CAN_RX管腳進(jìn)行相連,這里的PCA82C250作 為MCP2510與物理總線的接口。為了提高系 統(tǒng)的抗干擾能力,在MCP2510和PCA82C250之 間加了雙通道數(shù)字隔離器ADuM1201 , ADuM1201有諸多優(yōu)于光電隔離器件性能的 地方,可以很好的滿足CAN總線上電氣隔離 的要求。 3 基于VxWorks 的CAN 接口驅(qū)動程序設(shè)計(jì) 3.1 基于VxWorks 的嵌入系統(tǒng)的工作原理 本網(wǎng)關(guān)所采用的嵌入式操作系統(tǒng) VxWorks是美國“風(fēng)河”(Wind River)公司 開發(fā)研制的一種嵌入式實(shí)時(shí)操作系統(tǒng) (RTOS)。在眾多的嵌入式操作系統(tǒng)中, VxWorks以良好的可靠性和卓越的實(shí)時(shí)性, 在軍事、航空航海、通信、醫(yī)療等高科技技 術(shù)領(lǐng)域都有著廣泛的應(yīng)用與發(fā)展,在嵌入式 領(lǐng)域中占有極其重要的地位。VxWorks具有 小巧的內(nèi)核、可被裁剪、廣泛的硬件支持和 第三方軟件開發(fā)商支持等優(yōu)點(diǎn),極大地提高 了程序員的開發(fā)效率。 加電后,TC700首先啟動VxWorks操作 系統(tǒng),包括了兩個(gè)映像的啟動過程。一是 BootRom 映像; 另一是VxWorks 映像。 BootRom映像是一個(gè)最小化、專用的系統(tǒng)映 像,又稱為啟動映像,它保存在固定位置(如 FlashROM或ROM),主要負(fù)責(zé)加載和運(yùn)行 最終使用的VxWorks映像。即在VxWorks操作系統(tǒng)正式啟動之前,首先需要定制和建立 BootRom,然后通過它下載配置可加載的 VxWorks映像到RAM中運(yùn)行。VxWorks映像 加載完畢后,系統(tǒng)就啟動內(nèi)核創(chuàng)建根任務(wù) usrRoot,通過調(diào)用iosInit()函數(shù)初始化I/O 文件系統(tǒng),初始化各個(gè)串口并安裝驅(qū)動程 序。初始化工作完成之后,VxWorks操作系 統(tǒng)正式加載,網(wǎng)關(guān)開始工作。 3.2 SPI 接口驅(qū)動程序的開發(fā) SPI接口驅(qū)動程序是為了完成TC700協(xié) 議轉(zhuǎn)換器的CAN通信而設(shè)計(jì)的,在本系統(tǒng) 中,筆者通過移植u-boot中的spi.c文件使該 驅(qū)動能夠在VxWorks操作系統(tǒng)下順利運(yùn)行。 在SPI接口的驅(qū)動程序spi.c中有三個(gè)主要的 功能函數(shù):sysSpiHwInit()、spi_write()和 spi_read()。 (1) sysSpiHwInit(),使SPI能夠正常工 作;初始化參數(shù)RAM;設(shè)置參數(shù)RAM和雙 口RAM的基址等。 (2) spi_write(),該函數(shù)為SPI接口的寫 函數(shù),定義接收緩沖區(qū)和發(fā)送緩沖區(qū)指針變 量,并為其分配存儲空間;寫入寫數(shù)據(jù)使能 控制字。 (3) spi_read(),該函數(shù)為SPI接口的讀函 數(shù),同樣也需定義接收、發(fā)送緩沖區(qū)的指針 變量和分配存儲空間;并寫入讀數(shù)據(jù)使能控 制字。 4 CAN 接口驅(qū)動程序流程 VxWorks 操作系統(tǒng)中的I/O 系統(tǒng)中有 兩種基本設(shè)備類型[5]:字符設(shè)備和塊存取設(shè) 備,本文中所研究的CAN 口設(shè)備屬于字符 設(shè)備。I/O 系統(tǒng)為所有的字符設(shè)備提供統(tǒng)一 的訪問接口[6],其基本作用就是,把用戶請 求分配到與設(shè)備對應(yīng)的驅(qū)動例程中去。 在 CAN 接口驅(qū)動程序的開發(fā)過程中, 我們對VxWorks 的虛擬設(shè)備ttyDrv 進(jìn)行封 裝,使其向上將TTY 設(shè)備安裝到標(biāo)準(zhǔn)的I/O 系統(tǒng)中去,從而完成上層程序?qū)τ布O(shè)備的 操作;向下為實(shí)際的硬件設(shè)備提供底層的設(shè) 備驅(qū)動程序。 4.1 CAN 設(shè)備初始化過程 ①網(wǎng)關(guān)設(shè)備加電后,操作系統(tǒng)啟動, 創(chuàng)建根任務(wù)UsrRoot,并通過該任務(wù)調(diào)用iosInit ( )函數(shù)對VxWorks 的I/O系統(tǒng)進(jìn)行初 始化; ②調(diào)用設(shè)備驅(qū)動初始化函數(shù)ttyDrv( ), 該函數(shù)先初始化CAN設(shè)備驅(qū)動程序,然后調(diào) 用iosLib 庫中的函數(shù)iosDrvInstall( ),為該設(shè) 備的相關(guān)I/O驅(qū)動程序分配一個(gè)驅(qū)動號 (ttyDrvNum = iosDrvInstall (ttyopen, (FUNCPTR) NULL, ttyOpen, ttyClose, tyRead, tyWrite, ttyIoctl);),并將其對應(yīng)的 函數(shù)入口地址增加到驅(qū)動程序表中 (drvTable); ③ttyDevCreate ( )函數(shù)用來創(chuàng)建設(shè)備 驅(qū)動。首先將已經(jīng)定義并初始化的結(jié)構(gòu)體 TYCO_DEV傳遞給ttyDevCreate ( )函數(shù),然 后調(diào)用iosDevAdd ( )將設(shè)備名(該設(shè)備名稱 為tyCo/4)和驅(qū)動號(ttyDrvNum)加入設(shè) 備鏈表(iosDvList)中。 CAN設(shè)備驅(qū)動的初始化工作主要包括 為讀寫緩沖區(qū)分配存儲空間、創(chuàng)建讀寫同步 信號量和互斥信號量以及初始化等待任務(wù) 列表等。 4.2 CAN 設(shè)備驅(qū)動程序的訪問過程 系統(tǒng)在對設(shè)備進(jìn)行初始化完畢之后, 應(yīng)用程序可以通過I/O系統(tǒng)對設(shè)備進(jìn)行訪 問。但在VxWorks中,應(yīng)用程序是通過打開 命名文件來訪問I/O設(shè)備的。對每個(gè)設(shè)備的 訪問都會看成是對一個(gè)文件的操作,每個(gè)被 打開的文件都會作為一個(gè)條目存儲在文件 描述符表(fdTable)中[2]。 ①調(diào)用open()函數(shù)打開要訪問的設(shè)備 tyCo/4; ②I/O系統(tǒng)根據(jù)設(shè)備名(tyCo/4)在設(shè) 備鏈表(iosDvList)中進(jìn)行查找匹配,返回 設(shè)備數(shù)據(jù)結(jié)構(gòu)指針( TYCO_DEV * pTyCoDev); ③被打開的設(shè)備作為文件設(shè)備在文件 描述符表中被分配到一個(gè)空的文件條目 ( FD_ENTRY); ④I/O系統(tǒng)根據(jù)查找到的設(shè)備驅(qū)動號 (ttyDrvNum)在設(shè)備驅(qū)動程序表(drvTable) 中查找該設(shè)備對應(yīng)的ttyOpen (TYCO_DEVpTyCoDev, char * name, int flags, intmode)驅(qū)動例程。如果成功,則通過該驅(qū)動例程將設(shè)備驅(qū)動描述符指針 (pTyCoDev)、設(shè)備文件名和驅(qū)動返回值 存放在空的文件條目中,并返回一個(gè)文件描 述符(fd); ⑤應(yīng)用程序通過調(diào)用ioLib中的read或 write函數(shù)對設(shè)備文件進(jìn)行訪問。首先,這兩 個(gè)函數(shù)通過文件描述符(fd)找到對應(yīng)的設(shè) 備描述符。然后根據(jù)設(shè)備描述符找到對應(yīng)的 drvTable表,在DRVTABLE表中調(diào)用TTY設(shè) 備的例程函數(shù)tyWrite ()、tyRead (),通過這 兩個(gè)例程函數(shù)調(diào)用驅(qū)動程序spi.c 中的 spi_write和spi_read函數(shù)與實(shí)際的CAN接口 硬件設(shè)備進(jìn)行數(shù)據(jù)傳輸,從而實(shí)現(xiàn)CAN報(bào)文 的發(fā)送和接收。 5 結(jié)束語 本文的創(chuàng)新點(diǎn)是作者將UNIX系統(tǒng)下 的SPI接口程序移植到VxWorks系統(tǒng)下,使 其能在VxWorks系統(tǒng)下正常運(yùn)行,從而完成 了TC700網(wǎng)關(guān)的CAN驅(qū)動程序的開發(fā)。另 外,本文提出的TC700CAN接口驅(qū)動程序的 設(shè)計(jì),是VxWorks的驅(qū)動機(jī)制在X86平臺上 的實(shí)現(xiàn),其開發(fā)思路也能夠?yàn)榛谄渌脚_ 的CAN接口驅(qū)動開發(fā)提供一些經(jīng)驗(yàn)。傳統(tǒng)的 硬件驅(qū)動程序開發(fā),需要開發(fā)人員使用匯編 語言編寫軟件程序。而在嵌入式系統(tǒng)中, TC700的驅(qū)動開發(fā)過程是在上層進(jìn)行的,即 軟件驅(qū)動程序的開發(fā),通過高級語言進(jìn)行程 序編寫即可。實(shí)踐調(diào)試結(jié)果表明:本文所設(shè) 計(jì)的網(wǎng)關(guān)實(shí)現(xiàn)了CAN接口驅(qū)動的功能,能可 靠的運(yùn)行并能與CAN總線上的設(shè)備進(jìn)行正 常的數(shù)據(jù)交換,充分體現(xiàn)了CAN總線高性 能、高可靠性的特點(diǎn)。 |