freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

精品]基于usb總線的高速數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)-資料下載頁

2024-11-07 22:53本頁面

【導(dǎo)讀】通用串行總線USB是一種新型的微機(jī)總線接口規(guī)范。越多的應(yīng)用于數(shù)據(jù)采集系統(tǒng)中。本文介紹了一種基于USB總線的數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)方法,采用PHILIPS公司的USB接口芯片PDIUSBD12與單片機(jī)AT89C51進(jìn)行通信,并和PC機(jī)通信而編。該系統(tǒng)用傳統(tǒng)的USB總線取代了RS232串行總線,通過對(duì)USB協(xié)議。行了硬件設(shè)計(jì)和軟件編程,并在此設(shè)計(jì)的基礎(chǔ)上給出相應(yīng)的原理圖。編寫USB設(shè)備驅(qū)動(dòng)程序;三是充分了解D12的主要功能特點(diǎn),并編寫出應(yīng)用程序。領(lǐng)悟USB接口的優(yōu)勢(shì)。KEYWORDS:USBbus;datacollection;MCU;fireware;WDM;devicedriveprogram;

  

【正文】 USB接口,允許在眾多可用的微控制器中選擇最合適的作為系統(tǒng)微控制器,允許使用現(xiàn)存的體系結(jié)構(gòu)使固件投資減到最小。這種靈活性減少了開發(fā)時(shí)間 、風(fēng)險(xiǎn)和成本。該器件使開發(fā)成本低且高效的 USB外圍設(shè)備的一種有效途徑。 PDIUSDB12完全符合 ,也能適應(yīng)大多數(shù)設(shè)備類規(guī)范的設(shè)計(jì),如成像類、大容量存儲(chǔ)類、通信類、打印類和人工輸入設(shè)備等。因此, PDIUSBD12非常適合做很多外圍設(shè)備?,F(xiàn)在很多用 SCSI實(shí)現(xiàn)的很多設(shè)備如果用 USB來實(shí)現(xiàn)可以直接降低成本。 PDIUSBD12還集成了 SoftConnect、 GoodLink、可編程時(shí)鐘輸出、低頻晶振和終端電阻等特性。所有這些特性都能在系統(tǒng)實(shí)現(xiàn)時(shí)節(jié)省成本,同時(shí)在外圍設(shè)備上很容易實(shí)現(xiàn)更高級(jí)的 USB功能。 PDIUSBD12固件程序的編寫 USB設(shè)備啟動(dòng)流程如下: 1. USB設(shè)備接入 USB口,發(fā)出連接 USB命令; 2. 主機(jī)發(fā)出讀設(shè)備描述符兩次; 3. 主機(jī)根據(jù)設(shè)備描述符 — 廠商 ID、產(chǎn)品 ID,啟動(dòng)相應(yīng)設(shè)備驅(qū)動(dòng)程序; 4. 設(shè)備驅(qū)動(dòng)程序初始化 USB設(shè)備; ①讀設(shè)備描述符; ②讀配置描述符; ③選擇接口、端點(diǎn)(管道),確定傳輸方式。 USB設(shè)備在正常使用以前,必須由主機(jī)配置設(shè)備。主機(jī)一般會(huì)從 USB設(shè)備獲取配置信息后再確定此設(shè)備有哪些功能。作為配置操作的一部分,主機(jī)會(huì)設(shè)備設(shè)備的配置值,如果必要的話 會(huì)選擇合適的接口備選設(shè)備。在發(fā)出連接 USB命令后,主機(jī)先讀取設(shè)備描述符,然后發(fā)出設(shè)置 USB地址 SETUP包,設(shè)置 USB地址后,進(jìn)行主機(jī)客戶驅(qū)動(dòng)與設(shè)備初始化。其余端點(diǎn)依此類推。在其頭文件里需定義 USB規(guī)范中的各種描述符格式,包括設(shè)備描述表、配置描述表、接口描述表、端點(diǎn)描述表、字符串描述表以及描述表類型。這樣,在發(fā)送配置聯(lián)合描述表時(shí),主機(jī) USBD可以根據(jù)描述類型標(biāo)識(shí)區(qū)分各種分描述表。 固件的文件結(jié)構(gòu) 本數(shù)據(jù)采集系統(tǒng)的固件有著如 下的積木式 結(jié)構(gòu): 圖 31 數(shù)據(jù)采集系統(tǒng)固件 的文件結(jié)構(gòu) 固件設(shè)計(jì)的目標(biāo)就是使 PDIUSBD12在 USB上達(dá)到最大的傳輸速率。外圍設(shè)備可使用PDIUSBD12 在 USB上傳輸數(shù)據(jù),這些設(shè)備的 CPU要忙于處理許多設(shè)備控制和數(shù)據(jù)處理等任務(wù)。PDIUSBD12 的固件設(shè)計(jì)成完全的中斷驅(qū)動(dòng),當(dāng) CPU處理前臺(tái)任務(wù)時(shí), USB的傳輸可在后臺(tái)進(jìn)行,這就確保了最佳的傳輸速率和更好的軟件結(jié)構(gòu),同時(shí)簡化了編程和調(diào)試。 后臺(tái) ISR中斷服務(wù)程序和前臺(tái)主程序循環(huán)之間的數(shù)據(jù)交換通過事件標(biāo)志和數(shù)據(jù)緩沖區(qū)來實(shí)現(xiàn),例如 PDIUSBD12的批量輸出端點(diǎn)可使用循環(huán)的數(shù)據(jù)緩沖區(qū),當(dāng) PDIUSBD12從 USB收到一個(gè)數(shù)據(jù)包,那么就對(duì) CPU產(chǎn)生一個(gè)中斷請(qǐng)求, CPU立即響應(yīng)中斷在 ISR中固件將數(shù)據(jù)包從PDIUSBD12內(nèi)部緩沖區(qū)移到循環(huán)數(shù)據(jù)緩沖區(qū),并在隨后清零 PDIUSBD12的內(nèi)部緩沖區(qū),以使能接收新的數(shù)據(jù)包 CPU可以繼續(xù)它當(dāng)前的前臺(tái)任務(wù)直到完成然后返回到主循環(huán)檢查循環(huán)緩沖區(qū)內(nèi)是否有新的數(shù)據(jù)并開始其它的前臺(tái)任務(wù)。 圖 32 數(shù)據(jù)采集系統(tǒng)的固件 結(jié)構(gòu) 由于這種結(jié)構(gòu),主循環(huán)不關(guān)心數(shù)據(jù)是來自 USB串口還是并口,它只檢查循環(huán)緩沖區(qū)內(nèi)需要處理的新數(shù)據(jù)。這樣主循環(huán)程序?qū)W⒂跀?shù)據(jù)的處理,而 ISR能夠以最大可能的 速度進(jìn)行數(shù)據(jù)的傳輸。相似的控制端點(diǎn)在數(shù)據(jù)包處理時(shí)采用了同樣的概念。 ISR接收和保存數(shù)據(jù)緩沖區(qū)中的控制傳輸并設(shè)置相應(yīng)的標(biāo)志寄存器。主循環(huán)向協(xié)議處理程序發(fā)出請(qǐng)求。由于所有的標(biāo)準(zhǔn)器件級(jí)別和廠商請(qǐng)求都是在協(xié)議處理程序中進(jìn)行處理, ISR得以保持它的效率。 硬件提取層 :這是固件中的最底層代碼,它執(zhí)行對(duì) D12和硬件 I/O相關(guān)訪問。 主循環(huán):發(fā)送 USB請(qǐng)求、讀入數(shù)據(jù)、控制采集通道和處理USB總線事件等等 標(biāo)準(zhǔn)請(qǐng)求 廠商請(qǐng)求 中斷服務(wù)程序 PDIUSBD12 命令接口 硬件提取層 PDIUSBD12命令接口 :為了進(jìn)一步簡化 PDIUSBD12的編程,固件定義了一套壓縮了所有訪問 PDIUSBD12功能的命令接口,以對(duì) PDIUSBD12芯片進(jìn)行操 作。 中斷服務(wù)程序 :這部分代碼的處理由 PDIUSBD12產(chǎn)生的中斷,在中斷服務(wù)程序中,它將數(shù)據(jù)從 PDIUSBD12的內(nèi)部 FIFO取回到 CPU存儲(chǔ)器并建立正確的事件標(biāo)志,以通知主循環(huán)程序進(jìn)行處理。 ISR通過設(shè)定事件標(biāo)志“ EPPFLAGS”和 Setup包數(shù)據(jù)緩沖區(qū)“ CONROL_XFER”與主循環(huán)進(jìn)行通信。 主循環(huán) :主循環(huán)在初始化完單片機(jī) CPU和 PDIUSBD12芯片后,檢查事件標(biāo)志,并進(jìn)入對(duì)應(yīng)的子程序進(jìn)行進(jìn)一步的處理,在開發(fā)套件中,它還包含人機(jī)接口的代碼。 協(xié)議層 :協(xié)議層處理標(biāo)準(zhǔn)的 USB器件請(qǐng)求和特殊的廠商請(qǐng)求。 固件的編程實(shí)現(xiàn) 底層函數(shù) 最底層為兩個(gè)面向硬件電路的函數(shù) :outportb( ), inportb( ),用以完成 CPU和 D12之間的數(shù)據(jù)傳輸,這是所有其它函數(shù)的基 礎(chǔ)。具體代碼如下 : void outportb(unsigned char port, unsigned char val) { unsigned char xdata *ext_address; ext_address=0xff00 + port; *ext_address = val; } unsigned char inportb(unsigned char port) { unsigned char c; unsigned char xdata *ext_address; ext_address=0xff00 + port; c = *ext_address ; return c; } 命令接口 在 D12的數(shù)據(jù)手冊(cè)中定義了一套壓縮了所有訪問 PDIUSBD12功能的命令集,命令 接口部分就是將各命令用函數(shù)的形式加以實(shí)現(xiàn)。對(duì)應(yīng)的函數(shù)主要有 : void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable); //設(shè)置地址使能 void D12_SetEndpointEnable(unsigned char bEnable); //設(shè)置端點(diǎn)使能 void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv); //設(shè)置模式 unsigned short D12_ReadInterruptRegister(void); //讀中斷寄存器 unsigned char D12_SelectEndpoint(unsigned char bEndp); //選擇端點(diǎn) unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp); //讀最后處理狀態(tài) unsigned char D12_ReadEndpointStatus(unsigned char bEndp); //讀端點(diǎn) 狀態(tài) void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled); //設(shè)置端點(diǎn) 狀態(tài) void D12_SendResume(void); //發(fā)送恢復(fù) unsigned short D12_ReadCurrentFrameNumber(void); //讀取當(dāng)前幀號(hào) unsigned short D12_ReadChipID(void); //讀 D12芯片 ID unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf); //讀取端點(diǎn)數(shù)據(jù) unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char * buf); //寫端點(diǎn)數(shù)據(jù) void D12_AcknowledgeEndpoint(unsigned char endp); //設(shè)置端點(diǎn)應(yīng)答 中斷服務(wù)程序 這部分代碼處理由 PDIUSBDI2產(chǎn)生的中斷, ISR從 PDIUSBD12收集數(shù)據(jù),當(dāng)數(shù) 據(jù)充足時(shí),通知主循環(huán)已經(jīng)準(zhǔn)備好等待處理。它將數(shù)據(jù)從 PDIUSBDI2的內(nèi)部 FIFO取回到 CPU存儲(chǔ)器,并建立正確的事件標(biāo)志以通知主循環(huán)程序。在 ISR函數(shù)的 入口固件使用ReadInterruptRegister()來決定中斷源,根據(jù)中斷源進(jìn)入相應(yīng)的子程序進(jìn)行 處理。 中斷服務(wù)處理的部分代碼如下 : //USB中斷處理 usb_isr() interrupt 0 { DISABLE; fn_usb_isr(); ENABLE; } void fn_usb_isr() { unsigned int i_st; = 1; i_st = D12_ReadInterruptRegister(); if(i_st != 0) { if(i_st amp。 D12_INT_BUSRESET) { bus_reset(); = 1; } if(i_st amp。 D12_INT_EOT) dma_eot(); if(i_st amp。 D12_INT_SUSPENDCHANGE) = 1; if(i_st amp。 D12_INT_ENDP0IN) ep0_txdone(); if(i_st amp。 D12_INT_ENDP0OUT) ep0_rxdone(); if(i_st amp。 D12_INT_ENDP1IN) ep1_txdone(); if(i_st amp。 D12_INT_ENDP1OUT) ep1_rxdone(); if(i_st amp。 D12_INT_ENDP2IN) main_txdone(); if(i_st amp。 D12_INT_ENDP2OUT) main_rxdone(); } = 0; } //A/D轉(zhuǎn)換中斷處理 adc_isr() interrupt 1 { DISABLE; = 1; ENABLE; } 主循環(huán) 主循環(huán)檢查事件標(biāo)志并進(jìn)入對(duì)應(yīng)的子程序進(jìn)行進(jìn)一步的處理。在主循環(huán)中, MCU首先對(duì)其所有端口、存儲(chǔ)區(qū)、定時(shí)器和中斷服務(wù)程序進(jìn)行初始化,之后 MCU將重 新連 接 USB,包括將 Softe Connect寄存器設(shè)置為 ON。這些過程是很重要的,它確保了在 MCU準(zhǔn)備好服務(wù) D12之前, D12不會(huì)進(jìn)行操作。初始化后,進(jìn)入循環(huán),輪詢各種狀態(tài)。當(dāng)輪詢到了檢測(cè)建立包時(shí),它確認(rèn)建立標(biāo)志在之前是否被中斷服務(wù)程序所置位。如果建立標(biāo) 志被置位,它將向協(xié)議層發(fā)送一個(gè)器件請(qǐng)求進(jìn)行處理。 /* 數(shù)據(jù)采集子程序 */ void adc_handler(void) { unsigned char ADC_DATA; ADC_DATA=IN_PORT; D12_WriteEndpoint(3, 1, amp。ADC_DATA); IN_PORT=0x00; if() { DISABLE; = 0; ENABLE; ADC_IN_ID =0x7FF8+GenEpBuf[3]; } } /* 主程序循環(huán) */ while(TRUE){ if(){ //數(shù)據(jù)采集處理 DISABLE; = 0; ENABLE; if() adc_handler(); } if () { //設(shè)備復(fù)位中斷處理 DISABLE; = 0; ENABLE; D12SUSPD = 1; } if () { //掛起改變中斷處理 DISABLE; = 0; ENABLE; if(D12SUSPD == 1) { //掛器處理 D12SUSPD = 0; P0 = 0xFF; P1 = 0xFF; P2 = 0xFF; P3 = 0xFF; D12SUSPD = 1; PCON |= 0x02; while (1); } } if (){ //Setup包中斷處理 DISABLE; = 0; ENABLE; control_handler(); D12SUSPD = 1; } } // End Main Loop
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1