常見USB設備類
音頻類(Audio),通信設備類(CDC),設備固件升級類(DFU),人機接口類(HID),大容量存儲設備類(Mass Storage)
USB的數據由Packet(包)組成Transaction(事務),Transaction組成Transfer(傳輸),不同傳輸類型每Frame(幀)占用帶寬的特性不同。同步傳輸每幀占用固定帶寬;中斷傳輸每幀都占用帶寬,但所占帶寬不固定;控制傳輸和批量傳輸在需要時才占用幀帶寬,批量傳輸將會占用幀的所有剩余帶寬。除同步傳輸外,一個Transaction由token包,數據包,握手包構成,STM32的每次中斷都完成一個Transaction,token包和握手包的收發由硬件完成,數據包由應用程序完成。
四種傳輸類型
用于描述端點(Endpoint)或通道(Pipe)的特性
1. 中斷傳輸(Interrupt Transfer)
2. 控制傳輸(Control Transfer)
3. 同步傳輸(Isochronous Transfer)
4. 批量傳輸(Bulk Transfer)
同步傳輸與中斷傳輸是周期性的,控制傳輸和批量傳輸是突發的
通道類型
數據流:單向 ->批量,中斷,同步傳輸
消息: 雙向 -> 控制傳輸
事務(Transaction)
分類:SETUP, OUT, IN
Packet格式
SYNC Packet Content EOP
其中,Packet Content的組成
PID 地址 幀號 數據 CRC
注意:不是每種包都包含完整Packet Content
Packet種類及其組成
命令包 token
PID + ADDR(設備地址,端點地址) + CRC5
幀首包 SOF(Start of frame)
PID + 幀號 + CRC5
數據包 DATA
PID + 數據 + CRC16
握手包 Handshake
PID
PID域的類型
Token
IN, OUT, SETUP
SOF
SOF
Data
DATA0, DATA1, DATA2, DATAM
Handshake
ACK, NAK, STALL, NYET/ERR(HS)
幀格式
說明:
- USB規范規定SETUP分組不能以非ACK握手分組應答,如果SETUP分組失敗,則會引起下一個SETUP分組。因此,以NAK或STALL分組響應主機的SETUP分組是被禁止的。
- 控制傳輸使用雙向端點
舉例: Control Transfer的SETUP Transaction的組成
SETUP Packet + DATA0 Packet + ACK Package
SETUP包只跟以DATA0為PID的數據包,且數據包的方向為Host到Device。
USB設備狀態
插入 -> 供電 -> 復位 -> 地址 -> 配置 掛起
實現一個USB設備的軟件流程(以Mass Storage為例)
1. 系統初始化
(1)初始化系統時鐘,配置USB時鐘為48MHz;
(2)清除掛起的中斷標志;
(3)復位USB模塊
(4)配置本應用關心的中斷,設備狀態為UNCONNECTED
(5)初始化媒介層(SD卡,Flash)
2. USB復位(RESET中斷)
(1)設置分組緩沖區基地址;
(2)配置端點的類型,發送狀態,接收狀態,端點地址(EP_TYPE, EP_KIND, EA),發送緩沖區或接收緩沖區地址,接收端點還需要設置接收長度;
(3)初始化設備地址為0,置位USB_DADDR. EF使能USB模塊;
(4)初始化BOT狀態機,CBW.dSignature;
(5)設備狀態為ATTACHED
3. SETUP階段和數據階段
SETUP階段使用標準請求和類特定請求完成設備枚舉,由端點0的控制傳輸完成。
IN過程
(1)CTR_TX置位,發生中斷,根據USB_ISTR的EP_ID和DIR位識別出端點號和方向;
(2)清除USB_EPnR. CTR_TX位;
(3)填寫發送緩沖區,設置COUNTn_TX;
(4)將STAT_TX設置為”11”,使能該端點的TX。
OUT過程
注意:SL_SIZE和NUM_BLOCK決定了最大接收字節數
STAT_RX在接收數據后變為10(NAK)
(1)CTR_RX置位,發生中斷,根據USB_ISTR. EP_ID位和USB_ISTR. DIR位識別出端點號和方向;
(2)根據USB_EPnR. SETUP位確定事務類型,是OUT還是SETUP,同時清除USB_EPnR. CTR_RX位;
(3)讀出緩沖區描述表指向的COUNTn_RX,獲得此次傳輸的字節數;
(4)從ADDRn_RX處獲得數據;
(5)使能下次接收,即設置USB_EPnR. STAT_RX位為”11”,使能該端點。
說明:
- USB_CNTR. USB置位后所有的配置寄存器不會被復位,但設備的地址寄存器和端點寄存器會被USB復位所復位;
- 使用雙緩沖機制時,STAT_TX和STAT_RX不會因為完成一次IN/OUT分組而被置為NAK;
- 對于同步端點,端點的狀態只能是有效或者禁用,因此硬件不會在數據傳輸結束時改變端點的狀態;
- 端點地址不一定要與端點號一致,由于用4位二進制表示(EA[3:0]),故端點地址取值為0 - 15,端點0作為控制端點,必須使其端點地址為0;
描述符(Descriptor)分類
設備描述符(Device Descriptor)
配置描述符(Configuration Descriptor)
接口描述符(Interface Descriptor)
端點描述符(Endpoint Descriptor)
字符描述符(String Descriptor)
報告描述符(Report Descriptor)
(*pProperty->Init)()
(*pProperty->Init)()完成了全速/低速設備上拉電阻檢測,復位,設置應用關心的中斷屏蔽位
CNTR. CTRM,CNTR. RESETM,未完成端點傳輸類型,緩沖區描述表的配置,設備地址DADDR的配置(僅置0并置位USB_DADDR. EF來使能USB),在函數的最后:bDeviceState = UNCONNECTED
而USB_Init()的下一條語句是while (bDeviceState != CONFIGURED),顯然接下來應該在中斷中完成緩沖區描述表填寫(USB_BTABLE),端點傳輸類型(USB_EPnR),枚舉過程的工作。
//USB中斷服務函數
USB_Istr()
{
...
#if (IMR_MSK & ISTR_RESET)
if (wIstr & ISTR_RESET & wInterrupt_Mask)
{
_SetISTR((uint16_t)CLR_RESET);
Device_Property.Reset();
#ifdef RESET_CALLBACK
RESET_Callback();
#endif
}
#endif
...
}
Device_Property.Reset()完成以下工作:
Device_Info.Current_Configuration = 0(同前)
pInformation->Current_Feature = MASS_ConfigDescriptor[7]
設置Buffer table的地址(BTABLE_ADDRESS) ,設備地址默認為0
初始化EP
EP0:控制類型;發送NAK、接收Valid;設置接收buffer地址和長度;設置發送buffer地址
EP1:批量類型;發送NAK、接收Disable;設置發送buffer地址
EP2:批量類型;發送Disable、接收VALID;設置接收buffer地址和長度
bDeviceState = ATTACHED 全局變量,表示設備當前已被插入主機
關于Setup0_Process()中調用DataStageIn()的原因
Setup0_Process() - > 處理標準request / class相關request -> 根據數據階段:如果是IN -> DataSatgeIn()
USB Device收到IN Packet且地址正確后,訪問ADDRn_TX和COUNTn_TX,將相應緩沖區的內容通過移位寄存器發送出去,并等待Host發送ACK Package。Device收到ACK后toggle DTOG_TX位,硬件設置STAT_TX位為”10”(NAK),使端點無效,CTR_TX置位。應用程序需要清除中斷標志CTR_TX,把下次要發送的內容寫進ADDRn_TX指向的hw_buf,更新COUNTn_TX為需要發送的字節數,然后設置STAT_TX為”11”(VALID),使能數據傳輸。當STAT_TX為”10”(NAK)時,所有IN請求都會被NAK,Host不斷重發IN請求,直到該端點有效。
每次處理CTR_TX中斷時,寫進hw_buf的內容都是下次要發送的內容,因此,在首次處理IN請求之前需要準備好hw_buf,如果SETUP的數據階段是IN,就要在Setup0_Process()中調用DataStageIn()填充首次需要準備的內容。
關于端點地址的設置
In0_Process() -> WAIT_STATUS_IN -> 如果是SET_ADDR命令:寫寄存器 -> 設置各端點地址
如果端點地址需要設置成與端點號不一致,需要修改本函數的部分
@ for(i=0; i } 修改為: @ _SetEPAddress(0,0); _SetEPAddress(1,EP_ADDR1); _SetEPAddress(2,EP_ADDR2); 非零端點的處理 USB請求格式 USB請求由SETUP transaction完成,一條完整的USB請求存放在其中的DATA0 packet中,字節序為小端模式。 偏移量 域 長度 描述 0 bmRequestType 1 請求特征 D7:傳輸方向 0=主機至設備 1=設備至主機 D6..5:種類 0=標準 1=類 2=廠商 3=保留 D4..0:接受者 0=設備 1=接口 2=端點 3=其他 4..31:保留 1 bRequest 1 命令類型編碼值 2 USBwValue 2 根據不同的命令,含義不同 4 USBwIndex 2 根據不同的命令,含義不同,主要用于傳送索引或偏移 6 USBwLength 2 數據階段的字節數,如果沒有數據階段則填0 USB Mass Storage Class USB Mass Storage使用BOT(Bulk only Transfer)協議和SCSI指令來處理傳輸。相對于CBI(Control Bulk Interrupt)協議,BOT協議僅需要控制端點,一個Bulk IN端點和一個Bulk OUT端點即可完成命令、數據、狀態的傳輸,BOT狀態機如下圖所示: CBW(Command Block Wrapper)是一個31字節長的包,由Host發起,格式如下: dCBWSignature: 0x43425355 dCBWTag: 用戶定義標簽,dCSWTag應當原樣返回 dCBWDataTransferLength: 主機期望傳輸的數據長度。 bmCBWFlags: 主要定義數據的傳輸方向,由bit 7定義(0-out, 1-in),其他比特默認為0 bCBWLUN: 邏輯單元號 bCBWCBLength: CB的有效長度 CBWCB: 設備執行的命令塊,這里是SCSI命令,一般是16字節 CSW(Command Status Wrapper)是Device收到Host發送的CBW并完成數據傳輸后向Host發送有關狀態信息的包,長度為13字節,格式如下: dCSWSignature: 0x53425355 dCSWTag: 應當與dCBWTag一致 dCSWDataResidue: bCSWStatus: CBW傳輸的成功或失敗狀態,為0表示傳輸成功,非0表示傳輸失敗, 如下表所示 Class-Specific requests BOT協議要求支持兩個類相關請求: 1. Bulk-only mass storage reset 該請求用于復位Mass Storage設備及與其相關的接口。Device接收到請求后,清除兩個Bulk端點的data toggle,初始化CBW signature到默認值,設置BOT狀態機到BOT_IDLE狀態,以準備接收下一個CBW。 該請求在Mass_NoDataSetup()@usb_prop.c中處理。 2. Get Max LUN request 一個Mass storage設備可能管理多個共享同一device特性的邏輯單元,host使用CBW中的bCBWLUN域決定當前使用哪一個邏輯單元。 該請求在Mass_DataSetup()@usb_prop.c中處理。 Standard request requirements @usb_prop.c BOT協議規定,device在接收到以下兩個標準請求時必須響應相應的requirement: Mass_Storage_SetConfiguration() 當device從unconfigured狀態轉換為configured狀態時,所有端點的data toggle都必須清零 Mass_Storage_ClearFeature() 當host發送了一個帶有非法signature或length的CBW時,device必須設置兩個Bulk端點的狀態為STALL,直到收到mass storage reset請求。 Mass_Storage_SetDeviceAddress() 設置device的地址 bDeviceState = ADDRESSED 關于獲取LUN數量的修改 USB Host獲取LUN數量是通過class-specified請求處理函數uint8_t *Get_Max_Lun(uint16_t Length)完成的,定位到Get_Max_Lun()可以看到LUN的數量由Max_Lun變量來確定,定位到變量定義處并修改,注意Max_Lun表示最大的LUN,LUN號從0開始,有兩個LUN,Max_Lun應該填1而不是2。 從Bulk端點到存儲器訪問函數的流程 1. OUT(Mass_Storage_Write) EP2_OUT_Callback()@usb_endp.c Mass_Storage_Out()@usb_bot.c Data_Len = USB_SIL_Read(EpAddr, Bulk_Data_Buff)@usb_sil.c ??-> CBW_IDLE : CBW_Decode() ; CBW_DATA_OUT SCSI_Write10_Cmd(CBW.bLUN, SCSI_LBA, SCSI_BlkLen)@usb_scsi.c ??-> 檢查地址合法性;BOT狀態轉換;EP2_RX設置為Valid Write_Memory(lun, LBA, BlockNbr)@memory.c ??-> 處理packet到block的轉換,block地址到byte地址轉換 MAL_Write(lun, ByteAddr, NumOfByte)@mass_mal.c ??-> 寫入一個block 2. IN(Mass_Storage_Read) EP1_IN_Callback()@usb_endp.c Mass_Storage_In()@usb_bot.c ??-> CBW_IDLE : CBW_Decode() ; BOT_DATA_IN SCSI_Read10_Cmd(CBW.bLUN, SCSI_LBA, SCSI_BlkLen)@usb_scsi.c ??-> 檢查地址合法性;BOT狀態轉換;在首次IN前調用Read_Memory()填充hw_buf Read_Memory(lun, LBA, BlockNbr)@memory.c ??-> 處理block到packet的轉換,block地址到byte地址的轉換 MAL_Read(lun, ByteAddr, NumOfByte)@mass_mal.c ??-> 讀出一個block USB_SIL_Write(EP1_IN, (uint8_t *)Data_Buffer, BULK_MAX_PACKET_SIZE)@usb_sil.c ??-> 分多次向EP1寫入packet 說明: @memory.c Write_Memory()函數和Read_Memory()函數定義的用于block到byte的地址、長度轉換的變量是uint32_t類型的,而32 bit無符號變量最大尋址能力是4G,也就是說sd card超過4G的部分無法訪問,所以需要修改類型為uint64_t。同時注意其調用的MAL_Write()和MAL_Read()函數的單位和數據類型。 @mass_mal.c MAL_Write()和MAL_Read()函數的Input參數Memory_Offset和Transfer_Length單位是字節,注意Mass Storage的API,特別是SD卡的API,有些的單位是BlockAddr和NumOfBlock。 uint32_t Mass_Memory_Size[2]; uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length) uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length) 這里的uint32_t也要修改成uint64_t USB HID Class 1. JoyStick Mouse 計算機顯示屏坐標增長方向 X坐標 自左至右增大 Y坐標 自上至下增大 鼠標發送給PC的數據每次4個字節 BYTE0 BYTE1 BYTE2 BYTE3 定義如下: BYTE0 bit7: 1 表示 Y坐標的變化量超出 -256~255 的范圍,0表示沒有溢出 bit6: 1 表示 X坐標的變化量超出 -256~255 的范圍,0表示沒有溢出 bit5: Y坐標變化的符號位,1表示負數,即鼠標向上移動 bit4: X坐標變化的符號位,1表示負數,即鼠標向左移動 bit3: 恒為1 bit2: 1表示中鍵按下 bit1: 1表示右鍵按下 bit0: 1表示左鍵按下 BYTE1 – X坐標變化量,與BYTE1的bit4組成9位符號數,負數表示向左移,正數表右移。用補碼表示變化量 BYTE2 – Y坐標變化量,與BYTE1的bit5組成9位符號數,負數表示向下移,正數表上移。用補碼表示變化量 BYTE3 – 滾輪變化。
上一篇:STM32的USRT通訊實現
下一篇:stm32 usb hid 移植時出現的問題及解決辦法
推薦閱讀
史海拾趣
Delkin Devices公司成立于1986年,總部設在美國加利福尼亞州的圣迭戈市。公司由一群富有遠見和創造力的工程師和企業家創立,他們看到了未來數據存儲技術的巨大潛力。在創立初期,Delkin Devices專注于研發和生產高質量的閃存存儲設備,以滿足當時市場對數據存儲不斷增長的需求。通過不斷的技術創新和優質的客戶服務,Delkin Devices逐漸在電子行業中嶄露頭角。
隨著電子行業的全球化趨勢日益明顯,Flamar公司積極實施國際化戰略,通過設立海外研發中心、生產基地和銷售網絡,不斷拓展全球市場。公司先后在歐洲、亞洲等地建立分支機構,與當地企業建立緊密的合作關系,共同推動電子技術的創新與應用。通過國際市場的開拓,Flamar公司不僅實現了業務規模的快速增長,還進一步提升了品牌的國際知名度和影響力。
隨著電子產品的日益小型化和復雜化,對緊固件的要求也越來越高。B&F Fastener Supply公司緊跟行業趨勢,投入大量資源進行技術創新。公司成功研發出一系列適用于微型電子設備的緊固件產品,不僅滿足了市場的迫切需求,還憑借出色的性能和穩定的品質贏得了客戶的廣泛認可。
B&F Fastener Supply公司在上世紀末成立之初,就瞄準了快速發展的電子行業,意識到緊固件和電子元器件的供應將成為行業發展的關鍵。公司迅速調整戰略,開始專注于電子工業用緊固件的研發和銷售。通過與多家電子制造廠商建立合作關系,B&F逐漸在電子緊固件市場占據了一席之地。
為了擴大市場份額,ETI開始積極尋求國際合作。公司先后與多家國際知名企業建立了戰略合作關系,共同研發新產品、開拓市場。同時,ETI還積極參加國際電子展覽會,展示公司的技術實力和產品優勢,吸引了眾多客戶的關注。通過不斷努力,ETI的產品逐漸打入國際市場,成為了一家具有全球影響力的電子企業。
翼豹WRX為2008車型推出一款全新平臺,包括較長的103.1英寸的軸距和一個全新的雙叉后懸吊系統。重新調校的懸吊系統為2009款WRX的駕駛性能的進一步的提升提供了保障。標準的17 x 7英寸的鋁合金輪圈,以及目前更換的225/45R17夏季高性能輪胎,替代了目 ...… 查看全部問答∨ |
|
先詳細解釋一下標題的意思。 我的播放器運行在wince5.0中,我編寫了各種各樣的播放器,有使用WMP的,有使用TCPMP的,有使用用DSHOW的,都會有這么個情況: 我要跳轉到視頻的某個位置,比如說10s,不能準確的設置到10s,而 ...… 查看全部問答∨ |
【連載】【ALIENTEK MiniSTM32 開發板】STM32不完全手冊--PWM輸出實驗(實驗八) ALIENTEK開發板購買地址:http://shop62103354.taobao.com/ [ 本帖最后由 正點原子 于 2010-8-30 09:37 編輯 ]… 查看全部問答∨ |
MDK 3.80 STM32F107 調試時,外設沒有CAN部分,我在網上聽說別人的有,我估計是不是安裝了什么插件。請教!上圖求真相! 下載 (31.08 KB) 2009-12-22 17:33 … 查看全部問答∨ |
各位大俠,幫小弟看看這個問題: 我想用430做數據采集,雙通道數據采集,每個通道采集64個點之后,通過IO口來發送,現在是ADC這塊都有問題。采樣頻率為20KHz以上,使用TIMERA.OUT1為觸發源。 問題是:我單步運行運行到ADCTL0 |= ADC12SC;這條語句 ...… 查看全部問答∨ |
求c2000 renewable energy developer skit電路圖n 按理說在官網和controlSUITE上應該有的,但是我就是找不到,求個位大哥指點。具體實物為下圖: … 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 意法半導體緊湊型可配置車規負載驅動器具備安全引腳
- 美光宣布在美投資增至 2000 億美元,加建晶圓廠和 HBM 封裝設施
- AMD舉辦Advancing AI 2025大會:Instinct MI350系列GPU發布,35倍推理性能提升
- 特斯拉起訴前Optimus機器人工程師,指控其竊取商業機密
- Nordic Semiconductor將在MWC上海2025上展示前沿蜂窩物聯網解決方案
- SiC 市場的下一個爆點:共源共柵(cascode)結構詳解
- 香港科技大學工學院推出擬人化自動駕駛系統
- 現代摩比斯推出新型安全技術 防止追尾碰撞
- 研究人員開發新型機器人系統 利用AI賦能機器人技術
- 研究人員開發具有突破性觸覺靈敏度的機械手 可實現類人靈巧操作