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

正文內容

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

2024-11-07 22:53本頁面

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

  

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