
USB设备能否工作,枚举步骤,用“乡村爱情”里的话说,“必须的!”,网上也有很多资料,圈圈就提供了一份详细的枚举过程,但对STM32是怎么响应的没有说明,一会详细道来,先上圈圈的提供的那个枚举图示,希望圈圈支持,如果不妥,请与我联系,谢谢。 我将此转换成了PDF文件,方便查看。2 x: \8 u" A6 _0 a+ H( ? 首先说明一个变量,定义在usb_core.c中: : U9 Q0 F3 ^0 Q- K# ` volatile DEVICE_INFO vsDeviceInfo; 9 s& k6 f+ C+ u8 y: J 看意思就知道他的作用了,DEVICE_INFO是个结构,定义在usb_type.h中: // ***************************************************************************** // DEVICE_INFO - T* b- ?! [( O' L& b- E // ***************************************************************************** typedef struct _DEVICE_INFO 0 ^! n% \: l4 z { unsigned char bDeviceAddress; ' {8 ^+ ~! @; O# A. t& ]& X unsigned char bCurrentFeature; 3 Z+ N1 L; X4 `! A' p+ | unsigned char bCurrentConfiguration; $ J& A5 `' S# j! ^% _$ n unsigned char bCurrentInterface; unsigned char bCurrentAlternateSetting; $ Y I5 i2 W3 N, v* g9 K/ ^: w/ Z & L% i* _* V) b; d WORD_2BYTE uStatusInfo; 3 m! b- S/ }' Z. h DEVICE_STATE eDeviceState; ( q; {! z& `# P- A- v; l RESUME_STATE eResumeState; * N! S7 u' l. b6 e0 j2 U CONTROL_STATE eControlState; SETUP_DATA SetupData; ) I" n( d) W# ?- ^: \ / }. r M2 Q" j4 f TRANSFER_INFO TransInfo; } * ]1 |3 O ?7 ]! B1 y DEVICE_INFO, 0 l! X; e3 t) c: t$ y/ t# r *PDEVICE_INFO; 在枚举过程中,就是如何处理好SETUP事件,如果STM32 USB接收到正确的SETUP事件,将响应函数CTR_SETUP0(),SETUP事件是特殊的OUT事件,数据方向 Host->Device,SETUP事件数据长度固定为8,数据定义在DEVICE_INFO.SetupData,其数据结构是(定义在 usb_type.h中): 0 h7 Z! u' y5 o typedef struct _SETUP_DATA { unsigned char bmRequestType; // request type % ^/ r0 M1 D' Q7 h unsigned char bRequest; // request code M6 i1 \% D3 T0 t WORD_2BYTE wValue; ! `0 w$ A6 L3 h7 O: H1 w' R WORD_2BYTE wIndex; 7 }2 s% T) {% Z9 V2 H9 X/ O WORD_2BYTE wLength; } SETUP_DATA, / P8 S7 \! f% z# U$ T: `. X *PSETUP_DATA; 0 U6 ]- Y' d& Y$ v8 O% M0 d: g WORD_2BYTE是定义的一个共用体: / H: L& K$ P1 H4 \& x, {. D5 f typedef union _WORD_2BYTE { ( \7 A6 Z% ?& J unsigned short w; " ^2 f! G1 D m: l* C4 z$ ?. D struct / Q5 y, r6 k. |3 H0 A& d { 3 V. s7 E& ]1 J7 X6 B unsigned char LSB; unsigned char MSB; 8 ~" c1 ^: a+ V2 ~7 X4 T0 o }b; 8 U" p) G) e- N } 6 O" M% Q9 X. W- x3 ^2 t, X- A6 V WORD_2BYTE; + o& j- w$ }3 z7 a 为什么将SETUP数据结构中的wValue,wIndex,wLength如此定义? 2 o4 C# n1 G% f. Z6 D9 R4 m 1:USB协议中所有数据传输都是依照低位在先的原则 5 s+ u; _# G; t2 @4 _( d6 d5 V 2:高地位字节可能功能复用 % @8 X, i' f* O; D" q 这样在后续的程序编写中就变得十分方便,ST提供的USB固件方法同样如此,但这方面的处理让人有些摸不着头脑,详情可参阅。至于具体的SETUP数据结构含义如何,还是要具备基本知识:了解USB协议 ( ?3 I2 r& ~+ u CTR_SETUP0() 函数将SETUP数据提取出来,SETUP数据结构有0长度和非0长度的数据结构,详细参阅USB2.0官方协议第9章。在这将两种区别开来分别执行 SETUP0_NoData()和SETUP0_Data()函数,并返回结果,根据返回结果再响应USB主机 9 U: D' }3 o0 d // ***************************************************************************** 2 S; E7 L1 `, [ // Function Name : CTR_SETUP0 // Description : // Input : 1 ~% t6 H. f5 v% U: `# W // Output : // Return : // ***************************************************************************** ) ~+ X( d2 g5 G void CTR_SETUP0(void) ' M7 w$ r4 g1 U9 M4 g) n { RESULT eResult; " j$ u% K+ W) W4 c& x& w BufferCopy_PMAToUser( (unsigned char *)&vsDeviceInfo.SetupData, , V- w4 D6 B2 [" x. t7 e0 O9 B$ i GetBuffDescTable_RXAddr(ENDP0), $ b( }' L! m- p; s+ D z6 [; v GetBuffDescTable_RXCount(ENDP0)); + W" E- f0 C0 B1 y! H5 K if(vsDeviceInfo.SetupData.wLength.w == 0) 0 d1 s8 u: s7 n' C7 ` { eResult = SETUP0_NoData(); 9 ~. ]# q2 ?6 d# W! T } " Z( u8 k% H0 @/ n else . J4 U0 o' |' y2 O, w1 [6 S; h% D( [ { ) O' m* R( \. @( _ eResult = SETUP0_Data(); } 0 ^+ M: O4 E4 u8 } switch(eResult) U, w. |( a; K) v& g; S# @! ~ { ; T7 n( Y0 h% A7 l case RESULT_SUCCESS: break; 3 Q, O' n, U( n2 v5 d L) X case RESULT_LASTDATA: break; A+ o6 A9 t! K: n5 y6 Y. N3 J1 N case RESULT_ERROR: case RESULT_UNSUPPORT: SetEPR_RXStatus(ENDP0, EP_RX_VALID); SetEPR_TXStatus(ENDP0, EP_TX_STALL); 7 A/ t. x0 X* E) J break; } } 8 M+ P1 I" J7 y9 i h, P SETUP0_Data() 和SETUP0_NoData()函数支持的所有USB请求类型只有罗列的这些,有多少种组合都定义在USB协议中,程序根据请求代码,再去执行对应函数,这样做的目的就是让程序结构明了。其中注释为"// done"的部分表明此部分功能已完成。对于未完成部分,希望大家在交流中完善。 4 K5 x& r, @3 p5 @9 I$ ~ // ***************************************************************************** // Routine Groups: SETUP_Data & H# u5 y \ Q' [1 _6 e$ `' u // ***************************************************************************** RESULT SETUP0_Data(void) { $ p3 \/ f3 C' @+ R7 H3 w9 c // SetupData.bRequest: request code switch(vsDeviceInfo.SetupData.bRequest) ) e" i7 S' V% I8 X/ [ { 2 S( b6 X8 O& X4 _: `+ t# m case SR_GET_STATUS: return SR_GetStatus(); // done case SR_GET_DESCRIPTOR: return SR_GetDescriptor(); // done + o* J8 U8 s" d; R3 Y6 R& ^: \# Q case SR_SET_DESCRIPTOR: return SR_SetDescriptor(); // unsupport 0 K- p4 G( v U! c# _ case SR_GET_CONFIGURATION: return SR_GetConfiguration(); // done case SR_GET_INTERFACE: return SR_GetInterface(); // unsupport case SR_SYNCH_FRAME: return SR_SynchFrame(); // unsupport 2 N$ v1 W3 k3 G' b# O: o A4 d default: return RESULT_UNSUPPORT; } } $ d% [* u0 ]- c( y2 z // ***************************************************************************** // Routine Groups: SETUP_NoData ) ~, B Y6 Q- m // ***************************************************************************** RESULT SETUP0_NoData(void) 3 u4 Y& e" m8 f. ~ _2 k! b { 1 F1 t; \& x% E5 P- K // SetupData.bRequest: request code 2 E6 {$ o7 H& l1 `8 |8 J7 U R/ O switch(vsDeviceInfo.SetupData.bRequest) { ; T- v2 N/ I7 t2 w$ k/ Z case SR_CLEAR_FEATURE: return SR_ClearFeature(); // unsupport case SR_SET_FEATURE: return SR_SetFeature(); // unsupport ; S1 q8 \/ s0 u& N" Z case SR_SET_ADDRESS: return SR_SetAddress(); // done case SR_SET_CONFIGURATION: return SR_SetConfiguration(); // done case SR_SET_INTERFACE: return SR_SetInterface(); // unsupport ' y, ~" S1 [& t% _ default: return RESULT_UNSUPPORT; } D4 x6 f5 g3 l } : r0 D/ j( d. Q- t; \' n1 L 下篇将介绍上述的各个请求函数如何响应主机。4 o4 x: r5 ^0 t3 ~; @4 F0 C |
USBæä¸¾è¿ç¨å¾è§£.pdf
下载273.09 KB, 下载次数: 202
最全USB HID开发资料,悉心整理一个月,亲自测试
实战经验 | 选择USBX模块生成USB CDC ACM无PD的项目
STM32 USB HID键盘例程
刘氓兔的杂谈【001】-片上USB 高速PHY
【经验分享】在进行 USB CDC 类开发时,无法发送 64整数倍的数据
【源码】STLINK-V3MINI 高速USB仿真器,成功改刷【高速CMSIS-DAP】
在线直播|无需编写任何代码即可在STM32上实现USB-C Power Delivery
STM32 USB CDC 虚拟多串口
圈圈发布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设备的枚举(上)