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

          新聞中心

          EEPW首頁 > 模擬技術(shù) > 設(shè)計(jì)應(yīng)用 > 實(shí)例講解usb2.0的固件設(shè)計(jì)方法

          實(shí)例講解usb2.0的固件設(shè)計(jì)方法

          ——
          作者:武漢大學(xué)電子信息學(xué)院 金朝輝 時間:2007-01-26 來源:《世界電子元器件》 收藏

          usb總線是在1995年被提出,并由7個計(jì)算機(jī)和通信工業(yè)領(lǐng)先的公司所組成的聯(lián)盟所定義并加以推廣,1999年usb的第三個版本usb2.0發(fā)布,usb2.0利用傳輸時序的縮短以及相關(guān)的傳輸技術(shù),將整個傳輸速度從原來12mbps提高到480mbps,整整提高了40倍。usb2.0除了有傳輸速度快之外,還有眾多優(yōu)點(diǎn),如統(tǒng)一了各種接口設(shè)備的連接頭并使用單一專用的接頭型號,最多可以連接127個接口設(shè)備,最突出的優(yōu)點(diǎn)是具有“熱插撥”的特性,可以即插即用,并能自動檢測與配置系統(tǒng)的資源。但其開發(fā)難度比較大,其中設(shè)備的固件設(shè)計(jì)即是難點(diǎn)之一。

          在usb設(shè)備與主機(jī)正常通信之前,主機(jī)必須檢測并配置設(shè)備,所以用戶必須編寫固件程序代碼,響應(yīng)主機(jī)的控制請求命令,并且能夠提供描述符,使主機(jī)了解設(shè)備的功能,從而配置設(shè)備,開始與設(shè)備的正常通信。另外,固件還要完成正常的數(shù)據(jù)傳輸功能。

          cy7c68013芯片簡介

          cypress公司的ez-usb fx2芯片cy7c68013是一款性能較高的usb2.0微控制器。在單片機(jī)上集成usb2.0收發(fā)器﹑sie(串行接口引擎)﹑增強(qiáng)的8051微控制器和可編程的外圍接口。ez-usb fx2中的智能sie可以處理大部分usb2.0協(xié)議,使得微控制器可以專注于應(yīng)用功能,從而減少了開發(fā)時間﹑確保了usb的兼容性,其內(nèi)部功能框圖如圖1所示。

          (1) cy7c68013的主要特性如下:

          a.帶有加強(qiáng)的8051內(nèi)核性能,可達(dá)到標(biāo)準(zhǔn)8051的5~10倍,且與標(biāo)準(zhǔn)8051的指令完全兼容;

          b.集成度高, 芯片內(nèi)部集成微處理器、ram、sie(串行接口引擎)等多個功能模塊,從而減少了多個芯片接口部分需要時序配合的麻煩;
          c.采用軟配置,在外設(shè)未通過usb 接口接到pc機(jī)之前, 外設(shè)上的固件存儲在pc上;而一旦外設(shè)連接到pc 機(jī)上,pc 則先詢問外設(shè)是“誰”(即讀設(shè)備描述符) ,然后將該外設(shè)的固件下載到芯片的ram中,這個過程叫做再枚舉。這樣,在開發(fā)過程中,當(dāng)固件需要修改時,可以先在pc 機(jī)上修改好, 然后再下載到芯片中;

          d.具有易用的軟件開發(fā)工具,該芯片開發(fā)系統(tǒng)的驅(qū)動程序和固件的開發(fā)和調(diào)試相互獨(dú)立,可加快開發(fā)的速度。

          (2) cy7c68013有三種可用的接口模式: 端口、gpif主控和從fifo方式。

          a.在“端口”模式下,所有i/o引腳都可作為8051的通用i/o口。

          b.在“從fifo”模式下,外部邏輯或外部處理器直接與fx2端點(diǎn)fifo相連。在這種模式下,gpif 不被激活,因?yàn)橥獠窟壿嬁芍苯涌刂苀ifo。這種模式下,外部主控端既可以是異步方式,也可以是同步方式,并可以為fx2 接口提供自己的獨(dú)立時鐘。

          c.“gpif主控”接口模式使用portb 和portd 構(gòu)成通向四個fx2端點(diǎn)fifo( ep2 ,ep4 , ep6和ep8)的16位數(shù)據(jù)接口。gpif 作為內(nèi)部的主控制器與fifo直接相連, 并產(chǎn)生用戶可編程的控制信號與外部接口進(jìn)行通信。同時,gpif 還可以通過rdy引腳采樣外部信號并等待外部事件。由于gpif 的運(yùn)行速度比fifo 快得多,因此其時序信號具有很好的編程分辨率。另外,gpif 既可以使用內(nèi)部時鐘,也可以使用外部時鐘。


          固件程序的功能和基本架構(gòu)

          固件程序是所有基于微控制器及其外圍電路的功能設(shè)備正常工作必不可少的部分,其作用就是輔助硬件,主要有以下幾種功能:

          a.初始化工作,包括設(shè)置一些特殊功能寄存器的初值以實(shí)現(xiàn)所需的設(shè)備屬性或者功能,例如開中斷,使能端點(diǎn),配置端口等。 b.輔助硬件完成設(shè)備的重新列舉過程,包括模擬設(shè)備的斷開與重新連接,對接收到的設(shè)置包進(jìn)行分析判斷,從而對主機(jī)的設(shè)備請求作出適當(dāng)?shù)捻憫?yīng),完成主機(jī)對設(shè)備的配置任務(wù)。

          c.對中斷的處理。

          d.數(shù)據(jù)的接收和發(fā)送。

          e.外圍電路的控制。

          cypress公司為了簡化和加速用戶使用ez-usb fx2芯片進(jìn)行usb外設(shè)的開發(fā)過程,提供了一個完整的固件程序的架構(gòu),用戶只需要提供一個usb描述符表,添加其他端點(diǎn)接收和發(fā)送數(shù)據(jù)的通信代碼,以及控制外圍電路的程序代碼。

          固件程序框架的流程如圖2所示。


          固件架構(gòu)是由keil c51 c編譯器與其整合開發(fā)工具所編寫和構(gòu)建出來的。其主要所含的文件有:

          fw.c固件架構(gòu)原始的程序代碼

          periph.c用戶副函數(shù)鉤子的相關(guān)定義,主要的用戶函數(shù)應(yīng)用代碼

          gpif.c含有g(shù)pif波形描述符表,可以實(shí)現(xiàn)波形的傳輸

          dscr..a51 usb描述符表的范例

          fx2.h 共同的fx2常數(shù),宏,數(shù)據(jù)類型以及函數(shù)庫內(nèi)副函數(shù)的雛形框架

          fx2regs.h fx2寄存器的聲明與位屏蔽常數(shù)


          cy7c68013的固件程序編寫實(shí)例

          通過cy7c68013的gpif方式下的單字節(jié)讀寫實(shí)例來說明固件程序的編寫方法。圖3是cy7c68013與sram的硬件連接圖。


          其設(shè)備描述符的格式和編寫可以在參考文獻(xiàn)中找到,這里不加詳述。

          其初始化程序代碼如下所示:




          usb描述符表和用戶函數(shù)可根據(jù)所用的方式和需要的功能進(jìn)行簡單編寫,在這不再詳細(xì)的羅列代碼。


          結(jié)束語

          本文結(jié)合實(shí)際工程應(yīng)用,提出了usb2.0的固件設(shè)計(jì)方法和具體步驟,并給出了具體實(shí)例。本文所使用的范例代碼是從實(shí)際項(xiàng)目中截取的,希望對讀者設(shè)計(jì)設(shè)備固件程序能有所幫助。

          tcp/ip相關(guān)文章:tcp/ip是什么




          關(guān)鍵詞:

          評論


          相關(guān)推薦

          技術(shù)專區(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); })();