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

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

[复制链接]
乡村布拉德 发布时间:2008-12-23 12:12
USB设备能否工作,枚举步骤,用“乡村爱情”里的话说,“必须的!”,网上也有很多资料,圈圈就提供了一份详细的枚举过程,但对STM32是怎么响应的没有说明,一会详细道来,先上圈圈的提供的那个枚举图示,希望圈圈支持,如果不妥,请与我联系,谢谢。
3 r8 z5 R+ ]2 I$ e: a" h我将此转换成了PDF文件,方便查看。
, E. T9 p& X8 b% r( D! a首先说明一个变量,定义在usb_core.c中: . E2 o2 e* V* v& U( D3 ?
volatile DEVICE_INFO vsDeviceInfo;
2 L5 P. h' f8 @/ o0 l& d看意思就知道他的作用了,DEVICE_INFO是个结构,定义在usb_type.h中:
# B* W  \8 c  N+ K// ***************************************************************************** 9 D1 K; d1 d  A* Q* S% {) d
// DEVICE_INFO
0 C! `/ X7 H8 r// *****************************************************************************
- t) p% ^: E+ r& E& V2 z, Mtypedef struct _DEVICE_INFO
% v9 l% ~; d& ]# {3 X9 Z( e' h{ 4 E% x( K" Z' u0 X+ c; d- H
  unsigned char bDeviceAddress;
7 _# w; Q; o) y, T
7 a0 Y; n( q* q+ g  unsigned char bCurrentFeature;
" \; J4 ^  D! Y( t. E) G4 S6 \  unsigned char bCurrentConfiguration; 9 k5 s* R. M* H: z; l
  unsigned char bCurrentInterface;
* U/ ^9 c6 `8 x; E2 K/ _! U: O  unsigned char bCurrentAlternateSetting;
* y) }. `8 h3 ?/ |6 s& X* C8 `1 L, R( L+ o! V: g
  WORD_2BYTE    uStatusInfo; $ n; U6 O) e* b* J

5 Y2 i1 |: \( D7 n  DEVICE_STATE  eDeviceState;
$ K) u% Q: n5 K; `" C0 y6 F  RESUME_STATE  eResumeState; 6 T# @1 c  g2 [
  CONTROL_STATE eControlState;
- \- ?* g- v  f- c: {" 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

. i3 I  D. r2 J' L  TRANSFER_INFO TransInfo;
% ~" o. ^9 ^3 I* D0 |# \}
9 a2 r* v, C- X5 D. A6 kDEVICE_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中):
$ P) @- I0 f0 _) T9 Wtypedef 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
2 L7 r5 F# y4 ?" y) _& D4 @9 y
. ?1 P) j/ \. f( A  WORD_2BYTE wValue; ) v% q6 f6 J4 [' N2 Z
  WORD_2BYTE wIndex; , H& |# [5 x7 U
  WORD_2BYTE wLength;
: O; B0 Z% N+ e0 i0 N}
7 {4 L6 _9 H+ x7 b9 RSETUP_DATA, ! ~' Z" H" L8 z! _: v
*PSETUP_DATA;
4 Q; W6 B$ z; A" _+ 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
4 a; y) M$ ?7 G0 |4 J  C{   h6 c7 \$ Q+ H  e* ^" r
  unsigned short w; 9 F* q0 b- w+ Y6 H
  struct 9 ~; n4 B8 ~/ g  [
  {
" |2 X! g% O% d! p( S    unsigned char LSB; " x, D5 E7 T/ W( z5 B
    unsigned char MSB;
5 T$ B4 z5 z/ C" T- B  }b;
* N& F, Z$ Y: D2 O7 F! d& K2 c9 K6 S} & t# v- M8 Y5 `, e; {, o! D# H
WORD_2BYTE;
; g" A0 H! z  W2 `. @+ ^! ]  P' |5 Q" @9 R( U) l. H
为什么将SETUP数据结构中的wValue,wIndex,wLength如此定义?
7 C, P) H" J; R1 s4 `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主机
' ~9 g$ Q+ `7 `1 w5 `+ j// ***************************************************************************** * T4 N  A: G5 k. @5 a
// Function Name  : CTR_SETUP0
8 h* M2 }$ s7 M// Description    : ! y% D7 c- S( n8 `
// Input          : # ~7 K1 |0 Y1 o, }
// Output         :
- n- q0 f! \0 M- O' T// Return         : 7 @4 H# h9 D8 Y6 ]/ I9 B4 ]( M1 _
// *****************************************************************************
8 o' O. G, h8 F. T" E0 Pvoid CTR_SETUP0(void)
; y; J6 |0 |# I" M4 ?{
; e  Z8 x0 d& b" J  RESULT eResult; . |8 n- H' q6 p" c7 F' }/ G

1 C' N: u# q* p+ O4 P* f) H  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)
+ ^- D: P  h5 }. m: n5 E9 P- }  { ; I' d3 V/ H& [& ~
    eResult = SETUP0_NoData();
2 G& c/ m1 Y$ J) ~  }
1 I9 `% {" N$ i2 r5 ~/ S  else / W0 A! ], n; i  L
  { + k5 c; S. \6 ~9 d+ j
    eResult = SETUP0_Data(); , |+ `1 j4 Q# ?
  }
+ Z9 H$ a! _( w! |: T. ~
, k% H3 `0 J' U+ n  switch(eResult)
1 H3 }0 `7 F7 f8 x# Y7 t  { , Z# |* t! p& j4 y
  case RESULT_SUCCESS:
9 K! a  B, d( m3 K: c& e' V( e3 a$ f; p
    break;
$ t9 W4 z- {9 D
5 I: q9 \* u/ d' v( e* b* n  case RESULT_LASTDATA: # ^( a# u: f+ {( j0 C

; N" R$ B1 ]9 ~4 D" v/ R' T    break;
9 p' \) w' g: W' k
% u# |1 r6 q+ g9 B+ ]  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);
( e* @5 Q- x# Z: z3 t    break; 1 f* |3 W- l* c
  } 7 B5 `( L2 u, H9 i) C( Y% m
} ! w2 P* D9 M8 P4 y

5 |+ c7 R/ i, e: \% E8 K: aSETUP0_Data() 和SETUP0_NoData()函数支持的所有USB请求类型只有罗列的这些,有多少种组合都定义在USB协议中,程序根据请求代码,再去执行对应函数,这样做的目的就是让程序结构明了。其中注释为"// done"的部分表明此部分功能已完成。对于未完成部分,希望大家在交流中完善。 . w1 Q9 l& T" J; @. y  A$ r9 b/ s
, |/ ^% J  N# r! }: i
// *****************************************************************************
% i* K- }( T: e+ s// Routine Groups: SETUP_Data
) U4 M4 g; t/ P( p5 p// ***************************************************************************** 7 Z* {; q1 Q1 t' D
RESULT SETUP0_Data(void) 6 t; e$ ]+ f! S: [. ^: v
{
7 d+ C8 \1 B6 R/ [- A/ O1 j  // SetupData.bRequest: request code
2 y4 F3 m3 U- _  switch(vsDeviceInfo.SetupData.bRequest)
. S( }' w( n7 \8 F9 [9 z( L  { 8 D" z+ W" O) m/ \4 v
  case SR_GET_STATUS:         return SR_GetStatus();                  // done
: C% Y0 E, z. l5 K( k$ m% G1 {  case SR_GET_DESCRIPTOR:     return SR_GetDescriptor();              // done
/ x) n$ I5 w& T% m$ ~6 f9 T6 [  case SR_SET_DESCRIPTOR:     return SR_SetDescriptor();              // unsupport ) B8 o8 {; G/ \" P# }
  case SR_GET_CONFIGURATION:  return SR_GetConfiguration();           // done
1 h/ i1 n. i9 n6 @3 N+ j  y0 A  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 _

4 y4 }8 t. M+ n( @// *****************************************************************************
& z) X( p' J, m* a// Routine Groups: SETUP_NoData
: i7 I4 S9 n6 s- b  i// *****************************************************************************
' [! t1 ]8 N! F; F1 IRESULT SETUP0_NoData(void)
; T, {9 R# L2 {$ e6 ?{ 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
: a9 D8 I& B: @8 S7 _% i; J  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
4 S& n8 y* M( T5 n2 r! a) s! I) d+ A: z' {7 @/ _
  default: return RESULT_UNSUPPORT;
  I5 A2 G! A/ X# N$ z0 \1 T  }
3 N) R9 n$ Y3 V! W) V* v4 I: Q% K} " 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

赞 收藏 评论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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版