<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于USB 2.0數(shù)據(jù)采集系統(tǒng)的程序設(shè)計(jì)

          基于USB 2.0數(shù)據(jù)采集系統(tǒng)的程序設(shè)計(jì)

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

            1 引言

            在工業(yè)生產(chǎn)和科學(xué)技術(shù)研究的各行業(yè)中, 常利用PC或工控機(jī)對(duì)各種數(shù)據(jù)進(jìn)行采集, 如壓力、頻率、液位、溫度等。常用的采集方式是通過(guò)數(shù)據(jù)采集板卡, 其不僅安裝麻煩, 易受機(jī)箱內(nèi)環(huán)境的干擾,而且由于受計(jì)算機(jī)插槽數(shù)量和地址、中斷資源的限制, 不可能掛接很多設(shè)備。而通用串行總線( Universa l Ser ia l Bus, USB )的出現(xiàn), 很好地解決了以上這些沖突, 可實(shí)現(xiàn)低成本、高可靠性、多點(diǎn)的數(shù)據(jù)采集。USB 2. 0 是一種計(jì)算機(jī)外設(shè)連接規(guī)范, 除了USB1. 1中規(guī)定的1. 5Mb it / s和12Mb it / s兩個(gè)模式以外, 還增加了480Mbit / s( 60MB / s)這一 高速 模式, 將USB的應(yīng)用范圍得到進(jìn)一步擴(kuò)大。

            本文介紹的基于USB 2. 0的兩路力信號(hào)采集傳輸系統(tǒng), 可用于銷(xiāo)盤(pán)式摩擦實(shí)驗(yàn)機(jī), 測(cè)量材料的摩擦系數(shù)。

            2 硬件設(shè)計(jì)

            2. 1 系統(tǒng)方案

            外部傳感器的摩擦力信號(hào)和壓力信號(hào)分別通過(guò)兩片8位AD轉(zhuǎn)換器轉(zhuǎn)換為數(shù)字信號(hào), 由USB 芯片直接傳輸至計(jì)算機(jī)中處理, 并使用軟件演示兩路力之間的關(guān)系, 計(jì)算出材料的摩擦系數(shù)。主機(jī)同時(shí)負(fù)責(zé)數(shù)據(jù)傳輸?shù)膯?dòng)與停止, USB 控制器控制信號(hào)的采集并讀取到內(nèi)部緩沖區(qū)。

            2. 2 控制器芯片選擇USB 控制器采用56 腳SSOP 封裝的CY7C68013, 屬于Cypresss 公司FX2 系列。

            Cypresss EZFX2將USB 2. 0的收發(fā)器、SIE、增強(qiáng)型8051 和一個(gè)可編程邏輯接口集成在一個(gè)芯片上。在EZUSB FX2 上, 靈活的SIE 處理大部分USB1. 1和USB 2. 0硬件協(xié)議, 釋放了用于特殊應(yīng)用功能的嵌入式微控制器。通用可編程接口( GPIF)和主控/伺服端點(diǎn)FIFO ( 8..或16..位數(shù)據(jù)總線) 提供了其與常用接口, 如: ATA, UTOPA, EPP,PCMC IA, 以及大多數(shù)DSP /處理器的簡(jiǎn)單無(wú)縫連接。其有如下特點(diǎn):

            內(nèi)核: 增強(qiáng)型8051的時(shí)鐘頻率高達(dá)48M; 每個(gè)周期4個(gè)時(shí)鐘; 運(yùn)行來(lái)自內(nèi)部RAM的程序。

            四個(gè)可編程BULK / INTERRUPT / ISOCHRONOUS端點(diǎn): 緩沖區(qū)可選擇為雙緩沖區(qū), 三緩沖區(qū)或四緩沖區(qū); 外部數(shù)據(jù)接口可為8或16位。

            GPIF: GPIF對(duì)于FX2的FIFO來(lái)說(shuō)是一個(gè)內(nèi)部主機(jī), 可編程狀態(tài)機(jī)是它的核心。對(duì)于56腳封裝,它可以產(chǎn)生三個(gè)‘控制?’( CTL [ 2: 0] ) 和九個(gè)‘地址’ (GPIFADR [ 8: 0] )輸出, 能接收兩個(gè)外部和兩個(gè)內(nèi)部‘準(zhǔn)備’ ( RDY [ 1: 0] )輸入。控制狀態(tài)機(jī)由四個(gè)用戶定義的!波形描述‘控制’。內(nèi)部RAM 中的波形描述符描述每個(gè)GPIF信號(hào)的行為。初始化階段, 波形描述符由FX2固件下載到GPIF寄存器中,通過(guò)GPIF接口在傳輸操作的代碼執(zhí)行全過(guò)程使用它??刂戚敵鲂盘?hào)( CTL[ 1: 0] )通常用做閘門(mén)控制(使能信號(hào)線)、讀/寫(xiě)信號(hào)線等。CTLx波形邊沿可通過(guò)編程進(jìn)行傳輸, 速率可達(dá)每個(gè)IFCLK時(shí)鐘一次( IFCLK 運(yùn)行于48MH z)。RDY[ 1: 0]由GPIF取樣,而且能迫使一個(gè)傳輸處于等待, 繼續(xù), 或重復(fù)狀態(tài),直到它們處于一個(gè)特殊的狀態(tài)。

            2. 3 硬件電路圖

            根據(jù)所選控制器和具體條件, 設(shè)計(jì)硬件電路如圖2所示。

            采用從主機(jī)下載固件程序的方法, SCL, SDA引腳通過(guò)兩個(gè)2. 2k 的電阻接3. 3V 電源, RESET引腳有滯后作用, 低電平有效; 內(nèi)部PLL 在V cc 到達(dá)3. 3V后約200s后穩(wěn)定。典型電路是外接一個(gè)RC電路(R = 100K, C = 0. 1F)提供RESET:信號(hào);軟件部分采用GPIF Master模式, 16 位數(shù)據(jù)總線,將兩路8位ADC 數(shù)據(jù)線直接連到GPIF數(shù)據(jù)總線上: FD[ 0: 7]接摩擦力數(shù)據(jù)信號(hào)FDATA [ 0: 8] ,FD[ 8 : 15] 接壓力數(shù)據(jù)信號(hào)PDATA [ 0 : 7 ]。

            CTL0, CTL1分別連接ADC 的READ 和WRITE 引腳, 用于控制其工作時(shí)序。REY0連接ADC 的INTR, 用于判斷是否開(kāi)始讀取數(shù)據(jù), 并由此判斷何時(shí)改變GPIF狀態(tài)。

            芯片電源使用USB 總線電源, 采用MAX IM 公司的MAX882 芯片, 把5. 25V 的Vbus轉(zhuǎn)換為3.3V, 如圖3所示。

            對(duì)于USB 2. 0系統(tǒng), D + 和D - 信號(hào)線上的差分特性阻抗會(huì)嚴(yán)重影響到信號(hào)眼圖、EOP、帶寬、信號(hào)抖動(dòng)和干擾的大小。根據(jù)U SB 2. 0規(guī)范的要求,差分線對(duì)的特性阻抗要求控制在90 ? 10% 以內(nèi),使D+ 和D - 布線長(zhǎng)度在1英寸以內(nèi), 匹配誤差在50m il以內(nèi)。

            3 軟件設(shè)計(jì)

            USB接口程序設(shè)計(jì)包括三部分: 固件程序設(shè)計(jì)、硬件驅(qū)動(dòng)程序設(shè)計(jì)、高級(jí)應(yīng)用程序設(shè)計(jì)。

            3. 1 固件( firmw are)設(shè)計(jì)

            設(shè)備固件程序的主要功能是控制EZUSB FX2接收并處理USB 驅(qū)動(dòng)程序的請(qǐng)求、控制芯片中應(yīng)用程序控制指令的接收、控制ADC 中的數(shù)據(jù)讀入等。該設(shè)計(jì)的固件程序除能夠使內(nèi)置的GPIF在沒(méi)有CPU 的干涉下通過(guò)四個(gè)端點(diǎn)FIFO ( EP2、EP4、EP6、EP8)中的兩個(gè)處理數(shù)據(jù)傳輸外, 還有配置端點(diǎn)、通過(guò)控制端點(diǎn)0 來(lái)響應(yīng)主機(jī)請(qǐng)求、控制和監(jiān)測(cè)GPIF的活動(dòng)等固定工作。

            GPIF的波形描述符通過(guò)FX2的固件保存在波形寄存器中。FX2可以保持多達(dá)4個(gè)波形描述符,均可采用4種傳輸方式( Single 讀, Single寫(xiě), FIFO讀, FIFO寫(xiě))中的一種。

            一個(gè)波形由7 個(gè)可編程的狀態(tài)( S0 ~ S6 ) 和一個(gè)特殊的IDLE 狀態(tài)S7 組成, 當(dāng)程序分支到它的IDLE 狀態(tài)時(shí)波形終止。從一種狀態(tài)到另一個(gè)狀態(tài)的轉(zhuǎn)換發(fā)生在IFCLK 的上升沿, 但GPIF可以保持在同一種狀態(tài)很多IFCLK 周期。每一個(gè)狀態(tài)都通過(guò)一個(gè)32位的狀態(tài)指令定義: 1) NDP狀態(tài): 在整個(gè)狀態(tài)期間, 控制輸出CTLx 被GPIF 指令定義為1, 0, 或三態(tài)。NDP狀態(tài)有一個(gè)以IFCLK 周期為單位的程序固定周期。如果一個(gè)波形定義的狀態(tài)少于7個(gè), 最后一個(gè)編程的狀態(tài)結(jié)束后不會(huì)自動(dòng)進(jìn)入IDLE狀態(tài), 即最后一個(gè)編程狀態(tài)的狀態(tài)指令必須包含一個(gè)IDLE 狀態(tài)的明確分支。2) DP 狀態(tài): 任何一個(gè)狀態(tài)都可以定義為DP, 允許GPIF采樣兩個(gè)信號(hào), 對(duì)采樣值進(jìn)行布爾操作, 根據(jù)結(jié)果跳轉(zhuǎn)到其它狀態(tài)(或循環(huán)到自身)。若一個(gè)狀態(tài)指令包含一個(gè)控制任務(wù)(遞增FIFO 指針, 增加GPIFADR 地址等) , 這些任務(wù)總是在進(jìn)入該狀態(tài)時(shí)執(zhí)行一次。若該狀態(tài)是一個(gè)循環(huán)到自身的DP, 可以編程為在每一個(gè)循環(huán)中重新執(zhí)行控制任務(wù)。

            GPIF的設(shè)計(jì)使用的是Cypress的GPIF Design工具, 可根據(jù)ADC 的時(shí)序和控制要求方便地設(shè)計(jì),設(shè)計(jì)波形如圖4。采用Sing le Read 方式, 每一個(gè)狀態(tài)的持續(xù)時(shí)間可設(shè)置為0~ 256個(gè)IFCLK 個(gè)周期。

            在Status中設(shè)置了一個(gè)DP, 當(dāng)RDY0( INTR )信號(hào)為高時(shí), 跳轉(zhuǎn)到狀態(tài)0 重新下一次數(shù)據(jù)采集; 當(dāng)為低時(shí), 則返回到自身繼續(xù)執(zhí)行。定義好波形后, 由工具欄中的Too ls菜單中的Export to GPIF. c file導(dǎo)出為C語(yǔ)言文件。定義端點(diǎn)2, 6 為輸入端點(diǎn), 對(duì)應(yīng)的FIFO 緩沖區(qū)為雙緩沖區(qū), 保證不會(huì)因?yàn)榫彌_區(qū)中的數(shù)據(jù)沒(méi)有傳送完畢而被覆蓋。每次采集數(shù)據(jù)的高字節(jié)存入端點(diǎn)2緩沖區(qū), 低字節(jié)存入端點(diǎn)6緩沖區(qū)。

            3. 2 驅(qū)動(dòng)程序的設(shè)計(jì)

            該系統(tǒng)需要兩個(gè)驅(qū)動(dòng)程序, 下載固件的驅(qū)動(dòng)程序和功能驅(qū)動(dòng)程序。采用固件從主機(jī)下載的方式,由固件下載驅(qū)動(dòng)程序完成。當(dāng)設(shè)備連接到U SB 總線后, 負(fù)責(zé)把固件程序下載到CY 7C68013的RAM中, 完成重列舉工作, 使內(nèi)核正常工作。主機(jī)根據(jù)其設(shè)置的V ID /PID尋找并安裝功能驅(qū)動(dòng)程序, 從而實(shí)現(xiàn)主機(jī)與設(shè)備的通信。用戶程序與設(shè)備的通信及控制由功能驅(qū)動(dòng)程序負(fù)責(zé)完成。

            驅(qū)動(dòng)程序設(shè)計(jì)采用WDM (W indow s DriveMode)。其引入設(shè)備對(duì)象的概念來(lái)描述一個(gè)設(shè)備,主要包括物理設(shè)備對(duì)象( PDO )、功能設(shè)備對(duì)象( FDO)、過(guò)濾設(shè)備對(duì)象( f ilter DO )。其中, PDO 對(duì)應(yīng)實(shí)際的物理設(shè)備, FDO 和f ilterDO 是相應(yīng)驅(qū)動(dòng)程序的處理對(duì)象。WDM 驅(qū)動(dòng)程序直接操作的不是硬件本身, 而是相應(yīng)的PDO, FDO, 和filter DO。當(dāng)用戶發(fā)出請(qǐng)求時(shí), 操作系統(tǒng)會(huì)將其打包形成一個(gè)IRP結(jié)構(gòu), 并發(fā)送至驅(qū)動(dòng)程序, 通過(guò)識(shí)別IRP 中的設(shè)備對(duì)象來(lái)區(qū)分它是發(fā)送給哪個(gè)設(shè)備。

            USB設(shè)備最大優(yōu)點(diǎn)就是即插即用功能( PnP) ,PnP設(shè)備具有不同的設(shè)備狀態(tài), 當(dāng)它接收到某些PnP IRP時(shí), 其所處的設(shè)備狀態(tài)就會(huì)發(fā)生改變。圖5描述了PnP設(shè)備狀態(tài)及其相應(yīng)的PnP IRP。

            為保證USB設(shè)備連入系統(tǒng)時(shí), W indow s能夠找到并加載與其進(jìn)行通信的設(shè)備驅(qū)動(dòng)程序, 除提供的編譯好的驅(qū)動(dòng)程序外, 還需為其提供一個(gè)設(shè)備信息文件( DIF) , 該文件包含USB 設(shè)備、設(shè)備驅(qū)動(dòng)程序及其安裝過(guò)程的詳細(xì)信息, 如該為設(shè)備使用哪個(gè)驅(qū)動(dòng)、系統(tǒng)注冊(cè)表中應(yīng)存儲(chǔ)哪些信息等, 以確保其硬件設(shè)備能正確地配置和安裝。在U SB 設(shè)備驅(qū)動(dòng)程序安裝完畢后, 該設(shè)備的一些基本信息將被存儲(chǔ)到W indow s系統(tǒng)注冊(cè)表中, 驅(qū)動(dòng)程序可執(zhí)行文件和其DIF也被復(fù)制到指定的系統(tǒng)目錄, 該USB 設(shè)備將出現(xiàn)在W indow s設(shè)備管理器中。

            3. 3 應(yīng)用程序設(shè)計(jì)

            高級(jí)應(yīng)用程序建立在驅(qū)動(dòng)程序之上, 主機(jī)應(yīng)用程序的編寫(xiě)使用VC 編譯環(huán)境中的API函數(shù)實(shí)現(xiàn)。

            應(yīng)用程序的編程方法與串口編程類(lèi)似。首先必須查找設(shè)備, 打開(kāi)設(shè)備的句柄, 然后進(jìn)行讀寫(xiě)和控制操作, 最后是關(guān)閉設(shè)備句柄。為了提高效率,可使用多線程技術(shù)實(shí)現(xiàn)讀寫(xiě)。

            4 結(jié)語(yǔ)

            本文設(shè)計(jì)的用于摩擦實(shí)驗(yàn)機(jī)的USB 數(shù)據(jù)采集系統(tǒng), 采用Cypress FX2系列芯片CY7C68013, 利用其GPIF Master模式的16位數(shù)據(jù)線與兩塊8位數(shù)模轉(zhuǎn)換芯片連接, 準(zhǔn)確地保證了兩路力信號(hào)的同步。該芯片靈活的接口大大簡(jiǎn)化了硬件連接。其固件程序自動(dòng)下載功能可方便地對(duì)固件進(jìn)行修改和調(diào)試。此USB設(shè)備的即插即用特性滿足了該系統(tǒng)便攜式及使用方便的要求。



          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();