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

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

[复制链接]
乡村布拉德 发布时间:2008-12-23 12:12
USB设备能否工作,枚举步骤,用“乡村爱情”里的话说,“必须的!”,网上也有很多资料,圈圈就提供了一份详细的枚举过程,但对STM32是怎么响应的没有说明,一会详细道来,先上圈圈的提供的那个枚举图示,希望圈圈支持,如果不妥,请与我联系,谢谢。   f* {4 T. I. ~
我将此转换成了PDF文件,方便查看。* M- ~/ L7 }1 o- c* e
首先说明一个变量,定义在usb_core.c中:
+ N) n) C# L& Pvolatile DEVICE_INFO vsDeviceInfo; 7 ]2 S- @+ C# ^
看意思就知道他的作用了,DEVICE_INFO是个结构,定义在usb_type.h中:
* ]" ~( Q3 a( A* h6 l// ***************************************************************************** % R: A0 O5 w* f. P* ]
// DEVICE_INFO ! {4 t: z' H8 I; ^: H8 |
// ***************************************************************************** ( T8 f/ p2 }( O) u$ U, p7 N
typedef struct _DEVICE_INFO
7 g  r, u1 j/ G8 g: i{
5 h* L1 E! I/ ]8 J7 Q  unsigned char bDeviceAddress;
- P, _7 n( l1 Z8 a& S+ }' F5 P- H% I! U* K9 a2 E9 D- ~
  unsigned char bCurrentFeature;
9 D& y( J$ Y2 `- }+ A  unsigned char bCurrentConfiguration; 6 m- _  Y' n$ ^/ z; V/ ]" N
  unsigned char bCurrentInterface;
  |. c7 n# r- s* D2 F) D) v  unsigned char bCurrentAlternateSetting;
. F; M! `) |( f( z  r. ^  ?% K6 ^% X( H9 ^. [& K* b
  WORD_2BYTE    uStatusInfo;
6 M/ e2 a/ `3 ]. m
" [3 ]! h' Y! w% {/ e  DEVICE_STATE  eDeviceState; 7 v1 \! o& @" O' q  ~* W; t. x' W
  RESUME_STATE  eResumeState; 8 i: C0 |" p: Q; _& ~6 T
  CONTROL_STATE eControlState;
% k5 r/ q1 R- _" N, M6 V
9 a* p1 C/ e0 i, H6 h  SETUP_DATA    SetupData; " N. C% l$ o# o
. n: a# X2 s' `- R
  TRANSFER_INFO TransInfo;
. N4 e0 C$ }# N}
' x, g$ ]. s7 QDEVICE_INFO,
$ P" D( @: b" _3 G: f9 G8 _*PDEVICE_INFO; 8 N+ c; o. E- _# Y

/ }! S% h4 y2 P4 S在枚举过程中,就是如何处理好SETUP事件,如果STM32 USB接收到正确的SETUP事件,将响应函数CTR_SETUP0(),SETUP事件是特殊的OUT事件,数据方向 Host->Device,SETUP事件数据长度固定为8,数据定义在DEVICE_INFO.SetupData,其数据结构是(定义在 usb_type.h中): ! B8 W7 i  j6 q; @6 X  m4 k9 ?
typedef struct _SETUP_DATA
; w% B3 F& g" V5 M{ ( q7 x6 b" X. ?7 Z! x6 [
  unsigned char bmRequestType;            // request type . h/ R3 ]$ p; o' F* e
  unsigned char bRequest;                 // request code
5 A5 F! J% I" h  s9 ]. G
& F% S/ j  [; |; K0 B! q% p  f4 o  WORD_2BYTE wValue; - D9 s9 y4 I! |
  WORD_2BYTE wIndex; 1 h7 z  ]8 R6 e& C- {  O5 [
  WORD_2BYTE wLength;
- s# [- D% ^- f( a2 {& R; `}
% a, T$ r* n" _4 v5 [* n- p# z! G7 TSETUP_DATA,
7 D: N. A+ x- }" I0 E! U*PSETUP_DATA;
" m- s1 ^% d6 a8 X4 Z; m/ R# o
* i' t' r  A: W% t% ^WORD_2BYTE是定义的一个共用体: : Z3 A. l& d5 b# b# N; }  {
typedef union _WORD_2BYTE
% ?# a; Q9 q! L' ]) Y{
2 k7 s# B$ U( u  unsigned short w;
2 M( N" z# |) m' X3 o) F# n- j: @  struct
( f9 ?! {2 e, a0 F: @  {
! v8 X- ^# r4 s3 Q% l5 [# P    unsigned char LSB;
2 w0 t0 c: M( b$ f    unsigned char MSB; 0 n/ G: s0 p- p, Q
  }b;
5 n" L: u3 z" n( t) W} ( T. b4 h; K: E! r8 }) S
WORD_2BYTE; - d) c- R6 r5 l4 Q" G) q4 Y  m* E
0 G, q' E+ n. S3 F- i4 O1 x) {+ z$ T
为什么将SETUP数据结构中的wValue,wIndex,wLength如此定义? ( z. E2 e5 s0 ?5 b" O4 t8 U
1:USB协议中所有数据传输都是依照低位在先的原则 / k& M# a; A# W' G
2:高地位字节可能功能复用 ' u* ?  }- w8 Z  x8 x% k
这样在后续的程序编写中就变得十分方便,ST提供的USB固件方法同样如此,但这方面的处理让人有些摸不着头脑,详情可参阅。至于具体的SETUP数据结构含义如何,还是要具备基本知识:了解USB协议
4 C5 ]( c' `. S5 u% m1 n9 H, [% w1 O: j4 i! Z
CTR_SETUP0() 函数将SETUP数据提取出来,SETUP数据结构有0长度和非0长度的数据结构,详细参阅USB2.0官方协议第9章。在这将两种区别开来分别执行 SETUP0_NoData()和SETUP0_Data()函数,并返回结果,根据返回结果再响应USB主机 ! D' C, D1 w; j+ h1 o
// ***************************************************************************** 4 T( f" d2 i8 b' v
// Function Name  : CTR_SETUP0
4 g8 P' r, \; A0 f// Description    : 5 W; C4 [7 x+ Z8 L
// Input          :
+ _! [4 M$ S* d# g// Output         : 9 N" s5 m, D/ s
// Return         :
0 v6 Q  Q# t+ K% N# {: f1 |// *****************************************************************************
$ q* o' |* d4 a: T# v6 J$ Kvoid CTR_SETUP0(void) 0 e$ I7 u8 V" J' p
{
" K2 s$ A4 _- H# ]$ V0 V  RESULT eResult;
' a$ J% O4 Q0 C: Z- C2 o! W# G$ @8 ~* [$ Y. I' N
  BufferCopy_PMAToUser( (unsigned char *)&vsDeviceInfo.SetupData,
% L; s: f. U! S6 R3 u+ U' N                        GetBuffDescTable_RXAddr(ENDP0), / Y+ J' B* {  T/ d- ^
                        GetBuffDescTable_RXCount(ENDP0));
5 v, n: D" t  _8 e! j; o8 r( }  _# C
  if(vsDeviceInfo.SetupData.wLength.w == 0) , \8 e7 L" J6 B
  {
$ J) B. t: d/ k, Q) h: C! {    eResult = SETUP0_NoData();
1 W  u' F9 @: X& S$ G( A, S4 ?* Z  } , o5 o0 c1 g( v  }2 R9 i
  else + V* ?& r9 a  |1 i( q# f+ N& z
  {
) ?! b$ E) z* h; S+ m" L    eResult = SETUP0_Data();
: N# M6 v5 u' V5 b1 {7 W/ r* |  }
3 d+ ~% x) t9 v3 H2 t/ q  `& j, K* ^& o7 S) S$ ?8 W( i
  switch(eResult) . s* B% R! O( S$ D+ |1 A+ Y
  {
1 o* g/ F- B* B- I/ _& W+ s  case RESULT_SUCCESS:
; v$ A9 `/ x! {) i) k: K3 M8 d" U+ G& H' ^' R1 f( V; {
    break;
' g+ }- Y% N& a$ A6 V* r! m& W
5 `4 r# R' V, c4 }) C  case RESULT_LASTDATA:
: W9 l- y1 ^# M' E' n# `! L& o7 V: M6 l7 G0 K
    break;
2 L% n! v, W; F8 m7 N2 c8 a  P6 M! X. z: l, Y+ \# z: a) I
  case RESULT_ERROR: / C7 Y+ Z+ W! e3 E; T6 t
  case RESULT_UNSUPPORT: 9 w: l: S1 K# ?' P1 o5 N) q
    SetEPR_RXStatus(ENDP0, EP_RX_VALID); 8 c9 u6 F* X: X& S0 c8 Z$ X0 M/ f
    SetEPR_TXStatus(ENDP0, EP_TX_STALL); 9 |4 v& [7 ~; e+ P: B
    break; ' e5 s/ e$ u" G. i: v* c
  }
! B5 K. L# N+ `5 _} ' X( K3 A2 g- K3 \& M
1 u0 b! n; j& V  `
SETUP0_Data() 和SETUP0_NoData()函数支持的所有USB请求类型只有罗列的这些,有多少种组合都定义在USB协议中,程序根据请求代码,再去执行对应函数,这样做的目的就是让程序结构明了。其中注释为"// done"的部分表明此部分功能已完成。对于未完成部分,希望大家在交流中完善。 7 M( z: X1 c" x9 d0 v! b- t

/ P) O4 A! V3 \6 @// *****************************************************************************
1 t9 J& @& D+ l// Routine Groups: SETUP_Data 1 B+ H! b6 d" v  J* ?, ]* e- o
// ***************************************************************************** ' H) H* w8 }2 m
RESULT SETUP0_Data(void) 1 A( g( Q7 l5 B- k* H$ y$ c
{
7 c- N& c( `) u& J& R% E/ E5 k4 U  // SetupData.bRequest: request code & x, b* K. z$ Z, O# l) _6 s6 I! b
  switch(vsDeviceInfo.SetupData.bRequest) * o5 u9 ^# j% f1 q6 h
  {
9 E1 L' ^1 {$ n' _# O' {. n4 s  case SR_GET_STATUS:         return SR_GetStatus();                  // done 6 F  H$ X) l5 ?
  case SR_GET_DESCRIPTOR:     return SR_GetDescriptor();              // done
" \( P# s, ~8 z9 A3 k5 p, |/ q+ F  case SR_SET_DESCRIPTOR:     return SR_SetDescriptor();              // unsupport
2 F* ~9 d( o3 a- J' Y) ^  case SR_GET_CONFIGURATION:  return SR_GetConfiguration();           // done
& ?% a& |$ A& e0 l7 j3 {  case SR_GET_INTERFACE:      return SR_GetInterface();               // unsupport " Q# K3 y# D* ^
  case SR_SYNCH_FRAME:        return SR_SynchFrame();                 // unsupport
9 S% S# Y* R/ R; {! u7 S+ b2 _( r9 {
  default: return RESULT_UNSUPPORT;
) V+ ~# r' ?9 T  }
5 S: Y7 o. o7 E, G! O} $ x- z: d7 e9 k' Q; Z# u, x
9 e6 z3 ~( h2 W) L  r
// *****************************************************************************
( i/ u3 n6 n% Z" C; v7 D// Routine Groups: SETUP_NoData
3 `4 |9 C! Y0 Z5 F( |( l! E4 L// *****************************************************************************
- g8 F$ S. [0 e+ D! t1 ~1 eRESULT SETUP0_NoData(void) % q' ?, e+ g: E$ g3 J1 C
{
) y+ B* X8 n! h: ]  // SetupData.bRequest: request code
5 ?. i; t: R2 o) M' {1 L+ P# G$ c  switch(vsDeviceInfo.SetupData.bRequest)
9 O2 x7 m, W  Y* I$ @6 l  {
/ K7 h  j2 k, `5 X- p  case SR_CLEAR_FEATURE:      return SR_ClearFeature();        // unsupport & o! Q# P7 ]1 |4 ?( o
  case SR_SET_FEATURE:        return SR_SetFeature();          // unsupport
' I+ k; v) r5 t  case SR_SET_ADDRESS:        return SR_SetAddress();          // done
  j; ?- S) f, ^7 u$ g# G& h  case SR_SET_CONFIGURATION:  return SR_SetConfiguration();    // done
$ y6 F% S) }' y$ g  b8 H  case SR_SET_INTERFACE:      return SR_SetInterface();        // unsupport
% x; ]2 o3 q2 A5 {" w
  O' b2 Y+ ?0 c  default: return RESULT_UNSUPPORT;
9 r9 \; r" y7 j, N1 u  } ! O0 Q) w1 L1 a7 [$ w4 N
}
6 p7 B4 M' N. L9 L# X8 f+ w7 n
' X! x$ A9 B' X0 F4 C6 ^下篇将介绍上述的各个请求函数如何响应主机。
* M% w5 J5 y' s  C1 ]6 q

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 手机版