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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于單片機(jī)的USB主控器驅(qū)動(dòng)設(shè)計(jì)

          基于單片機(jī)的USB主控器驅(qū)動(dòng)設(shè)計(jì)

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

          在現(xiàn)代社會(huì),嵌入式系統(tǒng)逐漸深入到人們生活的方方面面,各類(lèi)嵌入式系統(tǒng)產(chǎn)品之間往往通過(guò)某種接口進(jìn)行交互或數(shù)據(jù)傳遞。而現(xiàn)在,USB已經(jīng)成為嵌入式數(shù)據(jù)交換的最主要的方式,可是各種USB接口的設(shè)備都是基于PC機(jī)系統(tǒng)的,所以,基于嵌入式系統(tǒng)的USB接口的研究具有實(shí)用的價(jià)值和意義,特別是起Master作用的HOST端接口的研究。

          解決這一問(wèn)題的根本辦法就是在需要使用USB設(shè)備的嵌入式系統(tǒng)中擴(kuò)展USB Host功能模塊,使之具有與USB設(shè)備進(jìn)行數(shù)據(jù)傳輸?shù)哪芰Α?br />
          USB協(xié)議按功能分為2部分,USB HOST(USB主協(xié)議)和USB SLAVE(USB從協(xié)議)分別應(yīng)用于USB HOST CONTROLLER(USB主控制器)和USB DEVICE(USB設(shè)備)。一般,USB HOST要比USB SLAVE復(fù)雜,對(duì)于廣大的非PC用戶(hù)來(lái)說(shuō),尤其是嵌入式系統(tǒng)用戶(hù)來(lái)說(shuō),由于USB協(xié)議的不對(duì)稱(chēng)性,使得實(shí)現(xiàn)USB HOST比USB SLAVE要困難地多,Philips公司的ISP1161A1芯片很好地解決了這種問(wèn)題,他封裝了復(fù)雜的USB協(xié)議,使得在嵌入式系統(tǒng)中實(shí)現(xiàn)USB HOST和USB SLAVE變得簡(jiǎn)單方便。

          2 USB HOST技術(shù)簡(jiǎn)介

          USB的通信可以用圖1表示,圖1中,左半部分為USB主機(jī)端,可以看出,USB主機(jī)端由2部分構(gòu)成,即軟件體和硬件體,實(shí)際上是3個(gè)軟件組件組成了USB HOST解決方案,即USB客戶(hù)驅(qū)動(dòng)程序,USB驅(qū)動(dòng)程序和USB主機(jī)控制器驅(qū)動(dòng)程序,應(yīng)用程序的事務(wù)處理是由USB客戶(hù)驅(qū)動(dòng)程序(設(shè)備驅(qū)動(dòng)程序)啟動(dòng)的,客戶(hù)驅(qū)動(dòng)程序把USB設(shè)備當(dāng)做一個(gè)可以被訪問(wèn)的端點(diǎn)集合,他可以被控制并與他的功能單元進(jìn)行通信,USB系統(tǒng)軟件包括USB驅(qū)動(dòng)程序和USB主控制器驅(qū)動(dòng)程序,USB驅(qū)動(dòng)程序負(fù)責(zé)配置管理、用戶(hù)管理、總線管理和數(shù)據(jù)傳輸,USB主控制器驅(qū)動(dòng)程序負(fù)責(zé)調(diào)度管理,隊(duì)列管理和控制器管理,以及數(shù)據(jù)的位編碼、封包、循環(huán)校驗(yàn)、發(fā)送、錯(cuò)誤處理等。



          如圖2所示,USB HOST的軟件結(jié)構(gòu)分為3大部分,即USB總線驅(qū)動(dòng)(USBD),USB HOST控制器驅(qū)動(dòng)(HCD)、客戶(hù)軟件、其中客戶(hù)軟件處理和設(shè)備有關(guān)的信息,USBD處理和硬件無(wú)關(guān)的協(xié)議,而HCD則處理與硬件相關(guān)的協(xié)議,USBD和HCD都包含了一系列管理各種狀態(tài)的寄存器。



          3 SP1161體系結(jié)構(gòu)

          要實(shí)現(xiàn)USB協(xié)議,必須要通過(guò)一系列寄存器來(lái)完成,這些寄存器要能實(shí)現(xiàn)USB軟件結(jié)構(gòu)中的USBD和HCD,即要完成USB協(xié)議狀態(tài)的控制,還要有一定的緩沖區(qū)來(lái)存放進(jìn)出的數(shù)據(jù),ISP1161專(zhuān)門(mén)針對(duì)USB協(xié)議設(shè)計(jì)的特殊硬件結(jié)構(gòu)可方便地實(shí)現(xiàn)USB HOST和USB SLAVE。ISP1161的硬件結(jié)構(gòu)主要是3類(lèi)不同的寄存器,用戶(hù)通過(guò)操作這3種寄存器來(lái)達(dá)到實(shí)現(xiàn)USB傳輸?shù)哪康?,這3類(lèi)寄存器是:

          (1)HC control and status registers:USB主控制器控制和狀態(tài)寄存器,主要用于傳輸過(guò)程中控制命令的存放和狀態(tài)的讀取,可讀可寫(xiě)的寄存器有2個(gè)地址,只讀或只寫(xiě)的寄存器只有1個(gè)地址。

          (2)Isochronous Transfer List (ITL):同步傳輸列表緩沖區(qū)。

          (3)Acknowledged Transfer List(ATL):接收傳輸列表緩沖區(qū)。

          根據(jù)USB協(xié)議,數(shù)據(jù)傳輸分為4種模式,Control(控制),Bulk(整批),Interrupt(中斷)和Isochronous(同步)。其中ITL是為了實(shí)現(xiàn)同步傳輸,ATL則實(shí)現(xiàn)其他3種模式的傳輸。

          4 ISP1161x主控制器編程實(shí)現(xiàn)

          設(shè)計(jì)ISP1161x主控制驅(qū)動(dòng)程序主要涉及以下2個(gè)重要內(nèi)容,下面詳細(xì)介紹:

          4.1 讀/寫(xiě)ATL和ITL緩沖區(qū)

          ATL和ITL緩沖區(qū)的位于ISP1161x內(nèi)部的FIFO緩沖RAM之中,每個(gè)緩沖區(qū)包含許多PTD(Philips Transfer Descriptor),而PTD用于主控制器硬件發(fā)送或接收USB包從USB設(shè)備,作為調(diào)度USB傳輸?shù)囊徊糠?,HCD在系統(tǒng)內(nèi)存中購(gòu)建PTD。然后HCD將購(gòu)建好的PTD移入ATL或者ITL緩沖區(qū),主控制器硬件允許軟件去訪問(wèn)每一個(gè)緩沖區(qū),就像他們是分離的硬件緩沖區(qū),HCD訪問(wèn)ATL緩沖區(qū)通過(guò)硬件寄存器HcTransferCounter(22H/A2H)和HcATLBufferPort(41H/C1H),而ITL緩沖區(qū)則由HcTransferCounter和HcITLBufferPort(40H/C0H)訪問(wèn)。下面一段示例代碼取自于本項(xiàng)目,其功能是向ATL緩沖區(qū)寫(xiě)數(shù)據(jù),hci→hp→atl_len表示,ATL則在內(nèi)存中還沒(méi)有發(fā)送的數(shù)據(jù)的長(zhǎng)度,hci→hp→tl表示緩沖區(qū)的地址。

          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          技術(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); })();