基于51單片機(jī)的USB鍵盤設(shè)計與實(shí)現(xiàn)教材_第1頁
基于51單片機(jī)的USB鍵盤設(shè)計與實(shí)現(xiàn)教材_第2頁
基于51單片機(jī)的USB鍵盤設(shè)計與實(shí)現(xiàn)教材_第3頁
基于51單片機(jī)的USB鍵盤設(shè)計與實(shí)現(xiàn)教材_第4頁
基于51單片機(jī)的USB鍵盤設(shè)計與實(shí)現(xiàn)教材_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、三江學(xué)院 本科生畢業(yè)設(shè)計(論文) 題 目 基于 51 單片機(jī)的 USB鍵盤設(shè)計與實(shí)現(xiàn) 高職院 院(系) 電氣工程及其自動化 專業(yè) 學(xué)生姓名 梁邱一學(xué)號 G105071013 指導(dǎo)教師 孫傳峰職稱 講師 指導(dǎo)教師工作單位三江學(xué)院 起訖日期 2013 年 12 月 10 日至 2014 年 4 月 12 日 摘要 隨著計算機(jī)技術(shù)的不斷更新和多媒體技術(shù)的快速發(fā)展 ,傳統(tǒng)的計算機(jī)外設(shè)接 口因?yàn)榇嬖谠S多缺點(diǎn)已經(jīng)不能適應(yīng)計算機(jī)的發(fā)展需要。比起傳統(tǒng)的AT,PS/2,串 口,通用串行總線 USB,具有速度快 ,使用方便靈活 ,易于擴(kuò)展,支持即插即用 ,成本低 廉等一系列優(yōu)點(diǎn) ,得到了廣泛的應(yīng)用。 本論文闡述了

2、 51系列單片機(jī)和 USB 的相關(guān)內(nèi)容,詳細(xì)介紹了系統(tǒng)的一些功能 設(shè)計,包括硬件設(shè)計和軟件設(shè)計。在程序調(diào)試期間用簡單的串口通信電路,通過 串口調(diào)試助手掌握了 USB 指令的傳輸過程,這對整個方案的設(shè)計起到了很大的指 導(dǎo)作用。論文以單片機(jī)最小系統(tǒng)配合模擬鍵盤組成的 USB 鍵盤硬件系統(tǒng),通過對 D12 芯片的學(xué)習(xí)與探索,在其基本命令接口的支持下,結(jié)合硬件進(jìn)行相應(yīng)的固件 程序設(shè)計,使其在 USB 協(xié)議下,實(shí)現(xiàn) USB 模塊與 PC的數(shù)據(jù)通信,完成 USB 鍵 盤的功能模擬。 總結(jié)論文研究工作有闡述 USB 總線的原理、 對本設(shè)計的系統(tǒng)要求作出了分析、 根據(jù)要求選定元件和具體編程方案、針對系統(tǒng)所要實(shí)

3、現(xiàn)的功能對相關(guān)芯片作了詳 細(xì)介紹以及在硬件部分設(shè)計了原理圖。 關(guān)鍵詞 :USB;D12;PC Abstract With the rapid development of computer technology and multimedia technology constantly updated, traditional computer peripheral interface because there are many shortcomings have been unable to meet the development needs of the computer.Compare

4、d to traditional AT, PS / 2, serial, Universal Serial Bus USB, with fast, flexible and easy to use, easy to expand, support Plug and Play, a series of advantages, such as low cost, has been widely used. This paper describes the 51 series and USB related content, detailing some of the features of the

5、 system design, including hardware and software design.During debugging a simple serial communication circuit, through the serial port debugging assistant master USB transfer instructions, which designed the entire program has played a significant role in guiding.Thesis smallest single-chip system c

6、onsisting of analog keyboard with a USB keyboard hardware system, by learning and exploration D12 chips, with the support of its basic command interface, in conjunction with the corresponding hardware firmware design, making it in the USB protocol, USB module data communication with the PC, the USB

7、keyboard to complete the functional simulation. This paper summarizes research work has elaborated the principle of the USB bus, the system is designed to require the analysis, components and solutions based on the specific requirements of the selected programming for the system to achieve the funct

8、ion of the relevant chips are described in detail in the hardware part of the design as well as the principle of Figure. Keywords:USB;D12;PC II 目錄 第一章 緒 論. 1 1.1 PC 接口簡介 1 1.2 USB 接口分析 1 1.3 USB 器件的選擇 1 第二章系統(tǒng)分析 . 3 2.1 USB 總線簡介 3 2.2 USB 技術(shù)指標(biāo) 3 2.3 USB 系統(tǒng)構(gòu)成 4 第 3 章系統(tǒng)硬件設(shè)計 6 3.1 STC89C52單片機(jī)簡介及最小系統(tǒng) . 6

9、 3.1.1 單片機(jī)發(fā)展概況及發(fā)展方向 6 3.1.2 單片機(jī)特點(diǎn)及結(jié)構(gòu) 6 3.1.3 復(fù)位電路設(shè)計 8 3.1.4 單片機(jī)最小系統(tǒng)硬件設(shè)計 9 3.2 PDIUSBD12 接口芯片設(shè)計 9 3.2.1 USB 接口芯片簡介 9 3.2.2 USB 接口芯片引腳配置 11 3.2.3 USB 接口芯片硬件設(shè)計 14 3.2.4 USB 接口芯片端點(diǎn)描述 14 3.2.5 USB 接口芯片命令 16 3.3 USB 鍵盤硬件設(shè)計 18 第 4 章系統(tǒng)軟件設(shè)計 19 4.1 固件編程的實(shí)現(xiàn) 20 4.1.1 USB 接口芯片工作流程圖 20 4.1.2 PDIUSBD12 命令接口 PDIUSB

10、D12.C . 21 4.1.3 USB 中斷服務(wù)程序 USBISR.C 21 4.1.4 按鍵處理流程圖 21 4.1.5 USB 鍵盤處理程序 - KEY.C . 22 4.1.6 USB 主循環(huán)程序 MAIN .C 23 4.2 實(shí)物演示 25 結(jié)束語. 27 致 謝 . 28 參考文獻(xiàn) . 29 附錄 A 30 附錄 B 37 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) 第一章 緒 論 1.1 PC接口簡介 PC中的接口有兩類:串行接口和并行接口。計算機(jī)內(nèi)部總線,如 CPU與存儲器之間 勻采用并行接口,這樣速度快;但外設(shè)卻以串行接口比較占優(yōu)勢。傳統(tǒng)的打印機(jī)接口為 并行接口。 SCSI

11、標(biāo)準(zhǔn)的全名是小型設(shè)備通用接口標(biāo)準(zhǔn),其傳輸速率為 10M ,早期的掃描 儀一般使用此接口,硬盤與主機(jī)的聯(lián)接也使用這種接口。串行接口出現(xiàn)最早,使用最廣 的RS232接口,但其速度太慢,現(xiàn)在已經(jīng)逐漸被淘汰。 USB接口和 IEEE1394接口是兩種 速度比較高的串行接口,還有局域網(wǎng)中的以太網(wǎng)接口,它們具有較廣闊的發(fā)展前景和應(yīng) 用潛力。 USB適用于低檔外設(shè)與主機(jī)之間的高速數(shù)據(jù)傳輸, USB1.1可以達(dá)到 1.5Mbps或 12Mbps的傳輸率,而1394更是可達(dá) 100200400Mbps。USB2.0將速度定位在 480Mbps, 而IEEE1394也推出了1394b 1.3.1 版草案,速度從

12、800Mbps起步,最高可達(dá) 3.2Gbps。局 局域中用得最多的是以太網(wǎng)接口,速度可達(dá) 100Mbps,當(dāng)使用光纖傳輸時,速度可達(dá) 1000Mbps。 1.2 USB 接口分析 通用串行總線 ( Universal Serial Bus USB),是一種快速、靈活的總線接口。與其它 通信接口比較, USB接口的最大特點(diǎn)是易于使用。作為一種高速總線接口, USB適用于 多種設(shè)備,如數(shù)碼相機(jī)、 MP3播放機(jī)、高速數(shù)據(jù)采集設(shè)備等。易于使用還表現(xiàn)在 USB接 口支持熱插拔,并且所有的配置過程都由系統(tǒng)自動完成,無需用戶干預(yù)。USB接口支持 1.5Mb/s(低速) 、 12Mb/s(全速) 和高達(dá) 48

13、0Mb/s的數(shù)據(jù)傳輸速率,扣除用于總線狀態(tài)、控 制和錯誤監(jiān)測等的數(shù)據(jù)傳輸, USB的最大理論傳輸速率仍達(dá) 1.2Mb/s或9.6Mb/s,遠(yuǎn)高于 一般的串行總線接口。 USB接口芯片價格低廉,一個支持 USB 1.1 規(guī)范的 USB接口芯片 價格大多在人民幣 1530元之間,這也大大促進(jìn) USB設(shè)備的開發(fā)與應(yīng)用。 1.3 USB 器件的選擇 在進(jìn)行一個 USB設(shè)備開發(fā)之前,首先要根據(jù)具體使用要求選擇合適的 USB控制器。 目前,市場上供應(yīng)的 USB控制器主要有兩種:帶 USB接口的單片機(jī)( MCU )或純粹的 USB接口芯片。帶 USB接口的單片機(jī)從應(yīng)用上又可以分成兩類,一類是從底層設(shè)計專用

14、于USB控制的單片機(jī)另一類是增加了 USB接口的普通單片機(jī),如 Cypress公司的 EZ USB( 基于8051),選擇這類 USB控制器的最大好處在于開發(fā)者對系統(tǒng)結(jié)構(gòu)和指令集非 常熟悉,開發(fā)工具簡單,但對于簡單或低成本系統(tǒng)。但價格因素也是在實(shí)際選擇過程中 需要考慮的因素。純粹的 USB 接口芯片僅處理 USB通信,必須有一個外部微處理器來 進(jìn)行協(xié)議處理和數(shù)據(jù)交換。典型產(chǎn)品有 Philips公司的 PDIUSBD11(I2C接口)、 PDIUSBD12( 并行接口), NS公司的 USBN9603/9604( 并行接口), NetChip公司的 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文)

15、NET2888 等。 USB接口芯片的主要特點(diǎn)是價格便宜、接口方便、可靠性高,尤其適合 于產(chǎn)品的改型設(shè)計(硬件上僅需對并行總線和中斷進(jìn)行改動,軟件則需要增加微處理器 的USB中斷處理和數(shù)據(jù)交換程序、 PC機(jī)的USB接口通信程序, 無需對原有產(chǎn)品系統(tǒng)結(jié)構(gòu) 作很大的改動)。 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) 第二章 系統(tǒng)分析 2.1 USB總線簡介 USB是一種支持在 USB 主機(jī)和 USB 設(shè)備之間進(jìn)行串行數(shù)據(jù)傳輸?shù)耐ㄐ艆f(xié)議。 主機(jī) 作為總線的主叫方,采用兩種信令模式:全速模式 12Mb/s 和低速模 1.5Mb/s。USB 使 用四種數(shù)據(jù)傳輸方式:控制傳輸( control)、中斷

16、傳輸( interrupt)、批量傳輸( bulk)及 等時傳輸( isochronous)。 Intel 公司開發(fā)的通用串行總線架構(gòu) (USB) 的目的主要基于以下三方面考慮: 一、計算機(jī)與電話之間的連接 顯然用計算機(jī)來進(jìn)行計算機(jī)通信將是下一代計算機(jī)基本的應(yīng)用。 機(jī)器和人們的數(shù)據(jù) 交互流動需要一個廣泛而又便宜的連通網(wǎng)絡(luò)。然而,由于目前產(chǎn)業(yè)間的相互獨(dú)立發(fā)展 , 尚未建立統(tǒng)一標(biāo)準(zhǔn) ,而 USB 則可以廣泛的連接計算機(jī)和電話。 二、易用性 眾所周知, PC 機(jī)的改裝是極不靈活的。對用戶友好的圖形化接口和一些軟硬件機(jī) 制的結(jié)合,加上新一代總線結(jié)構(gòu)使得計算機(jī)的沖突大量減少,且易于改裝。但以終端用 戶的

17、眼光來看, PC 機(jī)的輸入/輸出,如串行 /并行端口、鍵盤、鼠標(biāo)、操縱桿接口等, 均還沒有達(dá)到即插即用的特性, USB 正是在這種情況下問世的。 三、端口擴(kuò)充 外圍設(shè)備的添加總是被相當(dāng)有限的端口數(shù)目限制著。缺少一個雙向、價廉、與外設(shè) 連接的中低速的總線,限制了外圍設(shè)備 (如電話/ 電傳/調(diào)制解調(diào)器的適配器、掃描儀、 鍵盤、PDA ) 的開發(fā)。 現(xiàn)有的連接只可對極少設(shè)備進(jìn)行優(yōu)化, 對于 PC 機(jī)的新的功能部件 的添加需定義一個新的接口來滿足上述需要, USB 就應(yīng)運(yùn)而生。 它是快速、雙向、同步、 動態(tài)連接且價格低廉的串行接口,可以滿足 PC 機(jī)的發(fā)展現(xiàn)狀和未來需要。碼主要存儲 在單片機(jī)中,通過單

18、片機(jī)中的軟件代碼運(yùn)行后,通過各個管腳的控制外圍輔助電路的運(yùn) 行以實(shí)現(xiàn)系統(tǒng)的功能。復(fù)位電路是保證系統(tǒng)安全運(yùn)行的基礎(chǔ),由于單片機(jī)的運(yùn)行環(huán)境無 法確定,無法保證單片機(jī)在長時間的運(yùn)行過程中能夠一直保證系統(tǒng)的穩(wěn)定性,復(fù)位電路 就是在單片機(jī)無法正常運(yùn)行后,軟復(fù)位無法進(jìn)行復(fù)位的情況下,能夠保證系統(tǒng)能夠重新 啟動 2.2 USB技術(shù)指標(biāo) USB最大的特點(diǎn)是支持熱插拔( Hot plug)和即插即用 ( Plug TL0=(65536-Fclk/1000/12*5+15)%256; / if(!KeyCanChange)return; / 如果正在處理按鍵,則不再掃描鍵盤 / 開始鍵盤掃描 / 保存按鍵狀態(tài)到當(dāng)

19、前按鍵情況 / KeyCurrent 總共有 8 個 bit / 當(dāng)某個開關(guān)按下時,對應(yīng)的 bit 為 1 KeyCurrent=GetKeyValue(); / 讀取鍵值, GetKeyValue()其實(shí)是個宏,不是函數(shù), / 這里故意寫成函數(shù)的樣子,美觀。它的定義在 /key.h 文件中 if(KeyCurrent!=KeyOld) / 如果兩次值不等,說明按鍵情況發(fā)生了改變 KeyNoChangedTime=0; / 鍵盤按下時間為 0 KeyOld=KeyCurrent ; / return; / 返回 else KeyNoChangedTime+; 保存當(dāng)前按鍵情況 / 按下時間累計

20、 if( KeyNoChangedTime=1) / 如果按下時間足夠 22 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) KeyNoChangedTime=1; KeyPress=KeyOld; / 保存按鍵 KeyDown|=(KeyLast) / 求出新按下的鍵 KeyUp|=KeyLast / 求出新釋放的鍵 KeyLast=KeyPress; / 保存當(dāng)前按鍵情況 4.1.6USB主循環(huán)程序 MAIN .C 主函數(shù)部分程序代碼: /* 函數(shù)功能:主函數(shù)。 入口參數(shù):無。 返 回:無。 備 注:無。 */ void main(void) / 主函數(shù) uint16 id; uint8 I

21、nterruptSource; EA=1; / 打開中斷 InitKeyboard(); / 初始化按鍵 id=D12ReadID(); Prints(Your D12 chips ID is: ); PrintShortIntHex(id); if(id=0 x1012) Prints(. ID is correct! Congratulations!rnrn); else Prints(. ID is incorrect! What a pity!rnrn); 23 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) UsbDisconnect(); / 先斷開 USB連接 UsbConnect

22、(); / 將 USB連接上 ConfigValue=0; / 配置值初始化為 0 while(1) / 死循環(huán) if(D12GetIntPin()=0) / 如果有中斷發(fā)生 D12WriteCommand(READ_INTERRUPT_REGISTER); / 寫讀中 斷寄 存器的命令 總線掛起中斷處理 InterruptSource=D12ReadByte(); / 讀回第一字節(jié)的中斷寄存器 / 總線復(fù)位中斷處理 / 端點(diǎn) 0 輸出中斷處理 / 端點(diǎn) 0 輸入中斷處理 / 端點(diǎn) 1 輸出中斷處理 / 端點(diǎn) 1 輸入中斷處理 / 端點(diǎn) 2 輸出中斷處理 / 端點(diǎn) 2 輸入中斷處理 if(In

23、terruptSource / if(InterruptSource if(InterruptSource if(InterruptSource if(InterruptSource if(InterruptSource if(InterruptSource if(InterruptSource if(ConfigValue!=0) / 如果已經(jīng)設(shè)置為非 0 的配置,則可以返回報告數(shù)據(jù) if(!Ep1InIsBusy) / 如果端點(diǎn) 1 輸入沒有處于忙狀態(tài),則可以發(fā)送數(shù) 據(jù) KeyCanChange=0; / 禁止按鍵掃描 if(KeyUp|KeyDown) / 如果有按鍵事件發(fā)生 SendR

24、eport(); / 則返回報告 KeyCanChange=1; / 允許按鍵掃描 程序說明: 24 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) 如果單片機(jī)檢測到按鍵按下的信息,并根據(jù)相應(yīng)的模式發(fā)送按鍵碼, USB 接口芯 片如果出于非忙的狀態(tài),自動將處理好的數(shù)據(jù)包發(fā)往 PC 機(jī),順利實(shí)現(xiàn)一次按鍵過程。 前文指出, PDIUSBD12 的 技術(shù)可提供良好的 USB連接指示。在枚舉中 LED 指示 根據(jù)通信的狀況間歇閃爍。當(dāng) PDIUSBD12 成功地枚舉和配置后 LED 指示將一直點(diǎn)亮, 隨后與 PDIUSBD12 之間成功的傳輸 (帶應(yīng)答)將關(guān)閉 LED,處于掛起狀態(tài)時, LED 將 會關(guān)

25、閉。該特性為 USB 器件,集線器和 USB 通信狀態(tài)提供了用戶友好的指示。作為一 個診斷工具,它對隔離故障的設(shè)備是很有用的。從系統(tǒng)測試中也可以看見該指示 LED 間歇閃爍,很好的驗(yàn)證了這一特性。 4.2 實(shí)物演示 25 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) 將 USB 插入電腦 , 看到 USB 指示燈閃爍 , 說明連接正常 , 打開記事本 , 任意按下相應(yīng) 的獨(dú)立開關(guān) , 模擬電腦鍵盤下的鍵值 ,在記事本中成功的顯示了相應(yīng)的按鍵鍵值 , 即 USB 與電腦通訊成功 . 26 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) 結(jié)束語 本科畢業(yè)設(shè)計是對大學(xué)兩年年來所學(xué)專業(yè)知識的整體考察,

26、也是對自己綜合能力的 一次很好的評估。掌握了基于 51單片機(jī)和 PDIUSBD12 芯片的 USB 鍵盤設(shè)計與實(shí)現(xiàn), 熟悉了 USB 相關(guān)協(xié)議,為以后的深入學(xué)習(xí)奠定了良好的基礎(chǔ)。編程所采用的軟件開發(fā) 平臺是 Keil uVision4 ,開發(fā)語言是 C 語言,硬件調(diào)試電路手工焊接,可操作性好。雖然 C 語言和開發(fā)環(huán)境曾經(jīng)都學(xué)習(xí)并使用過, 但應(yīng)用于這次的畢業(yè)設(shè)計才發(fā)現(xiàn)自己掌握的還 不夠熟練。在老師的悉心指導(dǎo)下,自己查找資料、動手練習(xí),在順利完成畢設(shè)任務(wù)的同 時,對單片機(jī) C 語言和 USB 協(xié)議的認(rèn)識和掌握水平也上了一個新的臺階。 該論文闡述了 51系列單片機(jī)和 USB 的相關(guān)內(nèi)容,詳細(xì)介紹了系

27、統(tǒng)的一些功能設(shè)計, 包括硬件設(shè)計和軟件設(shè)計。在程序調(diào)試期間用簡單的串口通信電路,通過串口調(diào)試助手 掌握了 USB 指令的傳輸過程,這對整個方案的設(shè)計起到了很大的指導(dǎo)作用?,F(xiàn)總結(jié)論 文研究工作如下:(1)闡述了 USB 總線的原理;(2)對本設(shè)計的系統(tǒng)要求作出了分析, 根據(jù)要求選定元件和具體編程方案; ( 3)針對系統(tǒng)所要實(shí)現(xiàn)的功能對相關(guān)芯片作了詳細(xì) 介紹,特別是對 Philips 公司的 PDIUSBD12 芯片給出了具體的描述; (4)在硬件部分設(shè) 計了原理圖,對單片機(jī)控制電路和 USB 接口芯片及其外圍給出了 Protel 電路圖,在軟 件部分設(shè)計了采用了結(jié)構(gòu)化的程序思想。 從系統(tǒng)演示的實(shí)

28、際情況來看,本設(shè)計雖然實(shí)現(xiàn)了基本功能,但還有很多功能不是很 完備,希望可以在今后的學(xué)習(xí)和工作中去完善。 27 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) 致謝 大學(xué)生活也已漸漸到了尾聲,此次論文的寫作從開題、查閱資料、分析設(shè)計到最 后全部完成,也用了 4 個多月的時間。在此期間得到了老師和同學(xué)的幫助,我要感謝他 們對我的幫助。 這次畢業(yè)論文設(shè)計中,我的指導(dǎo)老師對我的關(guān)心和支持及其重要。在論文的開題、 大綱確立和最后的成文過程中,老師悉心指導(dǎo)并幫助我,使論文才能順利的完成。孫老 師嚴(yán)謹(jǐn)?shù)慕虒W(xué)方法、積極的工作態(tài)度對我有著很大的鼓勵 每次遇到難題的時候,我最先做的就是向?qū)O老師尋求幫助,而孫老師每次

29、不管忙或 閑,都會通過郵箱電話的形式來幫助我,然后幫我解決問題。老師平日里工作繁多,但 我做畢業(yè)設(shè)計的每個階段, 從選題到查閱資料, 論文提綱的確定, 中間的無數(shù)次的修改, 最后論文格式調(diào)整等各個環(huán)節(jié)中都給予了我細(xì)心的指導(dǎo)。這幾個月以來,孫老師一直指 導(dǎo)我完成畢業(yè)設(shè)計,最后我再次對我的指導(dǎo)老師表示感謝! 28 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) 參考文獻(xiàn) 1 盧超。單片機(jī)與 PC 機(jī)的通信設(shè)計 J. 工礦自動化 ,2007-5. 2 胡曉軍 . USB 接口開發(fā)技術(shù) M. 西安 : 西安電子科技大學(xué)出版社, 2005 3 楊代華,葉敦范,王典洪等 .單片機(jī)原理及應(yīng)用 M. 武漢:中國

30、地質(zhì)大學(xué)出版社, 2002 4 陳再清。微機(jī)單片機(jī)通信淺談 J. 電氣時代 ,2001-12. 5 張念淮 . USB 總線接口開發(fā)指南 M. 北京:國防工業(yè)出版社, 1999 6 路永坤 . 基于 USB 接口的數(shù)據(jù)采集模塊的設(shè)計與實(shí)現(xiàn) J. 自動化儀表, 2005, (2) 7 馬忠梅,馬巖,張凱等 . 單片機(jī)的 C語言應(yīng)用程序設(shè)計 M. 北京: 北京航空航天大學(xué)出版社, 1996 8 董建國 , 戚云軍 , 何運(yùn)蘭 . 基于 USB 總線的 PC 機(jī)與單片機(jī)的通信 J. 信息技術(shù) ,2003-11. 9 徐振立 , 陶樂仁 , 等。在 VB 平臺上開發(fā)的太陽能噴射制冷實(shí)驗(yàn)臺測控系統(tǒng) J.

31、 微計算機(jī)信息, 2007,23(7-1). 10 李華. MCS-51 系列單片機(jī)使用接口技術(shù) M. 北京: 北京航空航天大學(xué)出版社, 2000 11 史波,田凱。通用串行總線 USB 技術(shù)概述 J. 信息技術(shù), 2001(4). 12 Chris Cant.Windows WDM 設(shè)備驅(qū)動程序開發(fā)指南 M.西安 : 西安電子科技大學(xué)出版社, 2000 29 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) 附錄 A 4.1.2 PDIUSBD12 命令接口 PDIUSBD12.C /* 函數(shù)功能: D12 寫命令。 入口參數(shù): Command:一字節(jié)命令。 返 回:無。 備 注:無。 */ v

32、oid D12WriteCommand(uint8 Command) D12SetCommandAddr(); / 設(shè)置為命令地址 D12ClrWr(); /WR 置低 D12SetPortOut(); / 將數(shù)據(jù)口設(shè)置為輸出狀態(tài)(注意這里為空宏,移植時可能有用) D12SetData(Command) ; / 輸出命令到數(shù)據(jù)口上 D12SetWr(); /WR 置高 D12SetPortIn(); / 將數(shù)據(jù)口設(shè)置為輸入狀態(tài),以備后面輸入使用 / End of function/ /* 函數(shù)功能:讀一字節(jié) D12 數(shù)據(jù)。 入口參數(shù):無。 返 回:讀回的一字節(jié)。 備 注:無。 */ uint8

33、 D12ReadByte(void) uint8 temp; D12SetDataAddr(); / 設(shè)置為數(shù)據(jù)地址 D12ClrRd(); /RD 置低 temp=D12GetData(); / 讀回數(shù)據(jù) D12SetRd(); /RD 置高 return temp; / 返回讀到數(shù)據(jù) / End of function/ 30 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) /* 函數(shù)功能:讀 D12 的 ID。 入口參數(shù):無。 返回:D12 的 ID。 備 注:無。 */ uint16 D12ReadID(void) uint16 id; D12WriteCommand(Read_ID);

34、 / 寫讀 ID 命令 id=D12ReadByte(); / 讀回 ID 號低字節(jié) id|=(uint16)D12ReadByte()Len) / 如果要讀的字節(jié)數(shù)比實(shí)際接收到的數(shù)據(jù)長 j=Len; / 則只讀指定的長度數(shù)據(jù) #ifdef DEBUG1 / 如果定義了 DEBUG1 ,則需要顯示調(diào)試信息 Prints( 讀端點(diǎn) ); PrintLongInt(Endp/2); / 端點(diǎn)號。由于 D12 特殊的端點(diǎn)組織形式, /這里的 0 和 1分別表示端點(diǎn) 0 的輸出和輸入; /而 2、3分別表示端點(diǎn) 1 的輸出和輸入; /4、5分別表示端點(diǎn) 2 的輸出和輸入。 /因此要除以 2 才顯示對應(yīng)

35、的端點(diǎn)。 Prints( 緩沖區(qū) ); PrintLongInt(j); / 實(shí)際讀取的字節(jié)數(shù) Prints( 字節(jié)。 rn); #endif for(i=0;ij;i+) 33 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) / 這里不直接調(diào)用讀一字節(jié)的函數(shù),而直接在這里模擬時序,可以節(jié)省時間 D12ClrRd(); / RD 置低 *(Buf+i)=D12GetData(); / 讀一字節(jié)數(shù)據(jù) D12SetRd(); / RD 置高 #ifdef DEBUG1 PrintHex(*(Buf+i); / 如果需要顯示調(diào)試信息,則顯示讀到的數(shù)據(jù) if(i+1)%16)=0)Prints(rn);

36、 / 每 16 字節(jié)換行一次 #endif #ifdef DEBUG1 if(j%16)!=0)Prints(rn); / 換行。 #endif return j; / 返回實(shí)際讀取的字節(jié)數(shù)。 / End of function/ /* 函數(shù)功能:使能發(fā)送端點(diǎn)緩沖區(qū)數(shù)據(jù)有效的函數(shù)。 入口參數(shù):無。 返 回:無。 備 注:只有使用該函數(shù)使能發(fā)送端點(diǎn)數(shù)據(jù)有效之后,數(shù)據(jù)才能發(fā)送出去。 */ void D12ValidateBuffer(void) D12WriteCommand(D12_VALIDATE_BUFFER); / End of function/ /* 函數(shù)功能:將數(shù)據(jù)寫入端點(diǎn)緩沖區(qū)函數(shù)

37、。 入口參數(shù): Endp:端點(diǎn)號; Len:需要發(fā)送的長度; Buf :保存數(shù)據(jù)的緩沖區(qū) 返回: Len 的值。 備 注:無。 */ uint8 D12WriteEndpointBuffer(uint8 Endp,uint8 Len,uint8 * Buf) uint8 i; D12SelectEndpoint(Endp); / 選擇端點(diǎn) 34 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) D12WriteCommand(D12_WRITE_BUFFER); / 寫 Write Buffer 命令 D12WriteByte(0); / 該字節(jié)必須寫 0 D12WriteByte(Len); /

38、 寫需要發(fā)送數(shù)據(jù)的長度 #ifdef DEBUG1 / 如果定義了 DEBUG1 ,則需要顯示調(diào)試信息 Prints( 寫端點(diǎn) ); PrintLongInt(Endp/2); / 端點(diǎn)號。由于 D12 特殊的端點(diǎn)組織形式, / / / 這里的 0 和 1分別表示端點(diǎn) 0 的輸出和輸入; 而 2、 3 分別表示端點(diǎn) 1 的輸出和輸入; 4、 5 分別表示端點(diǎn) 2 的輸出和輸入。 / 因此要除以 2 才顯示對應(yīng)的端點(diǎn)。 Prints( 緩沖區(qū) ); PrintLongInt(Len); / 寫入的字節(jié)數(shù) Prints( 字節(jié)。 rn); #endif D12SetPortOut(); / 將數(shù)據(jù)

39、口設(shè)置為輸出狀態(tài)(注意這里為空宏,移植時可能有用) for(i=0;iDeviceDescriptor7) / 按最大包長度發(fā)送 D12WriteEndpointBuffer(1,DeviceDescriptor7,pSendData); / 發(fā)送后剩余字節(jié)數(shù)減少最大包長 SendLength-=DeviceDescriptor7; / 發(fā)送一次后指針位置要調(diào)整 pSendData+= DeviceDescriptor7; else if(SendLength!=0) / 不夠最大包長,可以直接發(fā)送 D12WriteEndpointBuffer(1,SendLength,pSendData);

40、 / 發(fā)送完畢后, SendLength 長度變?yōu)?0 SendLength=0; else / 如果要發(fā)送的數(shù)據(jù)包長度為 0 if(NeedZeroPacket=1) / 如果需要發(fā)送 0 長度數(shù)據(jù) D12WriteEndpointBuffer(1,0,pSendData); / 發(fā)送 0 長度數(shù)據(jù)包 NeedZeroPacket=0;/ / 清需要發(fā)送 0 長度數(shù)據(jù)包標(biāo)志 /* 函數(shù)功能:端點(diǎn) 0 輸出中斷處理函數(shù)。 入口參數(shù):無。 返 回:無。 備 注:無。 38 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) void UsbEp0Out(void) #ifdef DEBUG0 Prin

41、ts( USB 端點(diǎn) 0 輸出中斷。 rn); #endif / 讀取端點(diǎn) 0 輸出最后傳輸狀態(tài),該操作清除中斷標(biāo)志 / 并判斷第 5 位是否為 1 ,如果是,則說明是建立包 if(D12ReadEndpointLastStatus(0) / 讀建立過程數(shù)據(jù) D12AcknowledgeSetup(); / 應(yīng)答建立包 D12ClearBuffer(); / 清緩沖區(qū) / 將緩沖數(shù)據(jù)填到設(shè)備請求的各字段中 bmRequestType=Buffer0; bRequest=Buffer1; wValue=Buffer2+(uint16)Buffer3)8); wIndex=Buffer4+(uin

42、t16)Buffer5)8); wLength=Buffer6+(uint16)Buffer7)5) #endif / USB 協(xié)議定義了幾個標(biāo)準(zhǔn)輸入請求,我們實(shí)現(xiàn)這些標(biāo)準(zhǔn)請求即可 / 請求的代碼在 bRequest 中,對不同的請求代碼進(jìn)行散轉(zhuǎn) / 事實(shí)上,我們還需要對接收者進(jìn)行散轉(zhuǎn),因?yàn)椴煌恼埱蠼邮照?/ 是不一樣的。接收者在 bmRequestType的 D4D0 位中定義。 / 我們這里為了簡化操作,有些就省略了對接收者的判斷。 / 例如獲取描述符的請求,只根據(jù)描述符的類型來區(qū)別。 switch(bRequest) 39 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) case GET

43、_CONFIGURATION: / 獲取配置 #ifdef DEBUG0 Prints( 獲取配置。 rn); #endif break; case GET_DESCRIPTOR : / 獲取描述符 #ifdef DEBUG0 Prints( 獲取描述符 ); #endif / 對描述符類型進(jìn)行散轉(zhuǎn),對于全速設(shè)備, / 標(biāo)準(zhǔn)請求只支持發(fā)送到設(shè)備的設(shè)備、配置、字符串三種描述符 switch(wValue8) #endif pSendData=DeviceDescriptor; / 需要發(fā)送的數(shù)據(jù) / 判斷請求的字節(jié)數(shù)是否比實(shí)際需要發(fā)送的字節(jié)數(shù)多 / 這里請求的是設(shè)備描述符,因此數(shù)據(jù)長度就是 /

44、DeviceDescriptor0 。如果請求的比實(shí)際的長, / 那么只返回實(shí)際長度的數(shù)據(jù) if(wLengthDeviceDescriptor0) SendLength=DeviceDescriptor0; if(SendLength%DeviceDescriptor7=0) / 并且剛好是整數(shù)個數(shù)據(jù)包時 NeedZeroPacket=1;/ / 需要返回 0 長度的數(shù)據(jù)包 else SendLength=wLength; / 將數(shù)據(jù)通過 EP0 返回 UsbEp0SendData(); break; case CONFIGURATION_DESCRIPTOR: / 配置描述符 40 三江學(xué)

45、院 2014 屆本科生畢業(yè)設(shè)計(論文) #ifdef DEBUG0 Prints( 配置描述符。 rn); #endif pSendData=ConfigurationDescriptor; / 需要發(fā)送的數(shù)據(jù)為配置描述符 / 判斷請求的字節(jié)數(shù)是否比實(shí)際需要發(fā)送的字節(jié)數(shù)多 / 這里請求的是配置描述符集合,因此數(shù)據(jù)長度就是 / ConfigurationDescriptor3*256+ConfigurationDescriptor2 。 / 如果請求的比實(shí)際的長,那么只返回實(shí)際長度的數(shù)據(jù) SendLength=ConfigurationDescriptor3; SendLength=SendLe

46、ngth*256+ConfigurationDescriptor2; if(wLengthSendLength) if(SendLength%DeviceDescriptor7=0) / 并且剛好是整數(shù)個數(shù)據(jù)包時 NeedZeroPacket=1;/ / 需要返回 0 長度的數(shù)據(jù)包 else SendLength=wLength; / 將數(shù)據(jù)通過 EP0返回 UsbEp0SendData(); break; case STRING_DESCRIPTOR: / 字符串描述符 #ifdef DEBUG0 Prints( 字符串描述符 ); #endif switch(wValue #endif p

47、SendData=LanguageId; SendLength=LanguageId0; break; case 1: / 廠商字符串的索引值為 1,所以這里為廠商字符串 41 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) #ifdef DEBUG0 Prints( 廠商描述 ) 。rn); #endif pSendData=ManufacturerStringDescriptor; SendLength=ManufacturerStringDescriptor0; break; case 2 : / 產(chǎn)品字符串的索引值為 2,所以這里為產(chǎn)品字符串 #ifdef DEBUG0 Prints(

48、產(chǎn)品描述 ) 。rn); #endif pSendData=ProductStringDescriptor; SendLength=ProductStringDescriptor0; break; case 3: / 產(chǎn)品序列號的索引值為 3,所以這里為序列號 #ifdef DEBUG0 Prints( 產(chǎn)品序列號 ) 。rn); #endif pSendData=SerialNumberStringDescriptor; SendLength=SerialNumberStringDescriptor0; break; default : #ifdef DEBUG0 Prints( 未知的索引

49、值 ) 。rn); #endif / 對于未知索引值的請求,返回一個 0 長度的包 SendLength=0; NeedZeroPacket=1; break; / 判斷請求的字節(jié)數(shù)是否比實(shí)際需要發(fā)送的字節(jié)數(shù)多 / 如果請求的比實(shí)際的長,那么只返回實(shí)際長度的數(shù)據(jù) if(wLengthSendLength) if(SendLength%DeviceDescriptor7=0) / 并且剛好是整數(shù)個數(shù)據(jù)包時 NeedZeroPacket=1;/ / 需要返回 0 長度的數(shù)據(jù)包 else 42 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) SendLength=wLength; / 將數(shù)據(jù)通過 EP

50、0返回 UsbEp0SendData(); break; case REPORT_DESCRIPTOR: / 報告描述符 #ifdef DEBUG0 Prints( 報告描述符。 rn); #endif pSendData=ReportDescriptor;/ / 需要發(fā)送的數(shù)據(jù)為報告描述符 SendLength=sizeof(ReportDescriptor);/ / 需要返回的數(shù)據(jù)長度 / 判斷請求的字節(jié)數(shù)是否比實(shí)際需要發(fā)送的字節(jié)數(shù)多 / 如果請求的比實(shí)際的長,那么只返回實(shí)際長度的數(shù)據(jù) if(wLengthSendLength) if(SendLength%DeviceDescriptor

51、7=0) / 并且剛好是整數(shù)個數(shù)據(jù)包時 NeedZeroPacket=1;/ / 需要返回 0 長度的數(shù)據(jù)包 else SendLength=wLength; / 將數(shù)據(jù)通過 EP0 返回 UsbEp0SendData(); break; default: / 其它描述符 #ifdef DEBUG0 Prints( 其他描述符,描述符代碼: ); PrintHex(wValue8) Prints(rn); #endif break; break; case GET_INTERFACE: / 獲取接口 #ifdef DEBUG0 43 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) Prints(

52、 獲取接口。 rn); #endif break; case GET_STATUS:/ / 獲取狀態(tài) #ifdef DEBUG0 Prints( 獲取狀態(tài)。 rn); #endif break; case SYNCH_FRAME: / 同步幀 #ifdef DEBUG0 Prints( 同步幀。 rn); #endif break; default: / 未定義的標(biāo)準(zhǔn)請求 #ifdef DEBUG0 Prints( 錯誤:未定義的標(biāo)準(zhǔn)輸入請求。 rn); #endif break; break; case 1: / 類請求 #ifdef DEBUG0 Prints( USB 類輸入請求: rn

53、); #endif break; case 2: / 廠商請求 #ifdef DEBUG0 Prints( USB 廠商輸入請求: rn); #endif break; default: / 未定義的請求。這里只顯示一個報錯信息 #ifdef DEBUG0 Prints( 錯誤:未定義的輸入請求。 rn); #endif break; / 否則說明是輸出請求 44 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) else /if(bmRequestType #endif / USB 協(xié)議定義了幾個標(biāo)準(zhǔn)輸出請求,我們實(shí)現(xiàn)這些標(biāo)準(zhǔn)請求即可 / 請求的代碼在 bRequest中,對不同的請求代碼進(jìn)行散

54、轉(zhuǎn) switch(bRequest) case CLEAR_FEATURE: / 清除特性 #ifdef DEBUG0 Prints( 清除特性。 rn); #endif break; case SET_ADDRESS: / 設(shè)置地址 #ifdef DEBUG0 Prints( 設(shè)置地址。地址為: ); PrintHex(wValue / 顯示所設(shè)置的地址 Prints(rn); #endif D12SetAddress(wValue / wValue 中的低字節(jié)是設(shè)置的地址值 / 設(shè)置地址沒有數(shù)據(jù)過程,直接進(jìn)入到狀態(tài)過程,返回一個 0 長度的數(shù)據(jù)包 SendLength=0; NeedZer

55、oPacket=1; / 將數(shù)據(jù)通過 EP0 返回 UsbEp0SendData(); break; case SET_CONFIGURATION: / 設(shè)置配置 #ifdef DEBUG0 Prints( 設(shè)置配置。 rn); #endif / 使能非 0 端點(diǎn)。非 0端點(diǎn)只有在設(shè)置為非 0 的配置后才能使能。 / wValue的低字節(jié)為配置的值,如果該值為非 0,才能使能非 0 端點(diǎn)。 45 三江學(xué)院 2014 屆本科生畢業(yè)設(shè)計(論文) / 保存當(dāng)前配置值 ConfigValue=wValue D12SetEndpointEnable(ConfigValue); / 返回一個 0 長度的狀態(tài)數(shù)據(jù)包 SendLength=0; NeedZeroPacket=1; / 將數(shù)據(jù)通過 EP0 返回 UsbEp0SendData(); break; case SET_DESCRIPTOR :/ 設(shè)置描述符 #ifdef DEBUG0 Prints( 設(shè)置描述符。 rn); #endif break; case SET_FEATURE:/ / 設(shè)置特性 #ifdef DEBUG0 Prints( 設(shè)置特性。 rn); #endif break; case

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論