田成富 汪鵬志
摘要:在針對(duì)國(guó)防工業(yè)、導(dǎo)航、通信等領(lǐng)域中,廣泛使用串行接口UART與外圍設(shè)備進(jìn)行通信。提出了一種基于PCI總線的8路異步傳輸標(biāo)準(zhǔn)的設(shè)計(jì)方案,該方案采用專(zhuān)用芯片XR17D158作為從設(shè)備掛接在MPC8280的PCI總線,實(shí)現(xiàn)PCI-232 接口的硬件結(jié)構(gòu)方案,并在VxWorks系統(tǒng)下開(kāi)發(fā)設(shè)備驅(qū)動(dòng)程序。本文重點(diǎn)分析了所用芯片的功能、硬件設(shè)計(jì)、寄存器配置,并給出了VxWorks操作系統(tǒng)下驅(qū)動(dòng)程序的具體實(shí)現(xiàn)方法。
Abstract: In the field of defense industry, navigation, communication, power and so on, it widely uses serial interface Universal Asynchronous Receiver/Transmitter (UART) to communicate with peripheral equipment. This paper presents a design plan for 8 asynchronous transmission standard based on PCI bus, which adopts the special chip xr17d158 as a slave device mount to peripheral component interconnect(PCI) bus of MPC8280, acieve the hardware structure scheme of the PCI-232 interface, and develops the device driver in the VxWorks system. This paper focuses on the function, hardware design, register configuration of the used chip, and gives the implementation method of the driver in the VxWorks operating system.
關(guān)鍵詞:UART;PCI總線;VxWorks系統(tǒng)
Key words: UART;PCI;VxWorks system
中圖分類(lèi)號(hào):TN958???????????????????????????????????? 文獻(xiàn)標(biāo)識(shí)碼:A????????????????????????????????? 文章編號(hào):1006-4311(2020)28-0160-03
0? 引言
伴隨著通信行業(yè)的不斷發(fā)展,越來(lái)越多的計(jì)算機(jī)或設(shè)備通過(guò)不同通信接口實(shí)現(xiàn)互連互通,實(shí)現(xiàn)信息共享和設(shè)備的集中控制與管理,其中串口通信具有結(jié)構(gòu)簡(jiǎn)單、線路成本低、實(shí)時(shí)性強(qiáng)、可靠性高等優(yōu)點(diǎn),被廣泛應(yīng)用到各個(gè)領(lǐng)域[1]。因此多串口擴(kuò)展已成為通信設(shè)備接入的重要手段。PCI總線作為基于PCI電氣規(guī)范開(kāi)發(fā)的高性能工業(yè)總線,廣泛應(yīng)用于工業(yè)控制、通信及網(wǎng)絡(luò)等領(lǐng)域。由于大部分I/O設(shè)備不具備PCI總線功能,開(kāi)發(fā)具有多端口通用串口和PCI總線的接口卡成為技術(shù)發(fā)展的必然要求。本系統(tǒng)采用專(zhuān)用集成芯片XRl7D158開(kāi)發(fā)了基于PCI總線的8路RS-232高速串行通訊卡,為通信設(shè)備提供額外的高性能串行接口,適用于連接各類(lèi)串行設(shè)備,實(shí)現(xiàn)數(shù)據(jù)的高效交互。
1? 系統(tǒng)硬件設(shè)計(jì)
本文采用Exar公司推出的一種兼容3.3V和5V的專(zhuān)用芯片XRl7D158[2],該芯片支持8路UART通道轉(zhuǎn)換PCI總線的功能,通過(guò)多路串行接口擴(kuò)展可減少系統(tǒng)開(kāi)銷(xiāo)、節(jié)約印制板空間。該通信模式滿足PCI2.3規(guī)范,工作頻率33MHz,32位的數(shù)據(jù)總線能充分利用CPU帶寬,實(shí)現(xiàn)大量數(shù)據(jù)的同步傳輸。為滿足多接口實(shí)時(shí)并行上傳下載信息,每個(gè)通道都擁有可編程觸發(fā)電平的64字節(jié)發(fā)送/接收緩沖FIFO,通過(guò)參數(shù)配置可分別實(shí)現(xiàn)921.6kbps波特率的傳輸速率?;贛PC8280主控與XR17D158的硬件接口框圖如圖1所示。
圖中信號(hào)按功能劃分可分為:地址/數(shù)據(jù)線、接口控制信號(hào)、系統(tǒng)信號(hào)三種。
①地址/數(shù)據(jù)線:PCI_AD31-0為地址/數(shù)據(jù)多路復(fù)用的輸入/輸出信號(hào);PCI_C/BE3-0為總線命令和字節(jié)使能多路復(fù)用信號(hào);PCI_PAR為奇偶校驗(yàn)信號(hào),用于對(duì)PCI_AD31-0和PCI_C/BE3-0信號(hào)進(jìn)行奇偶校驗(yàn)。
②控制信號(hào):PCI_FRAME為幀周期信號(hào),表示一次數(shù)據(jù)傳輸?shù)拈_(kāi)始與持續(xù)時(shí)間;PCI_TRDY為主設(shè)備準(zhǔn)備就緒信號(hào),PCI_IRDY為從設(shè)備準(zhǔn)備就緒信號(hào),表示芯片數(shù)據(jù)傳輸就緒,需要與PCI_TRDY配合使用;PCI_DEVSEL為設(shè)備選擇信號(hào),表示選定該從設(shè)備;PCI_IDSEL為初始化設(shè)備選擇信號(hào),表示參數(shù)讀寫(xiě)配置期間,從設(shè)備被選定;PCI_INTA為中斷線,用以請(qǐng)求一個(gè)中斷事件。
③系統(tǒng)信號(hào):PCI_CLK為時(shí)鐘信號(hào);PCI_RST為復(fù)位信號(hào)。
2? XR17D158寄存器配置
XR17D158具有三種不同的寄存器組[3]:PCI局部總線配置寄存器、設(shè)備配置寄存器,串口配置寄存器其功能特性如圖2所示。
2.1 PCI局部總線配置寄存器? 主要包含設(shè)備號(hào)、廠家號(hào)、版本號(hào)、奇偶校驗(yàn)、存儲(chǔ)基地址、中斷引腳等相關(guān)信息。系統(tǒng)上電后,主控MPC8280根據(jù)PCI總線上讀取的XR17D158插卡信息為從設(shè)備XR17D158分配相應(yīng)的存儲(chǔ)地址與空間、端口地址和中斷號(hào)等參數(shù),實(shí)現(xiàn)即插即用的自動(dòng)參數(shù)配置。其中基地址寄存器BAR作為重要配置參數(shù)存儲(chǔ)在0x10地址空間,其高20位BAR[31-12]作為設(shè)備配置寄存器和串口配置寄存器的基地址。中斷線寄存器位于0x3C地址空間,主要存儲(chǔ)芯片掛接的物理中斷號(hào)。XR17D158的相關(guān)信息也可保存在外接EEPROM中,系統(tǒng)上電后XRl7D158檢測(cè)EEPROM是否有效,并讀取EEPROM中相關(guān)信息用來(lái)標(biāo)識(shí)PCI卡。其中,局部總線配置寄存器大部分具有只讀功能。
2.2 設(shè)備配置寄存器? 主要存儲(chǔ)中斷配置、定時(shí)/計(jì)數(shù)控制與狀態(tài)、軟件復(fù)位、休眠、工作模式、復(fù)用功能輸入輸出配置以及設(shè)備標(biāo)識(shí)和版本號(hào)等相關(guān)信息。設(shè)備配置寄存器地址由基地址寄存器BAR和偏移量組成,偏移量范圍為0x80-0x93。XR17D158的8路串口可分別工作在8x和16x采樣率的模式,通過(guò)配置工作模式寄存器8xMODE,可選擇各串口的采樣率。通過(guò)對(duì)REGB寄存器的位操作,控制XR17D158中IIC總線的輸入輸出,實(shí)現(xiàn)對(duì)外接EEPROM的讀寫(xiě)操作。
2.3 串口配置寄存器? 主要包含兼容16550規(guī)范的控制/狀態(tài)寄存器和64深度的發(fā)送/接收緩沖FIFO,每路串行接口都有獨(dú)立的UART配置寄存器作為串行數(shù)據(jù)傳輸控制和狀態(tài)信息指示,對(duì)于串口UARTn而言,其寄存器偏移量為0x200*n(n=0~7)。主要實(shí)現(xiàn)各串行通信的波特率設(shè)置、中斷使能與狀態(tài)指示、數(shù)據(jù)發(fā)送與接收、工作模式設(shè)置與檢測(cè)等功能。設(shè)備配置寄存器和串口配置寄存器共占4K的PCI總線存儲(chǔ)器地址空間。
當(dāng)外部輸入時(shí)鐘為14.7456MHz時(shí),通過(guò)配置可編程波特率發(fā)生器(BRG),利用公式(1)可實(shí)現(xiàn)最大波特率921.1kps傳輸。本文為實(shí)現(xiàn)115200波特率的傳輸速率,選擇4倍預(yù)分頻系數(shù),即預(yù)分頻系統(tǒng)寄存器MCR[7]=1;16X采樣率,即采樣模式寄存器8xMODE[x]=0;分頻因子2,即分頻因子寄存器DLM=0x00、DLL=0x02。
(1)
XR17D158支持在映射的存儲(chǔ)器地址進(jìn)行PCI突發(fā)模式讀/寫(xiě)操作。①讀操作主要由接收移位寄存器RSR和接收保持寄存器RHR組成。RSR用于檢測(cè)每一位數(shù)據(jù)的有效性,當(dāng)檢測(cè)到停止位時(shí),表明一個(gè)有效數(shù)據(jù)接收完成,并將完整數(shù)據(jù)載入RHR中,將中斷狀態(tài)寄存器ISR或線路狀態(tài)寄存器LSR置位,以便主控設(shè)備對(duì)RHR中數(shù)據(jù)進(jìn)行處理。因此,XR17D158可采用中斷方式和查詢(xún)方式從PCI總線接收數(shù)據(jù),其設(shè)計(jì)流程如圖3所示。②寫(xiě)操作由輸出移位寄存器TSR和發(fā)送保持寄存器THR組成,當(dāng)有效數(shù)據(jù)由主機(jī)寫(xiě)入THR后,再由發(fā)送控制邏輯加上起始位、奇偶校驗(yàn)位和終止位存入TSR,并按設(shè)定的波特率將數(shù)據(jù)逐位移出。
查詢(xún)接收方式設(shè)計(jì)流程:
①先失能串口中斷IER=0,禁止所有中斷,使串口工作在查詢(xún)模式;
②讀取線路狀態(tài)寄存器LSR[0]位,判斷數(shù)據(jù)是否從PCI總線上接收數(shù)據(jù)保存在接收保持寄存器RHR;
③讀取設(shè)備號(hào)DVID,判斷設(shè)備號(hào)是否為XR17D158特有的設(shè)備號(hào)0x28,如此重復(fù)。因此采用查詢(xún)方式時(shí)需要?jiǎng)?chuàng)建任務(wù)定時(shí)對(duì)線路狀態(tài)和設(shè)備號(hào)進(jìn)行查詢(xún)判斷。
中斷接收方式設(shè)計(jì)流程:
①先使能串口FIFO接收中斷IER[0]=1,同時(shí)清除中斷標(biāo)志位ISR=0;
②讀取全局中斷寄存器INT0,判斷哪個(gè)通道觸發(fā)中斷;
③讀取全局中斷寄存器INT1-3,判斷中斷源觸發(fā)類(lèi)型;
④當(dāng)滿足FIFO中斷時(shí),讀取緩沖區(qū)數(shù)據(jù)。并清除中斷狀態(tài)。以中斷方式接收數(shù)據(jù)時(shí),當(dāng)中斷產(chǎn)生后,程序直接進(jìn)入中斷入口函數(shù)執(zhí)行,該方式具有效率高,及時(shí)性強(qiáng)等優(yōu)點(diǎn)。
3? 軟件設(shè)計(jì)
3.1 驅(qū)動(dòng)程序設(shè)計(jì)
本設(shè)計(jì)采用具有多任務(wù)、可擴(kuò)展、組件化的VxWorks操作系統(tǒng),與Linux操作系統(tǒng)相比具有實(shí)時(shí)性強(qiáng)、及時(shí)處理多任務(wù)調(diào)度的優(yōu)點(diǎn)[4]。內(nèi)核采用操作系統(tǒng)自帶MPC8280的板級(jí)支持包移植而來(lái),其軟件設(shè)計(jì)基本流程如圖4所示。
在PCI總線上有MPC8280和XR17D158兩種設(shè)備,各設(shè)備具有獨(dú)一的設(shè)備號(hào),因此調(diào)試階段可調(diào)用pciDeviceShow()函數(shù),打印PCI總線上所有設(shè)備號(hào)等信息。在實(shí)際軟件設(shè)計(jì)過(guò)程中,通過(guò)調(diào)用pciFindDevice (D158_VID, D158_DID, index, &bus, &dev, &func)查詢(xún)掛接的XR17D158設(shè)備[5]。調(diào)用sysPciConfigRead (bus, dev, func, 0x3c, 1, &bIntNum)和sysPciConfigRead (bus, dev, func, 0x10, 4, &uMemBase)獲取芯片掛接的物理中斷號(hào)和分配的基地址。其中物理中斷號(hào)用于中斷向量和中斷服務(wù)程序的掛接,基地址用于定位各串行接口的寄存器組,實(shí)現(xiàn)對(duì)波特率和控制參數(shù)的配置,XR17D158的PCI配置空間的初始化基本完成。
XR17D158作為具有PCI總線的多串行接口芯片,在驅(qū)動(dòng)設(shè)計(jì)中可將底層函數(shù)封裝后以標(biāo)準(zhǔn)串口驅(qū)動(dòng)進(jìn)行調(diào)用,具有較好的靈活性,主要實(shí)現(xiàn)的函數(shù)如下:
①cmsIoctl()通過(guò)傳入?yún)?shù)對(duì)串口驅(qū)動(dòng)進(jìn)行控制,包括波特率設(shè)置與獲取、工作模式設(shè)置與獲取、回調(diào)函數(shù)與參數(shù)設(shè)置、數(shù)據(jù)長(zhǎng)度與格式的定義;
②cmsPollInput()輪詢(xún)讀取串口中數(shù)據(jù),便于應(yīng)用程序調(diào)用read()接口讀取數(shù)據(jù);
③cmsPollOutput()采用輪詢(xún)方式發(fā)送串口數(shù)據(jù);
④cmsTxStartup()用于中斷函數(shù)使能發(fā)送;
⑤cmsCallbackInstall()用于傳遞安裝中斷回調(diào)函數(shù)與參數(shù)。
XR17D158的驅(qū)動(dòng)函數(shù)以標(biāo)準(zhǔn)串口模式封裝后,對(duì)XR17D158的操作可以按標(biāo)準(zhǔn)串口進(jìn)行操作,具體步驟如下:
①初始化XR17D158中相關(guān)寄存器和配置函數(shù),調(diào)用ttyDrv()安裝驅(qū)動(dòng)程序到I/O系統(tǒng);
②根據(jù)系統(tǒng)所指定的串口號(hào)(/tyCo/x),調(diào)用ttyDevCreate()為系統(tǒng)添加指定串口;
③串口初始化完成后,調(diào)用open()函數(shù)打開(kāi)對(duì)應(yīng)串口;
④根據(jù)open()函數(shù)返回的文件句柄,調(diào)用read()和write()函數(shù)對(duì)串口進(jìn)行讀寫(xiě)操作,串口的初始化由傳入ioctl()函數(shù)的參數(shù)決定,主要配置如下:1)調(diào)用ioctl(fd, FIOBAUDRATE, baud)配置串口的波特率;2)調(diào)用ioctl(fd, FIOSETOPTIONS,? OPT_RAW)配置串口數(shù)據(jù)傳輸模式;3)調(diào)用ioctl(fd,? SIO_HW_OPTS_SET, CREAD | CS8 | CLOCAL)配置串口一幀數(shù)據(jù)的格式。
3.2 測(cè)試驗(yàn)證
利用外部設(shè)備以115200bps的速率向8路串口發(fā)送測(cè)試數(shù)據(jù),時(shí)間間隔為100ms。通過(guò)示波器對(duì)其中一路傳輸數(shù)據(jù)觀察如圖5所示。
圖中CH1為XRl7D158接收數(shù)據(jù)波形,CH2為INTA的中斷信號(hào)??芍?,當(dāng)INTA為低電平時(shí)觸發(fā)中斷,XR17D158開(kāi)始接收串口數(shù)據(jù)。一幀數(shù)據(jù)用時(shí)80us,其中包含一位起始位、八位有效數(shù)據(jù)位、一位停止位,滿足波特率115200bps的傳輸速率。通過(guò)對(duì)8路串行通道,2小時(shí)的測(cè)試驗(yàn)證,未出現(xiàn)誤碼和丟包現(xiàn)象,滿足通信設(shè)備對(duì)串口穩(wěn)定性的運(yùn)行要求。
4? 結(jié)論
本文利用XRl7D158芯片實(shí)現(xiàn)PCI總線和8路串口之間的通信,彌補(bǔ)傳統(tǒng)主控器中串行通信接口少的局限性,利用一卡多用實(shí)現(xiàn)多路設(shè)備的高頻率通信避免一般通信設(shè)備轉(zhuǎn)接復(fù)雜,設(shè)計(jì)繁瑣等缺陷?;赬Rl7D158設(shè)計(jì)的適配卡具有結(jié)構(gòu)緊湊,通信距離長(zhǎng),最多可支持8路設(shè)備接口,解決了大部分I/O設(shè)備沒(méi)有PCI總線接口的問(wèn)題,在現(xiàn)實(shí)中具有廣闊的應(yīng)用前景。
參考文獻(xiàn):
[1]何秋婭,徐學(xué)軍.基于VxWorks的串口服務(wù)器研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2015,32(9):223-226.
[2]安彥波.工業(yè)機(jī)器人開(kāi)放式控制系統(tǒng)的研究[D].哈爾濱工業(yè)大學(xué),2010:38-40.
[3]馮毅.基于WinDriver的多路串行設(shè)備驅(qū)動(dòng)開(kāi)發(fā)[J].電子技術(shù),2014,6:61-63.
[4]鄺安玄,劉明,朱守園.VxWorks下串口設(shè)備驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)[J].航空計(jì)算技術(shù),2018,48(4):78-81.
[5]孫廣明,唐建.基于高可靠CPCI接口的4通道串口設(shè)計(jì)[J].電子設(shè)計(jì)工程,2017,25(23):90-93.
基金項(xiàng)目:船舶工業(yè)國(guó)防科技預(yù)研基金資助項(xiàng)目(6141B04050101)。
作者簡(jiǎn)介:田成富(1986-),男,河南周口人,工程師,碩士,研究方向?yàn)闊o(wú)線通信、網(wǎng)絡(luò)通信。