極海APM32F407系列USB模塊介紹
極海APM32F407系列工業(yè)級(jí)高性能MCU,支持USB2.0協(xié)議,兼容低速(1.5Mbps)、全速(12Mbps)和高速模式(480Mbps)。高速模式下集成了內(nèi)部的PHY(物理層),可以節(jié)約外部器件成本,操作簡(jiǎn)便。
APM32F407高速模式下支持4K字節(jié)的專用RAM管理數(shù)據(jù)FIFO傳輸。單獨(dú)一幀不需要應(yīng)用程序參與,從而達(dá)到最大的傳輸帶寬。作為設(shè)備時(shí),支持最多6個(gè)端點(diǎn),作為主機(jī)則支持最多12個(gè)通道。支持OTG標(biāo)準(zhǔn),允許在主機(jī)和設(shè)備之間進(jìn)行動(dòng)態(tài)角色切換,支持模塊內(nèi)嵌的DMA傳輸。
在功耗方面,APM32F407內(nèi)置電源管理模塊,在USB模塊掛起時(shí)可關(guān)閉USB模塊所有時(shí)鐘源來(lái)降低功耗,還能通過(guò)停止物理層時(shí)鐘節(jié)省其翻轉(zhuǎn)而產(chǎn)生的動(dòng)態(tài)功耗,同時(shí)支持OTG應(yīng)用的主機(jī)關(guān)閉Vbus降低功耗。由此可知,APM32F407的USB模塊可高效地實(shí)現(xiàn)USB2.0協(xié)議,通過(guò)多個(gè)管道和FIFO緩存區(qū)使傳輸達(dá)到最大的USB帶寬,符合OTG補(bǔ)充標(biāo)準(zhǔn),功耗管理表現(xiàn)優(yōu)秀。
USB簡(jiǎn)介
USB(Universal Serial Bus)即通用串行總線,作為一種傳輸速度快、使用方便、連接靈活的數(shù)據(jù)通信技術(shù)被市場(chǎng)廣泛使用,但大家對(duì)它的了解有多少呢?今天極海芯君就與大家來(lái)聊聊USB的發(fā)展歷程、通訊形式。
USB傳輸標(biāo)準(zhǔn)進(jìn)化史
自1996年USB-IF(USB Implementers Forum)組織發(fā)布USB 1.0標(biāo)準(zhǔn)以來(lái),USB已經(jīng)演化了諸多版本。其中 USB1.1支持1.5Mbps低速模式和12Mbps全速模式,而USB2.0作為MCU常用數(shù)據(jù)通信版本,在兼容低速和全速的同時(shí),還支持480Mbps的高速模式。
USB標(biāo)準(zhǔn)版本
USB通信組件
USB通信由主機(jī)和設(shè)備(從機(jī))組成,主機(jī)發(fā)起通信,符合條件的設(shè)備做出響應(yīng)。最前線的端點(diǎn)接收主機(jī)數(shù)據(jù),多個(gè)“志同道合”的端點(diǎn)組成接口,多個(gè)接口組成配置,一個(gè)設(shè)備可有個(gè)配置,然后USB通過(guò)四線電纜傳輸信號(hào)和電源。
Q:數(shù)據(jù)線(D-/D+)和端點(diǎn)有什么關(guān)系?
A:數(shù)據(jù)線是傳送帶,端點(diǎn)負(fù)責(zé)向傳送帶收放數(shù)據(jù),而對(duì)應(yīng)的主機(jī)則是使用通道來(lái)收放數(shù)據(jù)。端點(diǎn)存在設(shè)備內(nèi)部,用于管理數(shù)據(jù)。
USB描述符
Q:如何區(qū)分設(shè)備呢?
A:這就涉及到USB描述符了。描述符是USB協(xié)議規(guī)定的符號(hào)集,可以分為設(shè)備描述符、配置描述符、接口描述符、端點(diǎn)描述符、字符串描述符等。
*需注意,接口描述符和端點(diǎn)描述符通常是和配置描述符綁定的。配置描述符自身長(zhǎng)度為9字節(jié),接口、端口等描述符銜接在配置描述符后面。所以主機(jī)只需要獲取配置描述符集合就能知道設(shè)備的通信信息。
Q:什么是USB的類?
A:USB常見(jiàn)的傳輸形式有鼠標(biāo)、U盤(pán)、音視頻等,不同類型的傳輸有著不同的傳輸規(guī)則,同類型傳輸規(guī)則則保持一致,這就產(chǎn)生了“類”的概念。主機(jī)識(shí)別出設(shè)備的類代碼,就會(huì)按照該類的規(guī)則來(lái)傳輸。不同基類還有自己的子類和協(xié)議。類代碼一般存放于接口描述符,少數(shù)存放于設(shè)備描述符。
USB請(qǐng)求
USB規(guī)定了8個(gè)字節(jié)作為一個(gè)請(qǐng)求,通過(guò)主機(jī)發(fā)送標(biāo)準(zhǔn)的獲取描述符請(qǐng)求,設(shè)備接收到請(qǐng)求后,將對(duì)應(yīng)描述符發(fā)送至主機(jī)。
USB設(shè)備請(qǐng)求結(jié)構(gòu)
表注:D0表示字節(jié)的第0位,D1表示第1位,依次類推
USB標(biāo)準(zhǔn)請(qǐng)求
表注:B后綴表示二進(jìn)制
利用標(biāo)準(zhǔn)請(qǐng)求即可實(shí)現(xiàn)設(shè)備枚舉,枚舉的過(guò)程其實(shí)就是主機(jī)識(shí)別設(shè)備的過(guò)程。枚舉的大致流程:
*除了標(biāo)準(zhǔn)請(qǐng)求外,還有類請(qǐng)求、供應(yīng)商請(qǐng)求,當(dāng)請(qǐng)求中bmRequestType的第5、6位的值對(duì)應(yīng)為類請(qǐng)求時(shí),該8個(gè)字節(jié)請(qǐng)求的規(guī)范就會(huì)按照類的規(guī)則來(lái)定義。
USB控制傳輸
主機(jī)發(fā)送請(qǐng)求至設(shè)備,設(shè)備返回描述符至主機(jī),主機(jī)收到設(shè)備發(fā)過(guò)來(lái)的描述符,需要返回一個(gè)0數(shù)據(jù)包表示狀態(tài),表明成功接收數(shù)據(jù),這個(gè)傳輸方式在USB中稱為控制傳輸。
一次USB控制傳輸需要Setup事務(wù)發(fā)送請(qǐng)求至設(shè)備,然后根據(jù)請(qǐng)求判斷數(shù)據(jù)傳輸方向及數(shù)據(jù)長(zhǎng)度,數(shù)據(jù)事務(wù)(IN或OUT)之后,數(shù)據(jù)的接收方需要發(fā)送一個(gè)0長(zhǎng)度數(shù)據(jù)事務(wù)(IN或OUT)來(lái)結(jié)束控制傳輸??刂苽鬏敱仨氂兄鳈C(jī)的請(qǐng)求(Setup),而數(shù)據(jù)過(guò)程取決于該請(qǐng)求,若無(wú)數(shù)據(jù),則直接到狀態(tài)過(guò)程。狀態(tài)過(guò)程屬于數(shù)據(jù)包,但它沒(méi)有內(nèi)容。
USB事務(wù)構(gòu)成
USB包構(gòu)成
令牌包由主機(jī)發(fā)出,設(shè)備接到令牌包后,如果為Setup,則接收數(shù)據(jù)包(8字節(jié)請(qǐng)求);如果為IN令牌,則發(fā)送數(shù)據(jù)至主機(jī),OUT令牌相反。
握手包是在數(shù)據(jù)包結(jié)束之后,數(shù)據(jù)的接收方進(jìn)行應(yīng)答,應(yīng)答方式有ACK(確認(rèn))、NAK(未就緒)、STALL(出錯(cuò))和NYET(高速OUT事務(wù)中表示無(wú)空間)。
MCU中USB設(shè)備的數(shù)據(jù)流
數(shù)據(jù)緩沖區(qū)-FIFO
MCU一般使用FIFO作為數(shù)據(jù)緩存區(qū),MCU里的FIFO它是一種先進(jìn)先出的數(shù)據(jù)緩存寄存器。USB在事務(wù)和包中,我們可以了解到,當(dāng)設(shè)備收到主機(jī)的令牌包后,根據(jù)不同的令牌包,進(jìn)行接收或發(fā)送數(shù)據(jù)。比如收到了Setup令牌,那設(shè)備會(huì)先將數(shù)據(jù)保存在接收FIFO中,置起相關(guān)標(biāo)準(zhǔn)位,設(shè)備就可以去接收FIFO中取出Setup請(qǐng)求;比如收到的是IN令牌,那設(shè)備會(huì)從發(fā)送FIFO中發(fā)送預(yù)先壓棧的數(shù)據(jù),若發(fā)送FIFO無(wú)數(shù)據(jù)則返回NAK握手包。