<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于WinDriver的多路串行設備驅動(dòng)開(kāi)發(fā)

基于WinDriver的多路串行設備驅動(dòng)開(kāi)發(fā)

作者: 時(shí)間:2016-10-22 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:工業(yè)控制計算機中廣泛使用串行接口UART與外圍設備進(jìn)行通信,同時(shí),Windows操作系統以其友好的UI界面被廣泛采用。文中闡述了UART設備的工作原理,并利用Jungo公司的軟件實(shí)現了Windows操作系統下一種PCI轉多路UART設備的驅動(dòng)開(kāi)發(fā)。

本文引用地址:http://dyxdggzs.com/article/201610/309281.htm

0 引言

XR17D158是在工業(yè)控制計算機中被廣泛使用的一種PCI轉8路UART接口芯片。本文首先介紹Window操作系統和開(kāi)發(fā)工具Win Driv er軟件,并通過(guò)該軟件完成XR17D158在Windows系統下的開(kāi)發(fā)。并以此為基礎,提出了一種利用WinDrive工具開(kāi)發(fā)PCI總線(xiàn)設備的軟件架構。

1 Windows操作系統驅動(dòng)開(kāi)發(fā)

Windows操作系統以其友好的用戶(hù)圖形界面和強大的功能在工業(yè)控制計算機領(lǐng)域廣泛使用。但是Windows對系統底層操作進(jìn)行了屏蔽,限制應用程序直接訪(fǎng)問(wèn)硬件資源,應用程序需要調用設備的驅動(dòng)程序訪(fǎng)問(wèn)硬件資源,而開(kāi)發(fā)Windows環(huán)境下的驅動(dòng)程序,需要對操作系統內核的運行機制有深入的了解。

美國Jungo公司的驅動(dòng)程序工具包使程序設計人員不需要掌握Windows操作系統內核的相關(guān)內容,只需要調用提供的接口函數就可以直接訪(fǎng)問(wèn)系統硬件資源,減輕了設計人員的開(kāi)發(fā)難度。WinDriver同時(shí)支持PCI/CardBus/ISA/ISAPnP/EISA/CompactPCI和USB等多種總線(xiàn)結構。

WinDriver驅動(dòng)程序的體系結構如圖1所示。

基于WinDriver的多路串行設備驅動(dòng)開(kāi)發(fā)

利用WinDriver開(kāi)發(fā)驅動(dòng),可以使用內核插入模式和用戶(hù)模式。內核插入模式效率高,但編寫(xiě)復雜,需要編寫(xiě)者對操作系統內核和微軟提供的DDK(Device Driver Kits)都有深入的了解。用戶(hù)模式下,開(kāi)發(fā)人員通過(guò)WinDriver Wizard圖形化界面的引導:首先,生成所要開(kāi)發(fā)設備的.inf文件,其次,生成設備驅動(dòng)程序源代碼模板。該模板由三部分組成:1)WinDriver提供給用戶(hù)的設備訪(fǎng)問(wèn)庫函數WDC Lib;2)Win Driv er所產(chǎn)生的設備操作例程,用以檢查設備的硬件功能是否正常;3)用戶(hù)開(kāi)發(fā)環(huán)境,包括:Visual Studio、Delphi等。

2 XR17D158工作原理

2.1 XR17D158簡(jiǎn)介

XR17D158是EXAR公司生產(chǎn)的一款PCI總線(xiàn)UART芯片,符合PCI2,3規范。XR17D158擁有8路獨立的UART接口,每路UART接口兼容16C550的配置寄存器和64字節的發(fā)送/接收FIFO。XR17D158每路UART接口的數據傳輸速率可進(jìn)行設置,最高速率可達921.6kbps。

XR17D158內部的寄存器用來(lái)實(shí)現PCI設備的配置、芯片自身的狀態(tài)監控和串行數據的接收和發(fā)送。X86體系結構下,系統上電后,BIOS將讀取XR17D158的PCI信息,根據系統的硬件架構為XR17D158分配存儲地址、端口地址和中斷號等信息。并將信息寫(xiě)入PCI配置寄存器中,例如系統會(huì )將XR17D158的UART配置寄存器基地址寫(xiě)入BAR0(10H)中。

2.2 XR17D158芯片配置

2.2.1 波特率設置

XR17D158的8路UART接口可以配置不同的波特率,波特率計算公式為:

基于WinDriver的多路串行設備驅動(dòng)開(kāi)發(fā)

式(1)中,MCR[7]代表域分頻系數,分頻系數由每路UART接口的DLM和DLL寄存器控制,對一路UART接口的波特率配置步驟如下:

(1)LCR[7]置1,使能DLM、DLL寄存器;

(2)EFR[4]置1,使能MCR[7:5];

(3)設置MCR[7],MCR[7]=0,預分頻系數為1,MCR[7]=1,預分頻系數為4;

(4)設定分頻系數,根據所要設定的波特率,利用式(1)計算分頻系數,并將分頻系數寫(xiě)入DLM、DLL寄存器中;

(5)EFR[4]清0,鎖存MCR[7]。

2.2.2 UART接口數據接收

UART接口的數據接收部分由接收移位寄存器(RSR)和接收保持寄存器(RHR)組成,RSR檢測接收到的每一位數據的有效性,當檢測到停止位時(shí),表明一個(gè)字符接收完畢,RSR將數據裝入RHR中。數據準備好中斷(ISR[2]=1)會(huì )在數據裝入RHR,或者在接收FIFO使能并且接收數據達到設定的FIFO觸發(fā)條件時(shí)產(chǎn)生。處理器可以利用查詢(xún)方式和中斷方式讀取XR17D158接收FIFO的數據。兩種方式實(shí)現的步驟為:

(1)查詢(xún)方式:1)設置UART通道的波特率;2)中斷使能寄存器[IER]清0,禁止所有中斷;3)讀取線(xiàn)路狀態(tài)寄存器(LSR);4)如果LSR[0]=0,表示RHR或者接收FIFO中沒(méi)有數據,等待一定時(shí)間后,重復第3)步;5)如果LSR[0]=1,表示RHR或者接收FIFO中已經(jīng)保存有接收到的數據,此時(shí)讀取RHR中的數據,并重復第3)步。

(2)中斷方式:1)設置UART通道的波特率;2)IER[0]置1,使能RHR中斷;3)當PCI總線(xiàn)上產(chǎn)生中斷時(shí),讀取INT0寄存器,確定產(chǎn)生中斷的通道號;4)讀取INT1、INT2、INT3寄存器,確定產(chǎn)生中斷的UART接口序號和中斷源;5)讀取RHR中的數據。

2.2.3 UART通道數據發(fā)送

發(fā)送數據過(guò)程,有效數據由主機寫(xiě)入UART接口中的發(fā)送FIFO寄存器,當發(fā)送保持寄存器(THR)清空標志位ISR[1]=1,表示發(fā)送FIFO中的數據減少到滿(mǎn)足設定的觸發(fā)中斷條件而引起中斷,在輸出移位寄存器(TSR)中,由發(fā)送控制邏輯在待發(fā)送數據加上起始位、奇偶校驗位和終止位,并按設定的時(shí)鐘頻率逐位移出數據。

3 開(kāi)發(fā)實(shí)例

使用WinDriver用戶(hù)模式開(kāi)發(fā)的驅動(dòng)程序,實(shí)則是為上層的應用程序提供一組訪(fǎng)問(wèn)設備的接口函數,實(shí)現應用程序對設備的初始化、讀操作、寫(xiě)操作和設置等。

XR17D158的驅動(dòng)程包含:UART接口打開(kāi)函數XR17D158_Open()、UART接口讀函數XR17D158_Read()、UART寫(xiě)函數XR17D158 Write()和UART接口關(guān)閉函數XR17D158 Close()。為了提高驅動(dòng)效率,可以在內存中分別開(kāi)辟一個(gè)接收緩沖區和一個(gè)發(fā)送緩沖區,XR17D158 Read()和XR17 D158 Write()不直接訪(fǎng)問(wèn)硬件設備,而是通過(guò)對內存緩_區的讀寫(xiě),實(shí)現對XR17D158的讀操作和寫(xiě)操作。本文提出的驅動(dòng)程序架構如圖2所示。

基于WinDriver的多路串行設備驅動(dòng)開(kāi)發(fā)

圖2中,XR17D158 Open()中注冊的中斷服務(wù)程序XR17D158 Handle()完成XR17158的數據接收與發(fā)送;XR17D158 Read()和XR17D158 Write()為應用層提供讀/寫(xiě)接口,通過(guò)內存緩_區接收XR17D158_Handle()的數據或向XR17D158_Handle()發(fā)送數據。

XR17D158_Open()使用WDC_PciReadCfg()和WDC_PciWriteCfg()實(shí)現對XR17D158PCI配置空間的訪(fǎng)問(wèn),使用WDC_ReadAddr8()和WDC_Write Addr80實(shí)現對XR17D158中設備配置寄存器和UART配置寄存器的操作,如UART接口波特率的配置:

基于WinDriver的多路串行設備驅動(dòng)開(kāi)發(fā)

UAR了接口數據的讀取可以使用查詢(xún)方式或者接口方式,但是查詢(xún)方式要求處理器周期地對XR17D158的狀態(tài)進(jìn)行檢測,處理器的效率較低。因此本文使用中斷的方式完成UART接口數據的接收和發(fā)送。中斷服務(wù)程序XR17D158 Handle()的工作過(guò)程過(guò)程如下:

基于WinDriver的多路串行設備驅動(dòng)開(kāi)發(fā)
基于WinDriver的多路串行設備驅動(dòng)開(kāi)發(fā)

XR17D158_Handle()實(shí)現UART接口和內存緩沖區之間的數據交換,從內存緩沖區中讀取XR17D158_Write()寫(xiě)入的數據實(shí)現數據的發(fā)送,向內存緩沖區中寫(xiě)入UART接口接收的數據,再由XR17D158_Read()讀取實(shí)現數據的接收。在XR17D158_Open()使用WDC_XR17D158_IntEnable()注冊XR17D158_Handle()。

4 結果驗證

使用外部設備向XR17D158子卡發(fā)送RS232數據,發(fā)送數據波特率為9600 bps,發(fā)送周期為1 Hz,通過(guò)示波器觀(guān)察XR17D158的接收數據波形。

基于WinDriver的多路串行設備驅動(dòng)開(kāi)發(fā)

圖3(a)為XR17D158接收到RS232數據的波形,圖3(b)為XR17D158所產(chǎn)生的中斷信號波形,中斷信號為低電平時(shí),驅動(dòng)程序處理XR17D158所接收到的數據。試驗中,RS232數據為周期發(fā)送,每幀數據為90字節,圖3中可以看出驅動(dòng)程序處理每幀數據的時(shí)間約為0.1ms,如果8路UART接口同時(shí)接收數據,且波特率為921.6kbps,此時(shí)驅動(dòng)程序處理數據的時(shí)間約為100ms,不會(huì )出現丟數現象。

5 結束語(yǔ)

文中簡(jiǎn)單地介紹了WinDriver軟件工具的特點(diǎn)和驅動(dòng)產(chǎn)生的過(guò)程,并針對一種設備XR17D158,提出了使用WinDriver開(kāi)發(fā)PCI設備驅動(dòng)的軟件架構。此時(shí)Windows驅動(dòng)設備的開(kāi)發(fā)更像是Windows應用程序的開(kāi)發(fā),僅在一個(gè)驅動(dòng)函數中使用WinDriVer提供的接口函數,而無(wú)需觸及Windows內核。此外該驅動(dòng)架構不僅適用于XR17D158設備,還可應用于其它PCⅡ設備,如PCI9056等。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>