|
USB设备能否工作,枚举步骤,用“乡村爱情”里的话说,“必须的!”,网上也有很多资料,圈圈就提供了一份详细的枚举过程,但对STM32是怎么响应的没有说明,一会详细道来,先上圈圈的提供的那个枚举图示,希望圈圈支持,如果不妥,请与我联系,谢谢。 我将此转换成了PDF文件,方便查看。 首先说明一个变量,定义在usb_core.c中: . E2 o2 e* V* v& U( D3 ? volatile DEVICE_INFO vsDeviceInfo; 看意思就知道他的作用了,DEVICE_INFO是个结构,定义在usb_type.h中: // ***************************************************************************** 9 D1 K; d1 d A* Q* S% {) d // DEVICE_INFO // ***************************************************************************** typedef struct _DEVICE_INFO { 4 E% x( K" Z' u0 X+ c; d- H unsigned char bDeviceAddress; unsigned char bCurrentFeature; unsigned char bCurrentConfiguration; 9 k5 s* R. M* H: z; l unsigned char bCurrentInterface; unsigned char bCurrentAlternateSetting; & X* C8 `1 L, R( L+ o! V: g WORD_2BYTE uStatusInfo; $ n; U6 O) e* b* J DEVICE_STATE eDeviceState; RESUME_STATE eResumeState; 6 T# @1 c g2 [ CONTROL_STATE eControlState; : {" A5 W' ^& c: H7 y, Y( ]3 K9 d3 y SETUP_DATA SetupData; 9 [1 L) C, P/ B, \$ [6 k7 [) l. H, {7 W TRANSFER_INFO TransInfo; } DEVICE_INFO, 3 L6 y$ J8 b( r% R9 D9 r7 c *PDEVICE_INFO; # A- {: B4 T. \. z+ }9 f2 V 6 c( @$ F$ x- j# [1 @" y 在枚举过程中,就是如何处理好SETUP事件,如果STM32 USB接收到正确的SETUP事件,将响应函数CTR_SETUP0(),SETUP事件是特殊的OUT事件,数据方向 Host->Device,SETUP事件数据长度固定为8,数据定义在DEVICE_INFO.SetupData,其数据结构是(定义在 usb_type.h中): typedef struct _SETUP_DATA * w$ D4 b8 q" ^* t$ t { 4 [* c( P5 H' v7 j; K unsigned char bmRequestType; // request type - S5 d, @1 H( g" a0 k unsigned char bRequest; // request code WORD_2BYTE wValue; ) v% q6 f6 J4 [' N2 Z WORD_2BYTE wIndex; , H& |# [5 x7 U WORD_2BYTE wLength; } SETUP_DATA, ! ~' Z" H" L8 z! _: v *PSETUP_DATA; + o( s6 l/ J( |! l; F% I4 e5 m5 k WORD_2BYTE是定义的一个共用体: * N8 n. W; e& j7 S4 Q: y. O! Q typedef union _WORD_2BYTE { h6 c7 \$ Q+ H e* ^" r unsigned short w; 9 F* q0 b- w+ Y6 H struct 9 ~; n4 B8 ~/ g [ { unsigned char LSB; " x, D5 E7 T/ W( z5 B unsigned char MSB; }b; } & t# v- M8 Y5 `, e; {, o! D# H WORD_2BYTE; ' |5 Q" @9 R( U) l. H 为什么将SETUP数据结构中的wValue,wIndex,wLength如此定义? 1:USB协议中所有数据传输都是依照低位在先的原则 4 j0 K1 {: N, B. T3 J9 e 2:高地位字节可能功能复用 $ m7 H' J C1 @& b" K 这样在后续的程序编写中就变得十分方便,ST提供的USB固件方法同样如此,但这方面的处理让人有些摸不着头脑,详情可参阅。至于具体的SETUP数据结构含义如何,还是要具备基本知识:了解USB协议 * S3 i6 Y6 F, V1 Z , h _$ b$ j3 P, W CTR_SETUP0() 函数将SETUP数据提取出来,SETUP数据结构有0长度和非0长度的数据结构,详细参阅USB2.0官方协议第9章。在这将两种区别开来分别执行 SETUP0_NoData()和SETUP0_Data()函数,并返回结果,根据返回结果再响应USB主机 // ***************************************************************************** * T4 N A: G5 k. @5 a // Function Name : CTR_SETUP0 // Description : ! y% D7 c- S( n8 ` // Input : # ~7 K1 |0 Y1 o, } // Output : // Return : 7 @4 H# h9 D8 Y6 ]/ I9 B4 ]( M1 _ // ***************************************************************************** void CTR_SETUP0(void) { RESULT eResult; . |8 n- H' q6 p" c7 F' }/ G BufferCopy_PMAToUser( (unsigned char *)&vsDeviceInfo.SetupData, 7 ^$ R& y) _0 w GetBuffDescTable_RXAddr(ENDP0), , S8 O+ U) ^! s2 K. n1 `! W GetBuffDescTable_RXCount(ENDP0)); . P- Q9 U* W4 d2 }2 z( N7 Z+ q& w " K: u: q6 B! e4 d( o: B" S if(vsDeviceInfo.SetupData.wLength.w == 0) { ; I' d3 V/ H& [& ~ eResult = SETUP0_NoData(); } else / W0 A! ], n; i L { + k5 c; S. \6 ~9 d+ j eResult = SETUP0_Data(); , |+ `1 j4 Q# ? } switch(eResult) { , Z# |* t! p& j4 y case RESULT_SUCCESS: : c& e' V( e3 a$ f; p break; case RESULT_LASTDATA: # ^( a# u: f+ {( j0 C break; case RESULT_ERROR: 6 V3 r' k3 V; n5 C case RESULT_UNSUPPORT: 5 B9 i& K9 e3 Q SetEPR_RXStatus(ENDP0, EP_RX_VALID); * n; x+ d( ?% A( g SetEPR_TXStatus(ENDP0, EP_TX_STALL); break; 1 f* |3 W- l* c } 7 B5 `( L2 u, H9 i) C( Y% m } ! w2 P* D9 M8 P4 y SETUP0_Data() 和SETUP0_NoData()函数支持的所有USB请求类型只有罗列的这些,有多少种组合都定义在USB协议中,程序根据请求代码,再去执行对应函数,这样做的目的就是让程序结构明了。其中注释为"// done"的部分表明此部分功能已完成。对于未完成部分,希望大家在交流中完善。 . w1 Q9 l& T" J; @. y A$ r9 b/ s , |/ ^% J N# r! }: i // ***************************************************************************** // Routine Groups: SETUP_Data // ***************************************************************************** 7 Z* {; q1 Q1 t' D RESULT SETUP0_Data(void) 6 t; e$ ]+ f! S: [. ^: v { // SetupData.bRequest: request code switch(vsDeviceInfo.SetupData.bRequest) { 8 D" z+ W" O) m/ \4 v case SR_GET_STATUS: return SR_GetStatus(); // done case SR_GET_DESCRIPTOR: return SR_GetDescriptor(); // done case SR_SET_DESCRIPTOR: return SR_SetDescriptor(); // unsupport ) B8 o8 {; G/ \" P# } case SR_GET_CONFIGURATION: return SR_GetConfiguration(); // done case SR_GET_INTERFACE: return SR_GetInterface(); // unsupport 9 H9 m) p0 S9 I0 {" O) z5 e. A case SR_SYNCH_FRAME: return SR_SynchFrame(); // unsupport & E4 V3 R. y- X) W* W: @9 L a ; A" q k' u7 a. g, r# ^ default: return RESULT_UNSUPPORT; " L* N; S3 Q# E! {5 y# \ |- h } $ M. M6 z1 w6 T7 {" L. ]+ ]/ \ } + ~2 E9 ]( e B3 b; A+ d; R7 _ // ***************************************************************************** // Routine Groups: SETUP_NoData // ***************************************************************************** RESULT SETUP0_NoData(void) { 5 X$ r1 i5 R2 |& u3 `6 K3 S // SetupData.bRequest: request code % G }2 _* u0 c switch(vsDeviceInfo.SetupData.bRequest) 3 y y/ i8 e: o. W0 M { ! k6 t( K* N6 G; w, u case SR_CLEAR_FEATURE: return SR_ClearFeature(); // unsupport case SR_SET_FEATURE: return SR_SetFeature(); // unsupport 6 f# `8 y; u0 K _6 t case SR_SET_ADDRESS: return SR_SetAddress(); // done 6 |/ T& x; ]% e case SR_SET_CONFIGURATION: return SR_SetConfiguration(); // done " r" ?" ~. B! J3 c5 z& B. O" s: g case SR_SET_INTERFACE: return SR_SetInterface(); // unsupport ) s! I) d+ A: z' {7 @/ _ default: return RESULT_UNSUPPORT; } } " u& j- q; D" x9 K- M% w% x0 ]4 b ! d7 _6 i a7 \0 v 下篇将介绍上述的各个请求函数如何响应主机。4 P% J8 \& ^ l3 X7 B) e9 K# D: |" J6 ~ |
USBæä¸¾è¿ç¨å¾è§£.pdf
下载273.09 KB, 下载次数: 202
最全USB HID开发资料,悉心整理一个月,亲自测试
【源码】STLINK-V3MINI 高速USB仿真器,成功改刷【高速CMSIS-DAP】
STM32 USB CDC 虚拟多串口
实战经验 | 选择USBX模块生成USB CDC ACM无PD的项目
STM32 USB HID键盘例程
刘氓兔的杂谈【001】-片上USB 高速PHY
【经验分享】在进行 USB CDC 类开发时,无法发送 64整数倍的数据
在线直播|无需编写任何代码即可在STM32上实现USB-C Power Delivery
圈圈发布USB图书第二版有感,以及分享一些我学习USB过程...
USB Audio设计与实现
微信公众号
手机版
回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)
RE:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)
回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)
RE:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)
RE:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)
回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)
回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)
回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)
RE:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)