摘? 要: 通用串行總線(USB)作為一種嶄新的微機總線接口規(guī)范,其特點使其非常適合作為主機和醫(yī)學儀器之間的通信接口,從而實現(xiàn)主機和多臺醫(yī)學儀器之間簡單、快速、可靠的連接和通信。介紹了基于USB總線的數(shù)據(jù)采集設備的開發(fā)方法,包括硬件設計、firmware(固件)設計、基于WINDOWS 驅動程序模型(WDM)的設備驅動程序" title="設備驅動程序">設備驅動程序設計以及應用軟件的設計。
關鍵詞: 通用串行總線? 數(shù)據(jù)采集
?
隨著醫(yī)學信息網(wǎng)絡化的需要,經(jīng)常需要將各種醫(yī)學儀器(如腦電圖、心電圖等)與主機相連,以便于從這些醫(yī)學儀器獲得所需的各種醫(yī)學信息。同時,在需要的時侯還可以通過主機對這些醫(yī)學儀器的操作進行控制。
傳統(tǒng)的外設與主機的通訊接口一般是基于PCI總線、ISA總線或者是RS-232C串行總線。PCI總線雖具有高的傳輸速度" title="傳輸速度">傳輸速度(132Mbps),支持“即插即用”功能,但其缺點是插拔麻煩,且擴展槽有限(一般為5~6個)。ISA總線顯然存在著同樣的問題。RS-232C串行總線雖然連接簡單,但其缺點是傳輸速度慢(56kbps),且主機的串行口數(shù)目有限。
USB(Universal Serial Bus,通用串行總線)是由Intel、Microsoft、IBM及NEC等共同制定的微機總線接口規(guī)范[1]。由于USB具有較高的傳輸速度(USB協(xié)議1.1支持的最高傳輸速度為12Mbps,而USB協(xié)議2.0支持的最高傳輸速度更是高達480Mbps),支持即插即用和熱插拔功能,USB設備的連接電纜最長可達5 m,且可通過USB集線器進行層式星形拓撲連接(一臺主機最多可連接127個USB設備,且可實現(xiàn)最多5級的拓撲連接),因此其非常適合作為主機和醫(yī)學儀器之間的通信接口。
為便于臨床上采集病人的某些生理信號(如心電信號,腦電信號等)[2][3],設計了基于USB總線的醫(yī)學數(shù)據(jù)采集設備,其最多支持32個通道的同步數(shù)據(jù)采集,最高采樣率為1kHz,采樣精度為16bit,主機的操作系統(tǒng)為Win98。主要完成了四個方面的工作:硬件設計、firmware(固件)設計、設備驅動程序設計以及應用軟件的設計。
1 硬件設計
USB數(shù)據(jù)采集設備的硬件構成見圖1。從圖1可知,32路模擬輸入信號由多路模擬開關控制將其中的某一路信號接入串行A/D(選用B-B公司的ADS7809),A/D轉換的結果經(jīng)光電隔離后串行輸出到移位寄存器,移位寄存器將此結果轉為并行數(shù)據(jù)并寫入FIFO存儲器,80C52系統(tǒng)將數(shù)據(jù)從FIFO存儲器中讀出并通過USB控制器送到主機。
?
?
當前可供選擇的USB控制器很多,如朗訊公司的USS820、國家半導體公司的USBN9602。另外,還有將微控制器和USB控制器集成在一起的芯片,如Intel公司的8x930Hx和8x930Ax,其中8x930Hx支持USB集線器功能。在實際開發(fā)中選擇了朗訊公司的USS820,其主要特點是完全遵循USB協(xié)議1.1,支持12Mbps的全速傳輸,支持四種傳輸方式,提供8個端點(Endpoint), 且每個端點的傳輸類型、傳輸方向均可自由配置。另外,它還為每個端點提供兩套FIFO數(shù)據(jù)緩沖區(qū),總的數(shù)據(jù)緩沖區(qū)大小可達2240字節(jié)。
2 firmware設計?
此處firmware(固件)是指被固化到89C52" title="89C52">89C52 E2PROM中的程序。firmware主要完成兩個方面的工作:控制A/D的采樣和通過USB控制器與主機通信。由于89C52系統(tǒng)控制A/D采樣的工作非常簡單,此處不做介紹。詳細介紹89C52系統(tǒng)通過USB控制器與主機通信的工作。
因為89C52系統(tǒng)對USB控制器的操作是嚴格按照USB協(xié)議1.1進行的,因此先對USB協(xié)議1.1做一簡單的介紹。按照USB協(xié)議1.1的規(guī)定,USB的傳輸方式分為4種:控制傳輸(Control transfer),塊傳輸(Bulk transactions),中斷傳輸(Interrupt transactions)和等時傳輸(Isochronous transactions)??刂苽鬏斨饕脕硗瓿芍鳈C對設備的各種控制操作(如獲取設備的設備描述符,設置設備的USB地址等,也可以通過控制傳輸來定義自己對設備的控制操作,如設置采樣參數(shù)、開始或停止采樣等);塊傳輸主要用來完成主機和設備之間的大批量數(shù)據(jù)傳輸,由于塊傳輸在硬件級上對傳輸數(shù)據(jù)進行錯誤檢測(若發(fā)生錯誤,它支持“重傳”功能),因此它能保證數(shù)據(jù)傳輸?shù)目煽啃?,塊傳輸支持兩個方向的數(shù)據(jù)傳輸(即主機到設備和設備到主機);中斷傳輸用來完成設備到主機的少量數(shù)據(jù)傳輸,它只支持設備到主機方向的數(shù)據(jù)傳輸(中斷傳輸跟實際的“中斷”概念沒有任何聯(lián)系);等時傳輸主要用來完成主機和設備之間連續(xù)、實時數(shù)據(jù)的傳輸(如語音信號),同步傳輸不對傳輸數(shù)據(jù)進行錯誤檢測,它主要保證數(shù)據(jù)的連續(xù)傳輸。另外,需要注意的是所有的USB傳輸事務均由主機啟動,即USB總線采取主從式結構(master to slave)。
在實際開發(fā)中使用了兩種傳輸方式:控制傳輸和塊傳輸??刂苽鬏斢脕韺崿F(xiàn)位于主機上的USB總線驅動程序(USBD.SYS)以及編寫的功能驅動程序對設備的各種控制操作,而塊傳輸用來完成將采集數(shù)據(jù)從設備傳送到主機。
USB控制器的工作原理可以簡單地描述為:當USB控制器從USB總線檢測到主機啟動的某一傳輸請求時,USB控制器通過中斷方式將此請求通知89C52系統(tǒng)。89C52系統(tǒng)通過訪問USB控制器的狀態(tài)寄存器和數(shù)據(jù)寄存器獲得與此次傳輸有關的各種參數(shù),并根據(jù)具體傳輸參數(shù),對USB控制器的控制寄存器和數(shù)據(jù)寄存器進行相應的操作,以完成主機的傳輸請求。
3 設備驅動程序設計
?? USB設備驅動程序的設計是基于WDM(Windows Driver Model,Windows驅動程序模型)的[4]。WDM采用分層驅動程序模型,對于USB設備來說,可分為USB總線驅動程序和USB功能驅動程序(見圖2)。USB總線驅動程序由操作系統(tǒng)提供,它位于USB功能驅動程序的下面,負責與實際的硬件打交道,實現(xiàn)煩瑣的低層通信。USB功能驅動程序由設備開發(fā)者編寫,位于USB總線驅動程序的上面,不與實際的硬件打交道,而是通過向USB總線驅動程序發(fā)送包含URB(USB Request Block,USB請求塊)的IRP(I/O" title="I/O">I/O Request Packet,I/O請求包),來實現(xiàn)對USB設備信息的發(fā)送或接收。采用這種分層驅動程序的設計方法有兩個優(yōu)點:(1)多個USB設備可以通過USB總線驅動程序來協(xié)調它們的工作;(2)編寫分層驅動程序較之編寫單一驅動程序相對簡單,且可以節(jié)省內存和資源,不易出錯。USB設備驅動程序的工作原理可以通過圖2簡單描述。
?
?
若應用程序" title="應用程序">應用程序想對設備進行I/O操作,它便使用Windows API 函數(shù)(如DeviceIoControl( )函數(shù))對WIN32子系統(tǒng)進行WIN32調用。此調用由I/O系統(tǒng)服務接收并通知I/O管理器,I/O管理器將此請求構造成一個合適的I/O請求包(I/O Request Packet,IRP)并把它傳遞給USB功能驅動程序。USB功能驅動程序接收到這個IRP以后,根據(jù)IRP中包含的具體操作代碼,構造相應的USB請求塊并把此URB放到一個新的IRP中,然后把此IRP傳遞到USB總線驅動程序,USB總線驅動程序根據(jù)IRP中所含的URB執(zhí)行相應的操作(如從USB設備讀取數(shù)據(jù)),并把操作結果通過IRP返還給USB功能驅動程序。USB功能驅動程序接收到此IRP后,將操作結果通過IRP返還給I/O管理器,最后I/O管理器將此IRP中操作結果返還給應用程序,至此應用程序對USB設備的一次I/O操作完成。
USB功能驅動程序除負責處理應用程序的I/O請求外,還要處理PnP管理器發(fā)送給它的PnP請求(如設備啟動請求IRP_MN_START_DEVICE,設備刪除請求IRP_MN_REMOVE_DEVICE等)。通過對這些PnP請求的處理,USB功能驅動程序可支持設備的熱插拔和即插即用功能。
驅動程序的入口函數(shù)是DriverEntry( ),所有對各種IRP的處理例程都在此入口函數(shù)中做出定義。
開發(fā)USB設備驅動程序的工具有Microsoft公司的Win98DDK,Compuware公司的Numega DriverStudio等。筆者在實際開發(fā)中使用了Win98DDK。
4 應用軟件的設計
用戶態(tài)的軟件設計由兩個部分組成:動態(tài)鏈接庫和應用程序。動態(tài)連接庫負責與內核態(tài)的USB功能驅動程序通信并接受應用程序的各種操作請求,而應用程序負責對所采集的數(shù)據(jù)進行實時顯示、分析和存盤。
動態(tài)鏈接庫的工作原理如下:當它收到應用程序開始采樣的請求后,便創(chuàng)建兩個線程:采樣線程和顯示存盤線程。采樣線程負責將采集數(shù)據(jù)寫到應用程序提交的內存;而顯示存盤線程由多媒體定時器控制(每隔一段時間多媒體定時器就調用一次此線程),此線程負責給應用程序發(fā)送顯示和存盤消息。當應用程序接收到此消息后,便從它提交的內存中讀取數(shù)據(jù)并顯示和存盤。此處需要注意的是采樣線程和顯示存盤線程在讀寫應用程序提交的內存時要保持同步(如當采樣線程正在向內存進行寫操作時顯示存盤線程就不能對此段內存進行讀操作,否則就有可能導致讀寫錯誤)。保持線程同步的方法很多,如互斥量(Mutex)、信號量(Semaphore)和事件(Event)。此處使用了互斥量。
USB總線的特點使其非常適合于作為醫(yī)療儀器與主機之間的通訊接口,實現(xiàn)主機和醫(yī)學儀器之間的簡單、快速和可靠的連接。
基于USB總線的醫(yī)學數(shù)據(jù)采集設備,在實際應用中取得了良好的效果。同時,它也為數(shù)據(jù)采集提供了一種新穎的、方便的和可靠的解決方案。
?
參考文獻
1 USB1.1. Universal serial bus specification[S]
2 曾樂朋,高小榕,李明毅. 12導聯(lián)同步心電采集測量系統(tǒng)及QT/QTd分析[J]. 清華大學學報,2000;40(9):5~8
3 李全政, 高小榕, 歐陽婧. 胸阻抗信號中的呼吸波的去除[J]. 清華大學學報,2000;40(9):13~16
4 Chris Cant著,孫義譯.Windows WDM 設備驅動程序開發(fā)指南[M]. 北京:機械工業(yè)出版社, 2000