單芯片解決方案,開(kāi)啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶帶來(lái)前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來(lái)說(shuō),一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲(chǔ)與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個(gè)獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開(kāi)發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32 提供了兩種選擇:QFN68和QFN100。
W55MH32Q采用QFN68封裝版本,尺寸為8x8mm,它擁有36個(gè)GPIO、3個(gè)ADC、12通道DMA、17個(gè)定時(shí)器、2個(gè)I2C、3個(gè)串口、2個(gè)SPI接口(其中1個(gè)帶I2S接口復(fù)用)、1個(gè)CAN以及1個(gè)USB2.0。在保持與同系列其他版本一致的核心性能基礎(chǔ)上,僅減少了部分GPIO以及SDIO接口,其他參數(shù)保持一致,性價(jià)比優(yōu)勢(shì)顯著,尤其適合網(wǎng)關(guān)模組等對(duì)空間布局要求較高的場(chǎng)景。緊湊的尺寸和精簡(jiǎn)化外設(shè)配置,使其能夠在有限空間內(nèi)實(shí)現(xiàn)高效的網(wǎng)絡(luò)連接與數(shù)據(jù)交互,成為物聯(lián)網(wǎng)網(wǎng)關(guān)、邊緣計(jì)算節(jié)點(diǎn)等緊湊型設(shè)備的理想選擇。 同系列還有QFN100封裝的W55MH32L版本,該版本擁有更豐富的外設(shè)資源,適用于需要多接口擴(kuò)展的復(fù)雜工控場(chǎng)景,軟件使用方法一致。更多信息和資料請(qǐng)進(jìn)入http://www.w5500.com/網(wǎng)站或者私信獲取。
此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應(yīng)用,涵蓋TCP SSL、HTTP SSL以及MQTT SSL等,為網(wǎng)絡(luò)通信安全再添保障。
為助力開(kāi)發(fā)者快速上手與深入開(kāi)發(fā),基于W55MH32Q這顆芯片,WIZnet精心打造了配套開(kāi)發(fā)板。開(kāi)發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開(kāi)發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開(kāi)發(fā)者全面評(píng)估芯片性能。
若您想獲取芯片和開(kāi)發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問(wèn)官方網(wǎng)頁(yè):http://www.w5500.com/,我們期待與您共同探索W55MH32的無(wú)限可能。
第二十二章 USB 全速設(shè)備接口(USB)
1 USB 簡(jiǎn)介
USB 外設(shè)實(shí)現(xiàn)了 USB2.0 全速總線和 APB1 總線間的接口。
USB 外設(shè)支持 USB 掛起/恢復(fù)操作,可以停止設(shè)備時(shí)鐘實(shí)現(xiàn)低功耗。
2 USB 主要特征
W55MH32的USB接口的主要特征如下:
?符合 USB2.0 全速設(shè)備的技術(shù)規(guī)范
?可配置 1 到 8 個(gè) USB 端點(diǎn)
? CRC(循環(huán)冗余校驗(yàn))生成/校驗(yàn),反向不歸零(NRZI)編碼/解碼和位填充
? 支持同步傳輸
?支持批量/同步端點(diǎn)的雙緩沖區(qū)機(jī)制
?支持 USB 掛起/恢復(fù)操作
?幀鎖定時(shí)鐘脈沖生成
注: USB 和 CAN 共用一個(gè)專用的 512 字節(jié)的 SRAM 存儲(chǔ)器用于數(shù)據(jù)的發(fā)送和接收,因此不能同時(shí)使用USB 和 CAN(共享的 SRAM 被 USB 和 CAN 模塊互斥地訪問(wèn)) 。USB 和 CAN 可以同時(shí)用于一個(gè)應(yīng)用中但不能在同一個(gè)時(shí)間使用。下圖是 USB 外設(shè)的方框圖:
USB 設(shè)備框圖
3 USB 功能描述
USB 模塊為 PC 主機(jī)和微控制器所實(shí)現(xiàn)的功能之間提供了符合 USB 規(guī)范的通信連接。PC 主機(jī)和微控制器之間的數(shù)據(jù)傳輸是通過(guò)共享一專用的數(shù)據(jù)緩沖區(qū)來(lái)完成的,該數(shù)據(jù)緩沖區(qū)能被 USB 外設(shè)直接訪問(wèn)。這塊專用數(shù)據(jù)緩沖區(qū)的大小由所使用的端點(diǎn)數(shù)目和每個(gè)端點(diǎn)最大的數(shù)據(jù)分組大小所決定,每個(gè)端點(diǎn)最大可使用 512 字節(jié)緩沖區(qū),
最多可用于 16 個(gè)單向或 8 個(gè)雙向端點(diǎn)。USB 模塊同 PC 主機(jī)通信,根據(jù) USB規(guī)范實(shí)現(xiàn)令牌分組的檢測(cè),數(shù)據(jù)發(fā)送/接收的處理,和握手分組的處理。整個(gè)傳輸?shù)母袷接捎布瓿?,其中包?CRC 的生成和校驗(yàn)。每個(gè)端點(diǎn)都有一個(gè)緩沖區(qū)描述塊,描述該端點(diǎn)使用的緩沖區(qū)地址、大小和需要傳輸?shù)淖止?jié)數(shù)。當(dāng) USB 模塊識(shí)別出一個(gè)有效的功能/端點(diǎn)的令牌分組時(shí),(如果需要傳輸數(shù)據(jù)并且端點(diǎn)已配置)隨之發(fā)生相關(guān)的數(shù)據(jù)傳輸。
USB 模塊通過(guò)一個(gè)內(nèi)部的 16 位寄存器實(shí)現(xiàn)端口與專用緩沖區(qū)的數(shù)據(jù)交換。在所有的數(shù)據(jù)傳輸完成后,如果需要,則根據(jù)傳輸?shù)姆较?,發(fā)送或接收適當(dāng)?shù)奈帐址纸M。在數(shù)據(jù)傳輸結(jié)束時(shí),USB 模塊將觸發(fā)與端點(diǎn)相關(guān)的中斷,通過(guò)讀狀態(tài)寄存器和/或者利用不同的中斷處理程序,微控制器可以確定:
?哪個(gè)端點(diǎn)需要得到服務(wù)。
?產(chǎn)生如位填充、格式、CRC、協(xié)議、缺失 ACK、緩沖區(qū)溢出/緩沖區(qū)未滿等錯(cuò)誤時(shí),正在進(jìn)行的是哪種類型的傳輸。USB 模塊對(duì)同步傳輸和高吞吐量的批量傳輸提供了特殊的雙緩沖區(qū)機(jī)制,在微控制器使用一個(gè)緩沖區(qū)的時(shí)候,該機(jī)制保證了 USB 外設(shè)總是可以使用另一個(gè)緩沖區(qū)。
在任何不需要使用 USB 模塊的時(shí)候,通過(guò)寫控制寄存器總可以使 USB 模塊置于低功耗模式(SUSPEND 模式)。在這種模式下,不產(chǎn)生任何靜態(tài)電流消耗,同時(shí) USB 時(shí)鐘也會(huì)減慢或停止。通過(guò)對(duì) USB 線上數(shù)據(jù)傳輸?shù)臋z測(cè),可以在低功耗模式下喚醒 USB 模塊。也可以將一特定的中斷輸入源直接連接到喚醒引腳上,以使系統(tǒng)能立即恢復(fù)正常的時(shí)鐘系統(tǒng),并支持直接啟動(dòng)或停止時(shí)鐘系統(tǒng)。
3.1 USB 功能模塊描述
USB 模塊實(shí)現(xiàn)了標(biāo)準(zhǔn) USB 接口的所有特性,它由以下部分組成:
?串行接口控制器(SIE):該模塊包括的功能有:幀頭同步域的識(shí)別,位填充,CRC 的產(chǎn)生和校驗(yàn),PID 的驗(yàn)證/產(chǎn)生,和握手分組處理等。它與 USB 收發(fā)器交互,利用分組緩沖接口提供的虛擬緩沖區(qū)存儲(chǔ)局部數(shù)據(jù)。它也根據(jù) USB 事件,和類似于傳輸結(jié)束或一個(gè)包正確接收等與端點(diǎn)相關(guān)事件生成信號(hào),例如幀首(Start of Frame),USB 復(fù)位,數(shù)據(jù)錯(cuò)誤等等,這些信號(hào)用來(lái)產(chǎn)生中斷。
?定時(shí)器:本模塊的功能是產(chǎn)生一個(gè)與幀開(kāi)始報(bào)文同步的時(shí)鐘脈沖,并在 3ms 內(nèi)沒(méi)有數(shù)據(jù)傳輸?shù)臓顟B(tài),檢測(cè)出(主機(jī)的)全局掛起條件。
?分組緩沖器接口:此模塊管理那些用于發(fā)送和接收的臨時(shí)本地內(nèi)存單元。它根據(jù) SIE 的要求分配合適的緩沖區(qū),并定位到端點(diǎn)寄存器所指向的存儲(chǔ)區(qū)地址。它在每個(gè)字節(jié)傳輸后,自動(dòng)遞增地址,直到數(shù)據(jù)分組傳輸結(jié)束。它記錄傳輸?shù)淖止?jié)數(shù)并防止緩沖區(qū)溢出。
?端點(diǎn)相關(guān)寄存器:每個(gè)端點(diǎn)都有一個(gè)與之相關(guān)的寄存器,用于描述端點(diǎn)類型和當(dāng)前狀態(tài)。對(duì)于單向和單緩沖器端點(diǎn),一個(gè)寄存器就可以用于實(shí)現(xiàn)兩個(gè)不同的端點(diǎn)。一共 8 個(gè)寄存器,可以用于實(shí)現(xiàn)最多 16 個(gè)單向/單緩沖的端點(diǎn)或者 7 個(gè)雙緩沖的端點(diǎn)或者這些端點(diǎn)的組合。例如,可以同時(shí)實(shí)現(xiàn) 4 個(gè)雙緩沖端點(diǎn)和 8 個(gè)單緩沖/單向端點(diǎn)。
?控制寄存器:這些寄存器包含整個(gè) USB 模塊的狀態(tài)信息,用來(lái)觸發(fā)諸如恢復(fù),低功耗等 USB事件。
?中斷寄存器:這些寄存器包含中斷屏蔽信息和中斷事件的記錄信息。配置和訪問(wèn)這些寄存器可以獲取中斷源,中斷狀態(tài)等信息,并能清除待處理中斷的狀態(tài)標(biāo)志。
注意: 端點(diǎn) 0 總是作為單緩沖模式下的控制端點(diǎn)。
USB 模塊通過(guò) APB1 接口部件與 APB1 總線相連,APB1 接口部件包括以下部分:
?分組緩沖區(qū):數(shù)據(jù)分組緩存在分組緩沖區(qū)中,它由分組緩沖接口控制并創(chuàng)建數(shù)據(jù)結(jié)構(gòu)。應(yīng)用軟件可以直接訪問(wèn)該緩沖區(qū)。它的大小為 512 字節(jié),由 256 個(gè) 16 位的字構(gòu)成。
?仲裁器:該部件負(fù)責(zé)處理來(lái)自 APB1 總線和 USB 接口的存儲(chǔ)器請(qǐng)求。它通過(guò)向 APB1 提供較高的訪問(wèn)優(yōu)先權(quán)來(lái)解決總線的沖突,并且總是保留一半的存儲(chǔ)器帶寬供 USB 完成傳輸。它采用時(shí)分復(fù)用的策略實(shí)現(xiàn)了虛擬的雙端口 SRAM,即在 USB 傳輸?shù)耐瑫r(shí),允許應(yīng)用程序訪問(wèn)存儲(chǔ)器。此策略也允許任意長(zhǎng)度的多字節(jié) APB1 傳輸。
?寄存器映射單元:此部件將 USB 模塊的各種字節(jié)寬度和位寬度的寄存器映射成能被 APB1 尋址的 16 位寬度的內(nèi)存集合。
?APB1 封裝:此部件為緩沖區(qū)和寄存器提供了到 APB1 的接口,并將整個(gè) USB 模塊映射到 APB1地址空間。
?中斷映射單元:將可能產(chǎn)生中斷的 USB 事件映射到三個(gè)不同的 NVIC 請(qǐng)求線上:
······? USB 低優(yōu)先級(jí)中斷(通道 20):可由所有 USB 事件觸發(fā)(正確傳輸,USB 復(fù)位等)。固件在處理中斷前應(yīng)當(dāng)首先確定中斷源。
······? USB 高優(yōu)先級(jí)中斷(通道 19):僅能由同步和雙緩沖批量傳輸?shù)恼_傳輸事件觸發(fā),目的是保證最大的傳輸速率。
······? USB 喚醒中斷(通道 42):由 USB 掛起模式的喚醒事件觸發(fā)。
4 編程中需要考慮的問(wèn)題
在下面的章節(jié)中,將介紹 USB 模塊和應(yīng)用程序之間的交互過(guò)程,有利于簡(jiǎn)化應(yīng)用程序的開(kāi)發(fā)。
4.1 系統(tǒng)復(fù)位和上電復(fù)位
發(fā)生系統(tǒng)復(fù)位或者上電復(fù)位時(shí),應(yīng)用程序首先需要做的是提供 USB 模塊所需要的時(shí)鐘信號(hào),然后清除復(fù)位信號(hào),使程序可以訪問(wèn) USB 模塊的寄存器。復(fù)位之后的初始化流程如下所述:
首先,由應(yīng)用程序激活寄存器單元的時(shí)鐘,再配置設(shè)備時(shí)鐘管理邏輯單元的相關(guān)控制位,清除復(fù)位信號(hào)。
其次,必須配置 CNTR 寄存器的 PDWN 位用以開(kāi)啟 USB 收發(fā)器相關(guān)的模擬部分,這點(diǎn)需要特別的處理。此位能打開(kāi)為端點(diǎn)收發(fā)器供電的內(nèi)部參照電壓。由于打開(kāi)內(nèi)部電壓需要一段啟動(dòng)時(shí)間(數(shù)據(jù)手冊(cè)中的 tSTARTUP),在此期間內(nèi) USB收發(fā)器處于不確定狀態(tài),所以在設(shè)置 CNTR寄存器的 PDWN后必需等待一段時(shí)間之后,才能清除 USB 模塊的復(fù)位信號(hào)(清除 CNTR 寄存器上的 FRES 位),和ISTR 寄存器的內(nèi)容,以便在使能其他任何單元的操作之前清除未處理的假中斷標(biāo)志。
最后,應(yīng)用程序需要通過(guò)配置設(shè)備時(shí)鐘管理邏輯的相應(yīng)控制位來(lái)為 USB 模塊提供標(biāo)準(zhǔn)所定義的48MHz 時(shí)鐘。
當(dāng)系統(tǒng)復(fù)位時(shí),應(yīng)用程序應(yīng)該初始化所有需要的寄存器和分組緩沖區(qū)描述表,使 USB 模塊能夠產(chǎn)生正常的中斷和完成數(shù)據(jù)傳輸。所有與端點(diǎn)無(wú)關(guān)的寄存器需要根據(jù)應(yīng)用的需求進(jìn)行初始化(比如中斷使能的選擇,分組緩沖區(qū)地址的選擇等)。接下來(lái)按照 USB 復(fù)位處理(參見(jiàn)下段)。
USB 復(fù)位(RESET 中斷)
發(fā)生 USB 復(fù)位時(shí),USB 模塊進(jìn)入前面章節(jié)中描述過(guò)的系統(tǒng)復(fù)位狀態(tài):所有端點(diǎn)的通信都被禁止(USB 模塊不會(huì)響應(yīng)任何分組)。在 USB 復(fù)位后,USB 模塊被使能,同時(shí)地址為 0 的默認(rèn)控制端點(diǎn)(端點(diǎn) 0)也需要被使能。這可以通過(guò)配置 USB_DADDR 寄存器的 EF 位,EP0R 寄存器和相關(guān)的分組緩沖區(qū)來(lái)實(shí)現(xiàn)。
在 USB 設(shè)備的枚舉階段,主機(jī)將分配給設(shè)備一個(gè)唯一的地址,這個(gè)地址必須寫入U(xiǎn)SB_DADDR 寄存器的 ADD[6:0]位中,同時(shí)配置其他所需的端點(diǎn)。
當(dāng)復(fù)位中斷產(chǎn)生時(shí),應(yīng)用程序必需在中斷產(chǎn)生后的 10ms 之內(nèi)使能端點(diǎn) 0 的傳輸。
分組緩沖區(qū)的結(jié)構(gòu)和用途
每個(gè)雙向端點(diǎn)都可以接收或發(fā)送數(shù)據(jù)。接收到的數(shù)據(jù)存儲(chǔ)在該端點(diǎn)指定的專用緩沖區(qū)內(nèi),而另一個(gè)緩沖區(qū)則用于存放待發(fā)送的數(shù)據(jù)。對(duì)這些緩沖區(qū)的訪問(wèn)由分組緩沖區(qū)接口模塊實(shí)現(xiàn),它提出緩沖區(qū)訪問(wèn)請(qǐng)求,并等待確認(rèn)信息后返回。
為防止產(chǎn)生微控制器與 USB 模塊對(duì)緩沖區(qū)的訪問(wèn)沖突,緩沖區(qū)接口模塊使用仲裁制,使 APB1 總線的一半周期用于微控制器的訪問(wèn),另一半保證 USB模塊的訪問(wèn)。這樣,微控制器和 USB 模塊對(duì)分組緩沖區(qū)的訪問(wèn)如同對(duì)一個(gè)雙端口 SRAM 的訪問(wèn),即使微控制器連續(xù)訪問(wèn)緩沖區(qū),也不會(huì)產(chǎn)生訪問(wèn)沖突。USB 模塊使用固定的時(shí)鐘,按照 USB 標(biāo)準(zhǔn),此時(shí)鐘頻率被固定為 48MHz。APB1 總線的時(shí)鐘可以大于或者小于這個(gè)頻率。
注意: 為滿足 USB 數(shù)據(jù)傳輸率和分組緩沖區(qū)接口的系統(tǒng)需求,APB1 總線時(shí)鐘的頻率必須大于 8MHz,以避免數(shù)據(jù)緩沖區(qū)溢出或不滿每個(gè)端點(diǎn)對(duì)應(yīng)于兩個(gè)分組緩沖區(qū)(一般一個(gè)用于發(fā)送,另一個(gè)用于接收)。這些緩沖區(qū)可以位于整個(gè)分組存儲(chǔ)區(qū)的任意位置,因?yàn)樗鼈兊牡刂泛烷L(zhǎng)度都定義在緩沖區(qū)描述表中,而緩沖區(qū)描述表也同樣位于分組緩沖區(qū)中,其地址由 USB_BTABLE 寄存器確定。緩沖區(qū)描述表的每個(gè)表項(xiàng)都關(guān)聯(lián)到一個(gè)端點(diǎn)寄存器,它由 4 個(gè) 16 位的字組成,因此緩沖區(qū)描述表的起始地址按 8 字節(jié)對(duì)齊(寄存器的最低 3 位總是'000')。第 21.5.3 節(jié)詳細(xì)介紹緩沖區(qū)描述表表項(xiàng)。如果是非同步非雙緩沖的單向端點(diǎn),只需要一個(gè)分組緩沖區(qū)(即發(fā)送方向上的分組緩沖區(qū))。其他未用到的端點(diǎn)或某個(gè)未使用的方向上的緩沖區(qū)描述表項(xiàng)可以用于其他用途。
分組緩沖區(qū)對(duì)應(yīng)的緩沖區(qū)描述表項(xiàng)定位
不管是接收還是發(fā)送,分組緩沖區(qū)都是從底部開(kāi)始使用的。USB 模塊不會(huì)改變超出當(dāng)前分配到的緩沖區(qū)區(qū)域以外的其他緩沖區(qū)的內(nèi)容。如果緩沖區(qū)收到一個(gè)比自己大的數(shù)據(jù)分組,它只會(huì)接收最大為自身大小的數(shù)據(jù),其他的丟掉,即發(fā)生了所謂的緩沖區(qū)溢出異常。
端點(diǎn)初始化
初始化端點(diǎn)的第一步是把適當(dāng)?shù)闹祵懙?ADDRn_TX 或 ADDRn_RX 寄存器中,以便 USB 模塊能找到要傳輸?shù)臄?shù)據(jù)或準(zhǔn)備好接收數(shù)據(jù)的緩沖區(qū)。USB_EPnR 寄存器的 EP_TYPE 位確定端點(diǎn)的基本類型,EP_KIND 位確定端點(diǎn)的特殊特性。作為發(fā)送方,需要設(shè)置 USB_EPnR 寄存器的 STAT_TX 位來(lái)使能端點(diǎn),并配置 COUNTn_TX 位決定發(fā)送長(zhǎng)度。作為接收方,需要設(shè)置 STAT_RX 位來(lái)使能端點(diǎn),并且設(shè)置 BL_SIZE 和 NUM_BLOCK 位,確定接收緩沖區(qū)的大小,以檢測(cè)緩沖區(qū)溢出的異常。
對(duì)于非同步非雙緩沖批量傳輸?shù)膯蜗蚨它c(diǎn),只需要設(shè)置一個(gè)傳輸方向上的寄存器。一旦端點(diǎn)被使能,應(yīng)用程序就不能再修改 USB_EPnR 寄存器的值和 ADDRn_TX/ADDRn_RX,COUNTn_TX/COUNTn_RX 所在的位置,因?yàn)檫@些值會(huì)被硬件實(shí)時(shí)修改。當(dāng)數(shù)據(jù)傳輸完成時(shí),CTR 中斷會(huì)產(chǎn)生,此時(shí)上述寄存器可以被訪問(wèn),并重新使能新的傳輸。
IN 分組(用于數(shù)據(jù)發(fā)送)
當(dāng)接收到一 IN 令牌分組時(shí),如果接收到的地址和一個(gè)配置好的端點(diǎn)地址相符合的話,USB 模塊將會(huì)根據(jù)緩沖區(qū)描述表的表項(xiàng),訪問(wèn)相應(yīng)的 ADDRn_TX 和 COUNTn_TX 寄存器,并將這些寄存器中的數(shù)值存儲(chǔ)到內(nèi)部的 16 位寄存器 ADDR 和 COUNT(應(yīng)用程序無(wú)法訪問(wèn))中。此時(shí),USB 模塊開(kāi)始根據(jù) DTOG_TX 位發(fā)送 DATA0 或 DATA1 分組,并訪問(wèn)緩沖區(qū)(請(qǐng)參考'分組緩沖區(qū)的結(jié)構(gòu)和用途'段落)。
在 IN 分組傳輸完畢之后,從緩沖區(qū)讀到的第一個(gè)字節(jié)將被裝載到輸出移位寄存器中,并開(kāi)始發(fā)送。最后一個(gè)數(shù)據(jù)字節(jié)發(fā)送完成之后,計(jì)算好的 CRC 將被發(fā)送。如果收到的分組所對(duì)應(yīng)的端點(diǎn)是無(wú)效的,將根據(jù) USB_EPnR 寄存器上的 STAT_TX 位發(fā)送 NAK 或 STALL 握手分組而不發(fā)送數(shù)據(jù)。
ADDR 內(nèi)部寄存器被用作當(dāng)前緩沖區(qū)的指針,COUNT 寄存器用于記錄剩下未傳輸?shù)淖止?jié)數(shù)。USB總線使用低字節(jié)在先的方式傳輸從緩沖區(qū)中讀出的數(shù)據(jù)。數(shù)據(jù)從 ADDRn_TX 指向的數(shù)據(jù)分組緩沖區(qū)開(kāi)始讀取,長(zhǎng)度為 COUNTn_TX/2 個(gè)字。如果發(fā)送的數(shù)據(jù)分組為奇數(shù)個(gè)字節(jié),則只使用最后一個(gè)字的低 8 位。
在接收到主機(jī)響應(yīng)的 ACK 后,USB_EPnR 寄存器的值有以下更新:DTOG_TX 位被翻轉(zhuǎn),STAT_TX位為'10',使端點(diǎn)無(wú)效,CTR_TX 位被置位。應(yīng)用程序需要通過(guò) USB_ISTR 寄存器的 EP_ID 和 DIR 位識(shí)別產(chǎn)生中斷的 USB 端點(diǎn)。CTR_TX 事件的中斷服務(wù)程序需要首先清除中斷標(biāo)志位,然后準(zhǔn)備好需要發(fā)送的數(shù)據(jù)緩沖區(qū),更新 COUNTn_TX 為下次需要傳輸?shù)淖止?jié)數(shù),最后再設(shè)置 STAT_TX 位為'11'(端點(diǎn)有效),再次使能數(shù)據(jù)傳輸。
當(dāng) STAT_TX 位為'10'時(shí)(端點(diǎn)為 NAK 狀態(tài)),任何發(fā)送到該端點(diǎn)的 IN 請(qǐng)求都會(huì)被 NAK,USB 主機(jī)會(huì)重發(fā) IN 請(qǐng)求直到該端點(diǎn)確認(rèn)請(qǐng)求有效。上述操作過(guò)程是必需遵守的,以避免丟失緊隨上一次 CTR 中斷請(qǐng)求的下一個(gè) IN 傳輸請(qǐng)求。
OUT 分組和 SETUP 分組(用于數(shù)據(jù)接收)
USB 模塊對(duì)這兩種分組的處理方式基本相同;對(duì) SETUP 分組的特殊處理將在下面關(guān)于控制傳輸部分詳細(xì)說(shuō)明。當(dāng)接收到一個(gè) OUT 或 SETUP 分組時(shí),如果地址和某個(gè)有效端點(diǎn)的地址相匹配,USB模塊將訪問(wèn)緩沖區(qū)描述表,找到與該端點(diǎn)相關(guān)的 ADDRn_RX 和 COUNTn_RX 寄存器,并將ADDRn_RX寄存器的值保存在內(nèi)部 ADDR 寄存器中。
同時(shí),COUNT 會(huì)被被復(fù)位,從 COUNTn_RX中讀出的 BL_SIZE 和 NUM_BLOCK 的值用于初始化內(nèi)部 16 位寄存器 BUF_COUNT,該寄存器用于檢測(cè)緩沖區(qū)溢出(所有的內(nèi)部寄存器都不能被應(yīng)用程序訪問(wèn))。USB 模塊將隨后收到的數(shù)據(jù)按字方式組織(先收到的為低字節(jié)),并存儲(chǔ)到 ADDR 指向的分組緩沖區(qū)中。同時(shí),BUF_COUNT 值自動(dòng)遞減,COUNT 值自動(dòng)遞增。當(dāng)檢測(cè)到數(shù)據(jù)分組的結(jié)束信號(hào)時(shí),USB 模塊校驗(yàn)收到 CRC 的正確性。如果傳輸中沒(méi)有任何錯(cuò)誤發(fā)生,則發(fā)送 ACK握手分組到主機(jī)。即使發(fā)生 CRC錯(cuò)誤或者其他類型的錯(cuò)誤(位填充,幀錯(cuò)誤等),數(shù)據(jù)還是會(huì)被保存到分組緩沖區(qū)中,至少會(huì)保存到發(fā)生錯(cuò)誤的數(shù)據(jù)點(diǎn),只是不會(huì)發(fā)送 ACK 分組,并且 USB_ISTR 寄存器的 ERR 位將會(huì)置位。在這種情況下,應(yīng)用程序通常不需要干涉處理,USB 模塊將從傳輸錯(cuò)誤中自動(dòng)恢復(fù),并為下一次傳輸做好準(zhǔn)備。如果收到的分組所對(duì)應(yīng)的端點(diǎn)沒(méi)有準(zhǔn)備好,USB 模塊將根據(jù) USB_EPnR 寄存器的 STAT_RX 位發(fā)送 NAK 或 STALL 分組,數(shù)據(jù)將不會(huì)被寫入接收緩沖區(qū)。
ADDRn_RX 的值決定接收緩沖區(qū)的起始地址,長(zhǎng)度由包含 CRC 的數(shù)據(jù)分組的長(zhǎng)度(即有效數(shù)據(jù)長(zhǎng)度+2)決定,但不能超過(guò) BL_SIZE 和 NUM_BLOCK 所定義的緩沖區(qū)的長(zhǎng)度。如果接收到的數(shù)據(jù)分組的長(zhǎng)度超出了緩沖區(qū)的范圍,超過(guò)范圍的數(shù)據(jù)不會(huì)被寫入緩沖區(qū),USB 模塊將報(bào)告緩沖區(qū)發(fā)生溢出,并向主機(jī)發(fā)送 STALL 握手分組,通知此次傳輸失敗,也不產(chǎn)生中斷。
如果傳輸正確完成,USB 模塊將發(fā)送 ACK 握手分組,內(nèi)部的 COUNT 寄存器的值會(huì)被復(fù)制到相應(yīng)的COUNTn_RX 寄存器中,BL_SIZE 和 NUM_BLOCK 的值保持不變,也不需要重寫。USB_EPnR 寄存器按下列方式更新:DTOG_RX 位翻轉(zhuǎn),STAT_RX=10(NAK)使端點(diǎn)無(wú)效,CTR_RX 位置位(如果 CTR中斷已使能,將觸發(fā)中斷)。如果傳輸過(guò)程中發(fā)生了錯(cuò)誤或者緩沖區(qū)溢出,前面所列出的動(dòng)作都不會(huì)發(fā)生。
CRT 中斷發(fā)生時(shí),應(yīng)用程序需要首先根據(jù) USB_ISTR 寄存器的 EP_ID 和 DIR 位識(shí)別是哪個(gè)端點(diǎn)的中斷請(qǐng)求。在處理 CTR_RX 中斷事件時(shí),應(yīng)用程序首先要確定傳輸?shù)念愋?根據(jù) USB_EPnR寄存器的 SETUP 位),同時(shí)清除中斷標(biāo)志位,然后讀相關(guān)的緩沖區(qū)描述表表項(xiàng)指向的 COUNTn_RX寄存器,獲得此次傳輸?shù)目傋止?jié)數(shù)。處理完接收到的數(shù)據(jù)后,應(yīng)用程序需要將 USB_EPnR 中的STAT_RX位置成'11',使能下一次的的傳輸。當(dāng) STAT_RX位為'10'時(shí)(NAK),任何一個(gè)發(fā)送到端點(diǎn)上的 OUT 請(qǐng)求都會(huì)被 NAK,PC 主機(jī)將不斷重發(fā)被 NAK 的分組,直到收到端點(diǎn)的 ACK 握手分組。以上描述的操作次序是必需遵守的,以避免丟失緊隨上一個(gè) CTR 中斷的另一個(gè) OUT 分組請(qǐng)求。
控制傳輸
控制傳輸由 3 個(gè)階段組成,首先是主機(jī)發(fā)送 SETUP 分組的 SETUP 階段,然后是主機(jī)發(fā)送零個(gè)或多個(gè)數(shù)據(jù)的數(shù)據(jù)階段,最后是狀態(tài)階段,由與數(shù)據(jù)階段方向相反的數(shù)據(jù)分組構(gòu)成。SETUP 傳輸只發(fā)生在控制端點(diǎn),它非常類似于 OUT 分組的傳輸過(guò)程。使能 SETUP 傳輸除了需要分別初始化DTOG_TX 位為'1',DTOG_RX 位為'0'外,還需要設(shè)置 STAT_TX 位和 STAT_RX 位為 10(NAK),由應(yīng)用程序根據(jù) SETUP 分組的相應(yīng)字段決定后面的傳輸是 IN 還是 OUT。
控制端點(diǎn)在每次發(fā)生CTR_RX中斷時(shí),都必須檢查USB_EPnR寄存器的SETUP位,以識(shí)別是普通的OUT分組還是SETUP分組。USB 設(shè)備應(yīng)該能夠通過(guò) SETUP 分組中的相應(yīng)數(shù)據(jù)決定數(shù)據(jù)階段傳輸?shù)淖止?jié)數(shù)和方向,并且能在發(fā)生錯(cuò)誤的情況下發(fā)送 STALL 分組,拒絕數(shù)據(jù)的傳輸。因此在數(shù)據(jù)階段,未被使用到的方向都應(yīng)該被設(shè)置成 STALL,并且在開(kāi)始傳輸數(shù)據(jù)階段的最后一個(gè)數(shù)據(jù)分組時(shí),其反方向的傳輸仍設(shè)成 NAK 狀態(tài),這樣,即使主機(jī)立刻改變了傳輸方向(進(jìn)入狀態(tài)階段),仍然可以保持為等待控制傳輸結(jié)束的狀態(tài)。在控制傳輸成功結(jié)束后,應(yīng)用程序可以把 NAK 變?yōu)?VALD,如果控制傳輸出錯(cuò),就改為 STALL。
此時(shí),如果狀態(tài)分組是由主機(jī)發(fā)送給設(shè)備的,那么 STATUS_OUT 位(USB_EPnR 寄存器中的 EP_KIND)應(yīng)該被置位,只有這樣,在狀態(tài)傳輸過(guò)程中收到了非零長(zhǎng)度的數(shù)據(jù)分組,才會(huì)產(chǎn)生傳輸錯(cuò)誤。在完成狀態(tài)傳輸階段后,應(yīng)用程序應(yīng)該清除 STATUS_OUT 位,并且將 STAT_RX 設(shè)為 VALID 表示已準(zhǔn)備好接收一個(gè)新的命令請(qǐng)求,STAT_TX 則設(shè)為 NAK,表示在下一個(gè) SETUP 分組傳輸完成前,不接受數(shù)據(jù)傳輸?shù)恼?qǐng)求。
USB 規(guī)范定義 SETUP 分組不能以非 ACK 握手分組來(lái)響應(yīng),如果 SETUP 分組傳輸失敗,則會(huì)引發(fā)下一個(gè) SETUP 分組。因此,以 NAK 或 STALL 分組響應(yīng)主機(jī)的 SETUP 分組是被禁止的。當(dāng) STAT_RX 位被設(shè)置為'01'(STALL)或'10'(NAK)時(shí),如果收到 SETUP 分組,USB 模塊會(huì)接收分組,開(kāi)始分組所要求的數(shù)據(jù)傳輸,并回送 ACK 握手分組。如果應(yīng)用程序在處理前一個(gè) CTR_RX 事件時(shí)USB 模塊又收到了 SETUP 分組(即 CTR_RX 仍然保持置位),USB 模塊會(huì)丟掉收到的 SETUP 分組,并且不回答任何握手分組,以此來(lái)模擬一個(gè)接收錯(cuò)誤,迫使主機(jī)再次發(fā)送 SETUP 分組。這樣做是為了避免丟失緊隨一次 CTR_RX 中斷之后的又一個(gè) SETUP 分組傳輸。
4.2 雙緩沖端點(diǎn)
USB 標(biāo)準(zhǔn)不僅為不同的傳輸模式定義了不同的端點(diǎn)類型,而且對(duì)這些數(shù)據(jù)傳輸所需要的系統(tǒng)要求做了描述。其中,批量端點(diǎn)適用于在主機(jī) PC 和 USB 設(shè)備之間傳輸大批量的數(shù)據(jù),因?yàn)橹鳈C(jī)可以在一幀內(nèi)利用盡可能多的帶寬批量傳輸數(shù)據(jù),使傳輸效率得到提高。然而,當(dāng) USB 設(shè)備處理前一次的數(shù)據(jù)傳輸時(shí),又收到新的數(shù)據(jù)分組,它將回應(yīng) NAK 分組,使 PC 主機(jī)不斷重發(fā)同樣的數(shù)據(jù)分組,直到設(shè)備在可以處理數(shù)據(jù)時(shí)回應(yīng) ACK 分組。這樣的重傳占用了很多帶寬,影響了批量傳輸?shù)乃俾剩虼艘肓伺慷它c(diǎn)的雙緩沖機(jī)制,提高數(shù)據(jù)傳輸率。
使用雙緩沖機(jī)制時(shí),單向端點(diǎn)的數(shù)據(jù)傳輸將使用到該端點(diǎn)的接收和發(fā)送兩塊數(shù)據(jù)緩沖區(qū)。數(shù)據(jù)翻轉(zhuǎn)位用來(lái)選擇當(dāng)前使用到兩塊緩沖區(qū)中的哪一塊,使應(yīng)用程序可以在 USB 模塊訪問(wèn)其中一塊緩沖區(qū)的同時(shí),對(duì)另一塊緩沖區(qū)進(jìn)行操作。例如,對(duì)一個(gè)雙緩沖批量端點(diǎn)進(jìn)行 OUT 分組傳輸時(shí),USB模塊將來(lái)自 PC 主機(jī)的數(shù)據(jù)保存到一個(gè)緩沖區(qū),同時(shí)應(yīng)用程序可以對(duì)另一個(gè)緩沖區(qū)中的數(shù)據(jù)進(jìn)行處理(對(duì)于 IN 分組來(lái)說(shuō),情況是一樣的)。因?yàn)榍袚Q緩沖區(qū)的管理機(jī)制需要用到所有 4 個(gè)緩沖區(qū)描述表的表項(xiàng),分別用來(lái)表示每個(gè)方向上的兩個(gè)緩沖區(qū)的地址指針和緩沖區(qū)大小,因此用來(lái)實(shí)現(xiàn)雙緩沖批量端點(diǎn)的 USB_EPnR 寄存器必需配置為單向。所以只需要設(shè)定 STAT_RX 位(作為雙緩沖批量接收端點(diǎn))或者 STAT_TX 位(作為雙緩沖批量發(fā)送端點(diǎn))。
如果需要一個(gè)雙向的雙緩沖批量端點(diǎn),則須使用兩個(gè) USB_EPnR 寄存器。為盡可能利用雙緩沖的優(yōu)勢(shì),達(dá)到較高的傳輸速率,雙緩沖批量端點(diǎn)的流量控制流程與其他端點(diǎn)的稍有不同。它只在緩沖區(qū)發(fā)生訪問(wèn)沖突時(shí)才會(huì)設(shè)置端點(diǎn)為 NAK 狀態(tài),而不是在每次傳輸成功后都將端點(diǎn)設(shè)為 NAK 狀態(tài)。
DTOG 位用來(lái)標(biāo)識(shí) USB 模塊當(dāng)前所使用的儲(chǔ)存緩沖區(qū)。雙緩沖批量端點(diǎn)接收方向的緩沖區(qū)由DTOG_RX(USB_EPnR 寄存器的第 14 位)標(biāo)識(shí),而雙緩沖批量端點(diǎn)發(fā)送方向的緩沖區(qū)由DTOG_TX(USB_EPnR 寄存器的第 6 位)標(biāo)識(shí)。同時(shí),USB 模塊也需要知道當(dāng)前哪個(gè)緩沖區(qū)正在被應(yīng)用程序使用,以避免發(fā)生沖突。由于 USB_EPnR 寄存器中有 2 個(gè) DTOG 位,而 USB 模塊只使用其中的一位來(lái)標(biāo)識(shí)硬件所使用的緩沖區(qū),因此,應(yīng)用程序可使用另一位來(lái)標(biāo)識(shí)當(dāng)前正在使用哪個(gè)緩
沖區(qū),這個(gè)新的標(biāo)識(shí)被稱為 SW_BUF 位。下表列出了雙緩沖批量端點(diǎn)在實(shí)現(xiàn)發(fā)送和接收操作時(shí),USB_EPNR 寄存器的 DTOG 位和 SW_BUF 位之間的關(guān)系。
雙緩沖批量端點(diǎn)緩沖區(qū)標(biāo)識(shí)定義
緩沖區(qū)標(biāo)識(shí)位 | 作為發(fā)送端點(diǎn) | 作為接收端點(diǎn) |
DTOG | DTOG_TX (USB_EPnR 寄存器的第 6 位) | DTOG_RX (USB_EPnR 寄存器的第 14 位) |
SW_BUF | USB_EPnR 寄存器的第 14 位 | USB_EPnR 寄存器的第 6 位 |
USB 模塊當(dāng)前使用的緩沖區(qū)由 DTOG 位標(biāo)識(shí),而應(yīng)用程序所使用的緩沖區(qū)由 SW_BUF 位標(biāo)識(shí),這兩個(gè)位的標(biāo)識(shí)方式相同,下表描述了這種標(biāo)識(shí)方式。
雙緩沖批量端點(diǎn)的緩沖區(qū)使用標(biāo)識(shí)
端點(diǎn)類型 | DTOG 位 | SW_BUF 位 | USB 模塊使用的緩沖區(qū) | 應(yīng)用程序使用的緩沖區(qū) |
IN 端點(diǎn) | 0 | 1 | ADDRn_TX_0/COUNTn_TX_0 | ADDRn_TX_1/COUNTn_TX_1 |
OUT 端點(diǎn) | 1 | 0 | ADDRn_RX_1/COUNTn_RX_1 | ADDRn_RX_0/COUNTn_RX_0 |
OUT 端點(diǎn) | 0 | 0 | 無(wú) (1) | ADDRn_RX_0/COUNTn_RX_0 |
OUT 端點(diǎn) | 1 | 1 | 無(wú) (1) | ADDRn_RX_0/COUNTn_RX_0 |
1.端點(diǎn)處于 NAK 狀態(tài)
可以通過(guò)以下方式設(shè)置一個(gè)雙緩沖批量端點(diǎn):
?將 USB_EPnR 寄存器的 EP_TYPE 位設(shè)為'00',定義端點(diǎn)為批量端點(diǎn)
?將 USB_EPnR 寄存器的 EP_KIND 位設(shè)為'1',定義端點(diǎn)為雙緩沖端點(diǎn)
應(yīng)用程序根據(jù)傳輸開(kāi)始時(shí)用到的緩沖區(qū)來(lái)初始化 DTOG 和 SW_BUF 位;這需要考慮到這兩位的數(shù)據(jù)翻轉(zhuǎn)特性。設(shè)置好 DBL_BUF 位之后,每完成一次傳輸后,USB 模塊將根據(jù)雙緩沖批量端點(diǎn)的流量控制操作,并且持續(xù)到 DBL_BUF 變?yōu)闊o(wú)效為止。
每次傳輸結(jié)束,根據(jù)端點(diǎn)的傳輸方向,CTR_RX 位或 CTR_TX 位將會(huì)置為'1'。與此同時(shí),硬件將設(shè)置相應(yīng)的 DTOG 位,完全獨(dú)立于軟件來(lái)實(shí)現(xiàn)緩沖區(qū)交換機(jī)制。DBL_BUF 位設(shè)置后,每次傳輸結(jié)束時(shí),雙緩沖批量端點(diǎn)的 STAT 位的取值不會(huì)像其他類型端點(diǎn)一樣受到傳輸過(guò)程的影響,而是一直保持為'11'(有效)。但是,如果在收到新的數(shù)據(jù)分組的傳輸請(qǐng)求時(shí),USB 模塊和應(yīng)用程序發(fā)生了緩沖區(qū)訪問(wèn)沖突(即 DTOG 和 SW_BUF 為相同的值,),狀態(tài)位將會(huì)被置為'10'(NAK)。應(yīng)用程序響應(yīng) CTR 中斷時(shí),首先要清除中斷標(biāo)志,然后再處理傳輸完成的數(shù)據(jù)。
應(yīng)用程序訪問(wèn)緩沖區(qū)之后,需要翻轉(zhuǎn) SW_BUF 位,以通知 USB模塊該塊緩沖區(qū)已變?yōu)榭捎脿顟B(tài)。由此,雙緩沖批量傳輸?shù)?NAK 分組的數(shù)目只由應(yīng)用程序處理一次數(shù)據(jù)傳輸?shù)目炻鶝Q定:如果數(shù)據(jù)處理的時(shí)間小于 USB 總線上完成一次數(shù)據(jù)傳輸?shù)臅r(shí)間,則不會(huì)發(fā)生重傳,此時(shí),數(shù)據(jù)的傳輸率僅受限于 USB 主機(jī)。
應(yīng)用程序也可以不考慮雙緩沖批量端點(diǎn)的特殊控制流程,直接在相應(yīng) USB_EPnR 寄存器的 STAT 位寫入非'11'的任何狀態(tài),在這種情況下,USB 模塊將按照寫入的狀態(tài)執(zhí)行流程而忽略緩沖器實(shí)際的使用情況。
4.3 同步傳輸
USB 標(biāo)準(zhǔn)定義了一種全速的需要保持固定和精確的數(shù)據(jù)傳輸率的傳輸方式:同步傳輸。同步傳輸一般用于傳輸音頻流、壓縮的視頻流等對(duì)數(shù)據(jù)傳輸率有嚴(yán)格要求的數(shù)據(jù)。一個(gè)端點(diǎn)如果在枚舉時(shí)被定義為“同步端點(diǎn)”,USB 主機(jī)則會(huì)為每個(gè)幀分配固定的帶寬,并且保證每個(gè)幀正好傳送一個(gè)IN 分組或者 OUT 分組(由端點(diǎn)傳輸方向確定分組類型)。為了滿足帶寬要求,同步傳輸中沒(méi)有出錯(cuò)重傳;這也就意味著,同步傳輸在發(fā)送或接收數(shù)據(jù)分組之后,無(wú)握手協(xié)議,即不會(huì)發(fā)送 ACK 分組。同樣,同步傳輸只傳送 PID(分組 ID)為 DATA0 的數(shù)據(jù)包,而不會(huì)用到數(shù)據(jù)翻轉(zhuǎn)機(jī)制。
通過(guò)設(shè)置 USB_EPnR 寄存器 EP_TYPE 為'10',可以使其成為同步端點(diǎn)。同步端點(diǎn)沒(méi)有握手機(jī)制,根據(jù) USB 標(biāo)準(zhǔn)中的說(shuō)明,USB_EPnR 寄存器的 STAT_RX 位和 STAT_TX 位分別只能設(shè)成'00'(禁止)和'11'(有效)。同步傳輸通過(guò)實(shí)現(xiàn)雙緩沖機(jī)制來(lái)簡(jiǎn)化軟件應(yīng)用程序開(kāi)發(fā),它同樣使用兩個(gè)緩沖區(qū),以確保在 USB 模塊使用其中一塊緩沖區(qū)時(shí),應(yīng)用程序可以訪問(wèn)另外一塊緩沖區(qū)。USB 模塊使用的緩沖區(qū)根據(jù)不同的傳輸方向,由不同的 DTOG 位來(lái)標(biāo)識(shí)。(同一寄存器中的DTOG_RX 位用來(lái)標(biāo)識(shí)接收同步端點(diǎn),DTOG_TX 位用來(lái)標(biāo)識(shí)發(fā)送同步端點(diǎn)),見(jiàn)下表。
步端點(diǎn)的緩沖區(qū)使用標(biāo)識(shí)同
端點(diǎn)類型 | USB 模塊使用的緩沖區(qū) | 應(yīng)用程序使用的緩沖區(qū) | |
IN 端點(diǎn) | 0 | ADDRn_TX_0/COUNTn_TX_0 | ADDRn_TX_1/COUNTn_TX_1 |
IN 端點(diǎn) | 1 | ADDRn_TX_1/COUNTn_TX_1 | ADDRn_TX_0/COUNTn_TX_0 |
OUT 端點(diǎn) | 0 | ADDRn_RX_0/COUNTn_RX_0 | ADDRn_RX_1/COUNTn_RX_1 |
OUT 端點(diǎn) | 1 | ADDRn_RX_1/COUNTn_RX_1 | ADDRn_RX_0/COUNTn_RX_0 |
與雙緩沖批量端點(diǎn)一樣,一個(gè) USB_EPnR 寄存器只能處理同步端點(diǎn)單方向的數(shù)據(jù)傳輸,如果要求同步端點(diǎn)在兩個(gè)傳輸方向上都有效,則需要使用兩個(gè) USB_EPnR 寄存器。應(yīng)用程序需要根據(jù)首次傳輸?shù)臄?shù)據(jù)分組來(lái)初始化 DTOG 位;它的取值還需要考慮到 DTOG_RX 或DTOG_TX 兩位的數(shù)據(jù)翻轉(zhuǎn)特性。每次傳輸完成時(shí),USB_EPnR 寄存器的 CTR_RX 位或 CTR_TX 位置位。與此同時(shí),相關(guān)的 DTOG 位由硬件翻轉(zhuǎn),從而使得交換緩沖區(qū)的操作完全獨(dú)立于應(yīng)用程序。傳輸結(jié)束時(shí),STAT_RX 或 STAT_TX 位不會(huì)發(fā)生變化,因?yàn)橥絺鬏敍](méi)有握手機(jī)制,所以不需要任何流量控制,而一直設(shè)為'11'(有效)。同步傳輸中,即使 OUT 分組發(fā)生 CRC 錯(cuò)誤或者緩沖區(qū)溢出,本次傳輸仍被看作是正確的,并且可以觸發(fā) CTR_RX 中斷事件;但是,發(fā)生 CRC 錯(cuò)誤時(shí)硬件會(huì)設(shè)置 USB_ISTR 寄存器的 ERR 位,提醒應(yīng)用程序數(shù)據(jù)可能損壞。
4.4 掛起/恢復(fù)事件
USB 標(biāo)準(zhǔn)中定義了一種特殊的設(shè)備狀態(tài),即掛起狀態(tài),在這種狀態(tài)下 USB 總線上的平均電流消耗不超過(guò) 500uA。這種電流限制對(duì)于由總線供電的 USB 設(shè)備至關(guān)重要,而自供電的設(shè)備則不需要嚴(yán)格遵守這樣的電流消耗限制。USB 主機(jī)以 3 毫秒內(nèi)不發(fā)送任何信號(hào)標(biāo)志進(jìn)入掛起狀態(tài)。通常情況下 USB 主機(jī)每毫秒會(huì)發(fā)送一個(gè) SOF,當(dāng) USB 模塊檢測(cè)到 3 個(gè)連續(xù)的 SOF 分組丟失事件即可判定主機(jī)發(fā)出了掛起請(qǐng)求,接著它會(huì)置位 SB_ISTR 寄存器的 SUSP 位,以觸發(fā)掛起中斷。USB 設(shè)備進(jìn)入掛起狀態(tài)之后,將由“喚醒”序列喚醒。所謂的“喚醒”序列,可以由 USB 主機(jī)發(fā)起,也可以由 USB設(shè)備本身觸發(fā);但是,只有 USB 主機(jī)可以結(jié)束“喚醒”序列。
被掛起的 USB 模塊必須至少還具備檢測(cè) RESET 信號(hào)的功能,它會(huì)將其當(dāng)作一次正常的復(fù)位操作來(lái)執(zhí)行。實(shí)際的掛起操作過(guò)程對(duì)于不同的 USB 設(shè)備來(lái)說(shuō)是不同的,因?yàn)樾枰煌牟僮鱽?lái)降低電源消耗。下面描述了一起典型的掛起操作,重點(diǎn)介紹應(yīng)用程序如何響應(yīng) USB 模塊的 SUSP 信號(hào)。
將 USB_CNTR 寄存器的 FSUSP 置為'1',這將使 USB 模塊進(jìn)入掛起狀態(tài)。USB 模塊一旦進(jìn)入掛起狀態(tài),對(duì) SOF 的檢測(cè)立刻停止,以避免在 USB 掛起時(shí)又發(fā)生新的 SUSP 事件。
消除或減少 USB 模塊以外的其他模塊的靜態(tài)電流消耗。
將 USB_CNTR 寄存器的 LP_MODE 位置為'1',這將消除模擬 USB 收發(fā)器的靜態(tài)電流消耗,但仍能檢測(cè)到喚醒信號(hào)。
可以選擇關(guān)閉外部振蕩器和設(shè)備的 PLL,以停止設(shè)備內(nèi)部的任何活動(dòng)。當(dāng)設(shè)備處于掛起狀態(tài)時(shí)發(fā)生 USB 事件,該設(shè)備會(huì)被喚醒,并需要調(diào)用“喚醒”例程來(lái)恢復(fù)系統(tǒng)時(shí)鐘,和 USB 數(shù)據(jù)傳輸。如果喚醒設(shè)備的是 USB 復(fù)位操作,則應(yīng)該保證喚醒的過(guò)程不要超過(guò) 10 毫秒(參見(jiàn)“USB 協(xié)議規(guī)范”)。USB 模塊處于掛起狀態(tài)時(shí),喚醒或復(fù)位事件需要清除 USB_CNTR 寄存器的 LP_MODE 位。
即使喚醒事件可以立刻觸發(fā)一個(gè) WKUP 中斷事件,但由于恢復(fù)系統(tǒng)時(shí)鐘需要比較長(zhǎng)的延遲時(shí)間,處理 WKUP 中斷的中斷服務(wù)程序必須非常小心;為了減短系統(tǒng)喚醒的時(shí)間,建議將喚醒代碼直接寫在掛起代碼后面,這樣就可以在系統(tǒng)時(shí)鐘重啟后迅速進(jìn)入喚醒代碼中執(zhí)行。為防止或減少 ESD 等干擾意外地喚醒系統(tǒng)(從掛起模式退出是一個(gè)異步事件),在掛起過(guò)程中數(shù)據(jù)線被過(guò)濾,濾波寬度大約為 70nS。下面是喚醒操作的過(guò)程:
啟動(dòng)外部振蕩器和設(shè)備的 PLL(此項(xiàng)可選)。
清零 USB_CNTR 寄存器的 FSUSP 位。
USB_FNR 寄存器的 RXDP 和 RXDM 位可以用來(lái)判斷是什么觸發(fā)了喚醒事件,如表 124 所示,它還同時(shí)列出了各種情況軟件應(yīng)該采取的操作。如果需要的話,可以通過(guò)檢測(cè)這兩位變成'10'(代表空閑總線狀態(tài))的時(shí)間來(lái)知道喚醒或復(fù)位事件的結(jié)束。此外,在復(fù)位事件結(jié)束時(shí),USB_ISTR 寄存器的 RESET 位被置為'1',如果 RESET 中斷被使能,就會(huì)產(chǎn)生中斷。此中斷應(yīng)該按正常的復(fù)位操作處理。
喚醒事件檢測(cè)
[RXDP, RXDM] 的狀態(tài) | 喚醒事件 | 應(yīng)用程序應(yīng)執(zhí)行的操作 |
00 | 復(fù)位 | 無(wú) |
10 | 無(wú) (總線干擾) | 恢復(fù)到掛起狀態(tài) |
01 | 恢復(fù)掛起 | 無(wú) |
11 | 未定義的值 (總線干擾) | 恢復(fù)到掛起狀態(tài) |
設(shè)備可能不是被與 USB 模塊相關(guān)的事件喚醒的(例如一個(gè)鼠標(biāo)的移動(dòng)可喚醒整個(gè)系統(tǒng))。在這種情況下,先將 USB_CNTR 寄存器的 RESUME 位置為'1',然后在 1ms-15ms 之間再把它清為 0 可以啟動(dòng)喚醒序列(這個(gè)間隔可以用 ESOF 中斷來(lái)實(shí)現(xiàn),該中斷在內(nèi)核正常運(yùn)行時(shí)每 1ms 發(fā)生一次)。RESUME 位被清零后,喚醒過(guò)程將由主機(jī) PC 完成,可以利用 USB_FNR 寄存器的 RXDP 和 RXDM 位來(lái)判斷喚醒是否完成。
注意:只有在 USB 模塊被設(shè)置為掛起狀態(tài)時(shí)(設(shè)置 USB_CNTR 寄存器的 FSUSP 位為'1'),才可以設(shè)置 RESUME 位。
5 例程設(shè)計(jì)
5.1 CompositeEquipmentHID&VCP
該程序是一個(gè)基于W55MH32微控制器的USB復(fù)合設(shè)備固件,結(jié)合了虛擬串口(VCP)和HID功能,并通過(guò)USART輸出調(diào)試信息。以下是程序設(shè)計(jì)的總結(jié):
1. 系統(tǒng)初始化
時(shí)鐘配置:使用外部高速時(shí)鐘(HSE)作為PLL輸入,倍頻至目標(biāo)頻率(如HSE 8MHz ×27 = 216MHz)。配置AHB、APB1、APB2總線時(shí)鐘分頻,優(yōu)化外設(shè)時(shí)鐘。啟用內(nèi)部低速(LSI)和高速(HSI)時(shí)鐘源,可能供其他外設(shè)使用。
USART初始化:配置USART1(PA9-TX, PA10-RX),波特率115200,用于調(diào)試信息輸出。重定向printf至USART,便于通過(guò)串口打印系統(tǒng)狀態(tài)。
2. USB功能配置
USB設(shè)備初始化:設(shè)置USB時(shí)鐘(Set_USBClock)和中斷(USB_Interrupts_Config)。初始化USB協(xié)議棧(USB_Init),使能DP上拉電阻(DP_PUUP=1)以宣告設(shè)備連接。
復(fù)合設(shè)備處理:主循環(huán)監(jiān)控USB連接狀態(tài)(bDeviceState),狀態(tài)變化時(shí)通過(guò)串口通知用戶。
當(dāng)USB配置成功(CONFIGURED狀態(tài))時(shí),檢測(cè)接收緩沖區(qū)(Receive_Buffer_port)是否有數(shù)據(jù),并通過(guò)CDC接口回傳數(shù)據(jù)(CDC_Send_DATA)。
3.數(shù)據(jù)通信流程
// 主循環(huán)中的數(shù)據(jù)通信處理 while (1) { // 當(dāng)USB設(shè)備處于已配置狀態(tài)(與主機(jī)建立連接) if (bDeviceState == CONFIGURED) { // 檢查接收緩沖區(qū)是否有數(shù)據(jù)且上次發(fā)送已完成 if (Receive_length_port != 0 && packet_sent == 1) { // 通過(guò)USB CDC(虛擬串口)發(fā)送數(shù)據(jù) CDC_Send_DATA((unsigned char *)Receive_Buffer_port, Receive_length_port); // 重置接收緩沖區(qū)狀態(tài) Receive_length_port = 0; // 重新使能端點(diǎn)接收數(shù)據(jù)(準(zhǔn)備下一次接收) SetEPRxValid(ENDP7); } } // 檢測(cè)USB連接狀態(tài)變化 if (usbstatus != bDeviceState) { usbstatus = bDeviceState; // 更新?tīng)顟B(tài) // 打印連接狀態(tài)變化信息(調(diào)試用) if (usbstatus == CONFIGURED) { printf("USB connection successfuln"); } else { printf("USB disconnectedn"); } } } // USB中斷服務(wù)函數(shù)(示例,通常在其他文件中實(shí)現(xiàn)) void USB_LP_CAN1_RX0_IRQHandler(void) { USB_Istr(); // USB中斷處理主函數(shù) } // 端點(diǎn)數(shù)據(jù)接收回調(diào)函數(shù)(示例) void EP7_IN_Callback(void) { packet_sent = 1; // 標(biāo)記發(fā)送完成 } void EP6_OUT_Callback(void) { // 從端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)到應(yīng)用緩沖區(qū) Receive_length_port = USB_SIL_Read(EP6, Receive_Buffer_port); // 標(biāo)記接收到新數(shù)據(jù) new_data_received = 1; }
CDC數(shù)據(jù)傳輸:接收數(shù)據(jù)通過(guò)USB端點(diǎn)中斷填充至緩沖區(qū),主循環(huán)檢測(cè)到數(shù)據(jù)后發(fā)送。使用SetEPRxValid(ENDP7)重新使能接收端點(diǎn),準(zhǔn)備下一次數(shù)據(jù)傳輸。
調(diào)試輸出:系統(tǒng)啟動(dòng)時(shí)通過(guò)USART輸出時(shí)鐘配置信息(SYSCLK、HCLK等)。USB連接狀態(tài)變化時(shí)打印提示信息,便于調(diào)試設(shè)備狀態(tài)。
4. 關(guān)鍵代碼設(shè)計(jì)
時(shí)鐘配置函數(shù)(RCC_ClkConfiguration):通過(guò)HSE和PLL提供高精度系統(tǒng)時(shí)鐘,確保USB和USART穩(wěn)定工作。
USART重定向:SER_PutChar和fputc實(shí)現(xiàn)字符發(fā)送,支持printf格式化輸出。
USB中斷與輪詢結(jié)合:中斷處理底層數(shù)據(jù)傳輸,主循環(huán)輪詢狀態(tài)及處理應(yīng)用層邏輯。
6 下載驗(yàn)證
6.1 CompositeEquipmentHID&VCP
現(xiàn)象描述:
?上電后,USART1立即輸出系統(tǒng)時(shí)鐘信息,包括SYSCLK(如216MHz)HCLK、PCLK1/2等。
?插入U(xiǎn)SB線后,主機(jī)識(shí)別到復(fù)合設(shè)備(VCP + HID),設(shè)備管理器中顯示虛擬串口(如“USB Serial Device (COMx)”)和HID設(shè)備。
?USART打印“USB connection successful”。
?通過(guò)串口工具(如PuTTY)向虛擬串口發(fā)送數(shù)據(jù),設(shè)備立即回顯相同數(shù)據(jù)。
?USB斷開(kāi)時(shí),USART打印“USB disconnected”。
WIZnet 是一家無(wú)晶圓廠半導(dǎo)體公司,成立于 1998 年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術(shù),基于獨(dú)特的專利全硬連線 TCP/IP。iMCU? 面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。
WIZnet 在全球擁有 70 多家分銷商,在香港、韓國(guó)、美國(guó)設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營(yíng)銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國(guó)和日本除外)。
審核編輯 黃宇
-
usb
+關(guān)注
關(guān)注
60文章
8158瀏覽量
271697
發(fā)布評(píng)論請(qǐng)先 登錄
「正點(diǎn)原子Linux連載」第二十二章串口格式化函數(shù)移植實(shí)驗(yàn)
HarmonyOS內(nèi)核源碼分析(下)
【傾心力作!】i.MX8MM嵌入式linux開(kāi)發(fā)指南+全覆蓋開(kāi)發(fā)資料
火力發(fā)電廠水汽分析方法 第二十二部分:化學(xué)耗氧量的測(cè)定(高錳
實(shí)時(shí)頻譜儀原理及操作指南
第二十二講 同步時(shí)序邏輯電路的分析方法

模擬電路網(wǎng)絡(luò)課件 第二十二節(jié):功率放大電路的一般問(wèn)題
第二十二屆高交會(huì)深圳開(kāi)幕 3300多家展商亮相
2020第二十二屆高交會(huì)助力科技領(lǐng)域雙循環(huán)
第二十二屆高交會(huì)如期而至,共話云計(jì)算行業(yè)發(fā)展
第二十二屆高交會(huì)圓滿落幕,極視角與您明年相約
美高電子推出高性能迷你主機(jī),亮相深圳第二十二屆高交會(huì)
普渡機(jī)器人亮相第二十二屆中國(guó)美食節(jié)成為全場(chǎng)焦點(diǎn)

展會(huì)直擊 | 美格智能亮相IOTE 2024第二十二屆國(guó)際物聯(lián)網(wǎng)展·深圳站

巍泰技術(shù)攜多款創(chuàng)新產(chǎn)品驚艷亮相 2024 第二十二屆物聯(lián)網(wǎng)展

評(píng)論