你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

[复制链接]
乡村布拉德 发布时间:2008-12-23 12:12
USB设备能否工作,枚举步骤,用“乡村爱情”里的话说,“必须的!”,网上也有很多资料,圈圈就提供了一份详细的枚举过程,但对STM32是怎么响应的没有说明,一会详细道来,先上圈圈的提供的那个枚举图示,希望圈圈支持,如果不妥,请与我联系,谢谢。
1 h$ E2 c3 e! e我将此转换成了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中:
+ Z+ R! b- j  x% H& W// *****************************************************************************
2 M$ {  F+ p0 ]// DEVICE_INFO - T* b- ?! [( O' L& b- E
// *****************************************************************************
5 c3 P; A  L8 ktypedef struct _DEVICE_INFO 0 ^! n% \: l4 z
{
5 b5 y. H. Z' R( @7 `/ Z  unsigned char bDeviceAddress; ' {8 ^+ ~! @; O# A. t& ]& X

! s- a: f9 }( ]: }4 v3 Q  unsigned char bCurrentFeature; 3 Z+ N1 L; X4 `! A' p+ |
  unsigned char bCurrentConfiguration; $ J& A5 `' S# j! ^% _$ n
  unsigned char bCurrentInterface;
- K  Z6 o  h* V1 ^  unsigned char bCurrentAlternateSetting; $ Y  I5 i2 W3 N, v* g9 K/ ^: w/ Z
& L% i* _* V) b; d
  WORD_2BYTE    uStatusInfo;
7 j; B$ H' l6 {- F' ?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;
8 E% t$ D) C3 I# z& _
9 D; }; o9 X7 H$ C5 t  SETUP_DATA    SetupData; ) I" n( d) W# ?- ^: \
/ }. r  M2 Q" j4 f
  TRANSFER_INFO TransInfo;
( u: e% R0 @4 }} * ]1 |3 O  ?7 ]! B1 y
DEVICE_INFO, 0 l! X; e3 t) c: t$ y/ t# r
*PDEVICE_INFO;
/ y8 t- @1 C. i. }3 u
2 D0 I0 x3 ^7 q  X3 O- R2 t: _在枚举过程中,就是如何处理好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
: J9 q6 l1 g' m* [* V  F{
" S8 z$ j: N, M1 `; O' t( q  J, P  unsigned char bmRequestType;            // request type % ^/ r0 M1 D' Q7 h
  unsigned char bRequest;                 // request code   M6 i1 \% D3 T0 t

6 l0 h$ `2 D( F4 `% u5 m  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;
9 N2 z% D4 _( b4 ]4 r7 Q}
# H: H) N7 A9 Y7 _0 l8 G$ M' zSETUP_DATA, / P8 S7 \! f% z# U$ T: `. X
*PSETUP_DATA; 0 U6 ]- Y' d& Y$ v8 O% M0 d: g

( w8 C, G) D" b/ c: QWORD_2BYTE是定义的一个共用体: / H: L& K$ P1 H4 \& x, {. D5 f
typedef union _WORD_2BYTE
, r' i6 |0 h" ]0 {{ ( \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;
& T  u. f4 m* a2 H' }" g    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;
" L3 l2 R6 o5 C; f9 G7 d5 o: V6 a+ 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协议
9 z* l( b% d  f# h) n; w% L: r6 Z. @( ?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
5 |  G7 p- n1 w4 {0 ]- J// Description    :
. D: \) o0 p, |: c) l" h// Input          : 1 ~% t6 H. f5 v% U: `# W
// Output         :
7 B. N: Z. k; p& P; \6 \// Return         :
0 b1 |3 ]' s6 N" B/ O  W) f// ***************************************************************************** ) ~+ X( d2 g5 G
void CTR_SETUP0(void) ' M7 w$ r4 g1 U9 M4 g) n
{
, Q6 N5 L) X9 T  RESULT eResult;
4 W- B$ Q3 C, D" 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));
8 C7 M: e$ s4 I/ l2 A3 {. L- z6 j+ W" E- f0 C0 B1 y! H5 K
  if(vsDeviceInfo.SetupData.wLength.w == 0) 0 d1 s8 u: s7 n' C7 `
  {
/ r' e# d$ b& ?  [" z3 W    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();
1 d; z4 B5 D* q! w  }
1 [& T4 t& J) O# e2 X' b0 ^+ M: O4 E4 u8 }
  switch(eResult)   U, w. |( a; K) v& g; S# @! ~
  { ; T7 n( Y0 h% A7 l
  case RESULT_SUCCESS:
- a3 ^+ }/ G" V& [5 P  B
* o$ V+ k0 Z1 [- F    break;
. I- `5 Q% @9 f3 F$ ]9 y3 Q, O' n, U( n2 v5 d  L) X
  case RESULT_LASTDATA:
6 p' s7 D  m7 ?$ u. Y$ C
$ }9 M1 T4 A4 a- U# `2 x& v    break;   A+ o6 A9 t! K: n5 y6 Y. N3 J1 N

2 l: m% h) t% q( o  case RESULT_ERROR:
. m4 s9 o  s1 O  case RESULT_UNSUPPORT:
  n3 {$ h+ `8 V7 p6 h    SetEPR_RXStatus(ENDP0, EP_RX_VALID);
9 E8 f% _1 t# @9 `# g' K4 K    SetEPR_TXStatus(ENDP0, EP_TX_STALL); 7 A/ t. x0 X* E) J
    break;
# Q  r* V  ]4 w) i2 d* R  }
; S: A0 `! _+ n9 o}
1 v# I( q8 f% v. z- S; s; Z8 M+ P1 I" J7 y9 i  h, P
SETUP0_Data() 和SETUP0_NoData()函数支持的所有USB请求类型只有罗列的这些,有多少种组合都定义在USB协议中,程序根据请求代码,再去执行对应函数,这样做的目的就是让程序结构明了。其中注释为"// done"的部分表明此部分功能已完成。对于未完成部分,希望大家在交流中完善。 4 K5 x& r, @3 p5 @9 I$ ~

5 H" K/ l( C( r8 e; a// *****************************************************************************
  x" O, |7 q9 C' }( b// Routine Groups: SETUP_Data & H# u5 y  \  Q' [1 _6 e$ `' u
// *****************************************************************************
8 l" s7 }% H# F. t" \/ jRESULT SETUP0_Data(void)
/ X- d) N- G& [: s6 t{ $ p3 \/ f3 C' @+ R7 H3 w9 c
  // SetupData.bRequest: request code
/ p  c0 ~. z% Y! I  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
! a$ a( p' U" \6 t  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
2 r0 [0 E6 T( \- J2 _  case SR_GET_INTERFACE:      return SR_GetInterface();               // unsupport
2 S9 @& k' A9 Z  case SR_SYNCH_FRAME:        return SR_SynchFrame();                 // unsupport
8 q- a" x7 E5 x% r% P( }2 N$ v1 W3 k3 G' b# O: o  A4 d
  default: return RESULT_UNSUPPORT;
, a( @5 W4 i1 `& L# l6 t! t5 J" V  }
9 U& B: B( j0 G, t} $ d% [* u0 ]- c( y2 z

+ N, _/ a$ B8 V/ j% N, J7 \; r& J// *****************************************************************************
& f7 \$ h6 e6 _$ ^// Routine Groups: SETUP_NoData ) ~, B  Y6 Q- m
// *****************************************************************************
  j( G# J/ [5 J$ r1 M, y( XRESULT 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)
& q5 A8 B$ {" i" e' z9 Q% i  { ; T- v2 N/ I7 t2 w$ k/ Z
  case SR_CLEAR_FEATURE:      return SR_ClearFeature();        // unsupport
% `+ b7 N, k; U* a  N  case SR_SET_FEATURE:        return SR_SetFeature();          // unsupport ; S1 q8 \/ s0 u& N" Z
  case SR_SET_ADDRESS:        return SR_SetAddress();          // done
1 X- f9 c8 a! O  case SR_SET_CONFIGURATION:  return SR_SetConfiguration();    // done
2 I0 t4 t1 G( l  case SR_SET_INTERFACE:      return SR_SetInterface();        // unsupport ' y, ~" S1 [& t% _

( W/ h0 J8 H7 m* ^) S  default: return RESULT_UNSUPPORT;
9 v$ I+ }9 K2 p2 B1 b" R; p/ @) ?$ v  }   D4 x6 f5 g3 l
} : r0 D/ j( d. Q- t; \' n1 L

: f; p6 Y' M, i8 t6 G% U' E& [下篇将介绍上述的各个请求函数如何响应主机。4 o4 x: r5 ^0 t3 ~; @4 F0 C

USB枚举过程图解.pdf

下载

273.09 KB, 下载次数: 202

收藏 评论9 发布时间:2008-12-23 12:12

举报

9个回答
luoqizhu-173640 回答时间:2010-3-5 17:11:29

回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

谢谢谢谢谢谢谢谢谢谢
baobaoaileilei 回答时间:2010-3-18 09:04:51

RE:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

谢谢
lihongying-1191 回答时间:2010-4-24 10:48:49

回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

good!!
fancatls 回答时间:2010-4-25 22:36:26

RE:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

非常感谢
viking_xie 回答时间:2011-4-19 14:44:10

RE:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

很好,谢谢分享.
aganmelody 回答时间:2011-10-6 20:33:12

回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

好,正在学习中
fengye5340 回答时间:2013-3-14 14:44:57

回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

感谢楼主分享资料
sunsword 回答时间:2013-6-11 09:35:31

回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

谢谢你 分享资料
sange-2008502 回答时间:2013-7-8 08:55:36

RE:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

正要学习枚举过程

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版