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

【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

[复制链接]
mon51 发布时间:2014-3-31 18:51
STM32F207的HOST usb 非常有用,可以接U盘,也可以接USB接口的键盘。非常方便,但ST的U库V2.0,V2.1实际使用都有问题。
9 L' V3 Q+ j* b1 k9 ?经过修改,现在可以很好第读写U盘和连接HID键盘。
- W( k# s$ M" Q程序代码的核心是V2.1的库。2 H9 U/ p* i; E; m2 O* _- t2 n; ?
通过U盘D读写,可以方便地进行IAP-BOOT操作。以及用户键盘操作!
2 z( D1 G% d8 g" |. p
收藏 2 评论23 发布时间:2014-3-31 18:51

举报

23个回答
wn1900 回答时间:2015-6-1 10:44:41
这样看着很不方便,楼主可以打包,简单说明一下就好了,赞一个,辛苦了,楼主
小伟哥-353357 回答时间:2015-3-17 17:37:06
FS模式下 USBH_MSC_Read10读卡死是什么原因楼主能指点一下嘛??
mrzhanghw 回答时间:2016-4-11 14:02:09
能把程序打包发给我么?78725580@qq.com,谢谢楼主
mon51 回答时间:2014-3-31 18:52:44

RE:STM32F207的host USB的MSC和HID的合并开发

吃完饭来发电路和源程序。
mon51 回答时间:2014-4-1 10:51:07

RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

继续发图:) H6 d5 J+ g. b' \, v3 A$ [
电路很简单,占用F207的HS-usb:
mon51 回答时间:2014-4-1 10:53:18

回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

回复第 3 楼 于2014-04-01 10:51:07发表:
" x, }5 W' o0 a  Z! u继续发图:8 {: N. s" B1 q
电路很简单,占用F207的HS-usb:
  g% D9 C6 \  x 
& J* Z0 T) T, F" q/ I' e7 I' I
: L. V4 P6 Q+ b& {+ D8 S 
USB.png
mon51 回答时间:2014-4-1 10:55:01

RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

初始化端口程序:  T$ ]% |9 Y) X# Y7 j
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev){6 s. K- P0 @, O) e: n' t1 ~6 D5 e
  GPIO_InitTypeDef GPIO_InitStructure;
, g6 Z6 G/ j; n* g  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);
' {  e9 ?3 n) l" J  5 i4 S8 T( L: }
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12  |
4 |! }/ K" N0 @/ r5 s- ~    GPIO_Pin_13 |, g/ v( |' r2 c% H. H* G
      GPIO_Pin_14 |
2 R. D$ f# h" j; u& U% {8 T5 j        GPIO_Pin_15;
: q: |; c: `- Z( ]5 m  
# z) o7 @5 T- N7 s  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
2 g: ?* E1 C5 b  Y4 P  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;! j9 x9 O9 H: S
  GPIO_Init(GPIOB, &GPIO_InitStructure);  - e' v: O8 L6 ^8 o. w7 t  \
  " H" m! `5 `( X* Z
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_OTG2_FS) ; + k* s! z0 a6 ]$ E& g
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_FS) ;
- o. [6 R  J5 U' u4 M6 I- d( [  ?! y  GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG2_FS) ; $ m# f5 g7 U1 I# ^  i* ^% G% @
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG2_FS) ;
9 @  a6 R* n0 E0 e; e0 b        //---------------------------------------------------------------
! h) \' v( c5 H6 c  RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ; , ~: L% Y! H/ l) Y$ Q
        //-----------------------------------------------------------------8 B& g9 w1 i0 c4 A  q
        //Vbus_EN   根据实际电路修改!0 b6 S& A; o2 q" F; j
  RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE , ENABLE) ;  
$ m/ L0 Q+ ]: j2 p6 k. ?0 j, u  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
2 g% W: P  C% I7 d* C7 t$ [- S, V        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;
% A0 A7 A! O3 t3 |  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
: a& W/ D& s1 B7 G  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;  
9 s5 h- w) }) B: S# L- R: i  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
4 I5 J7 K% D; I( d* l) B  GPIO_Init(GPIOE, &GPIO_InitStructure);
8 P/ \/ L0 F, N# L; i         ! q( d  n0 w- g* h# p. _
        GPIO_ResetBits(GPIOE, GPIO_Pin_0);3 B5 e5 W5 u3 ]( F, D
        //-------------------------------------------------------------------  R  w* I! h( i. b. g/ R+ G
  USB_OTG_BSP_TimeInit();
) T8 r! k5 }) Z4 C        USB_OTG_BSP_mDelay(500);   //Delay is need for stabilising the Vbus Low
+ g' S- C. e5 x& }$ u! n* |}
mon51 回答时间:2014-4-1 10:55:30

RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

采用内部的:USE_EMBEDDED_PHY  ,所以直接用IO连接U端口。
mon51 回答时间:2014-4-1 10:57:01

RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

以下是ST原来的库函数定义文件头:2 d2 ?/ H. t4 \+ j
#ifndef USE_USB_OTG_HS
  S. V$ @" t. Y' G! |1 q* e2 _% ]#define USE_USB_OTG_HS
8 R% K  ~' E8 o: Q7 ?* M9 B. {1 T#endif /* USE_USB_OTG_HS */. t" c) g$ r: d
#ifndef USE_ULPI_PHY
5 @. k- x8 [2 I8 l! }, S //#define USE_ULPI_PHY/ r, u" n8 v2 K1 U2 ^
#endif /* USE_ULPI_PHY */' @. s/ M9 N3 U/ t
#ifndef USE_EMBEDDED_PHY- E) I3 H/ l. m8 \# w& m
#define USE_EMBEDDED_PHY- a. R$ H! y! W$ K$ o
#endif /* USE_EMBEDDED_PHY */$ B! G( R+ x9 c7 Y* W
#ifdef USE_USB_OTG_HS 5 Y$ T+ R0 K' [- I% H4 W/ I4 y6 W2 i6 a
#define USB_OTG_HS_CORE
& z- K" R' s" G4 o; {1 y% i#endif
+ w% a9 X7 n! U/*******************************************************************************. [! W2 d7 K/ N! O4 Y# P' X
*                     FIFO Size Configuration in Host mode% d+ V" O2 @1 }' f) c. q
*  
" a7 z7 ?# n8 w7 C2 [*  (i) Receive data FIFO size = (Largest Packet Size / 4) + 1 or
! F0 o$ a( V' q: t*                             2x (Largest Packet Size / 4) + 1,  If a 4 e+ ]. g4 X7 ^* f5 j
*                             high-bandwidth channel or multiple isochronous
3 f5 J, P& b8 l( Y# \( `2 L*                             channels are enabled
+ e' I$ W+ z+ W  k*
3 [" H" ^2 ^0 ]*  (ii) For the host nonperiodic Transmit FIFO is the largest maximum packet size
7 I5 a2 q- f( X8 l4 }4 j*      for all supported nonperiodic OUT channels. Typically, a space ' d2 I8 v' ?. m# E
*      corresponding to two Largest Packet Size is recommended." t% t! [7 M( P; j
*6 N- o4 q! `: B: B2 G
*  (iii) The minimum amount of RAM required for Host periodic Transmit FIFO is
" e2 |* Z* @5 d. O: m3 d*        the largest maximum packet size for all supported periodic OUT channels.
/ S7 B1 T* Z$ \*        If there is at least one High Bandwidth Isochronous OUT endpoint, , j$ ], Y4 x% d3 e+ S2 C
*        then the space must be at least two times the maximum packet size for 3 W$ L8 r: d8 i5 b
*        that channel.% Z0 \& t5 G0 L7 e& V& T
*******************************************************************************/2 D7 z' d8 D% `1 A4 g0 \3 t* X

/ O. e, R$ U; d/****************** USB OTG HS CONFIGURATION **********************************/
$ n; C) H  k4 r+ c. \2 l8 W#ifdef USB_OTG_HS_CORE- L4 L; w' U4 _, r6 `/ ~$ w) O
#define RX_FIFO_HS_SIZE                          512
: N: p- c( R- | #define TXH_NP_HS_FIFOSIZ                        256$ W8 ^1 ^2 @  G4 k, P# C* p* k
#define TXH_P_HS_FIFOSIZ                         256
! I* E) |9 S) R4 M8 D6 N+ B// #define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT7 {2 Q! q: [$ i, `
// #define USB_OTG_HS_SOF_OUTPUT_ENABLED5 v& E2 e3 E- k# r. B) q
#ifdef USE_ULPI_PHY: m# E/ r$ H8 H. N2 F- U
  #define USB_OTG_ULPI_PHY_ENABLED
7 Z# X( e2 @8 I! z  G #endif: G& W# G% V+ o3 b  a
#ifdef USE_EMBEDDED_PHY' w/ m4 C4 K$ u3 @1 r( R
   #define USB_OTG_EMBEDDED_PHY_ENABLED
  ^" N1 g" S' y3 r9 F; x9 @. s$ o #endif
! n: q: s7 j0 {1 l; f) I, R7 ^$ C1 |" T #define USB_OTG_HS_INTERNAL_DMA_ENABLED+ P4 u. X6 I* J7 }
#define USB_OTG_EXTERNAL_VBUS_ENABLED
# k5 p. ~- z  d- M2 y //#define USB_OTG_INTERNAL_VBUS_ENABLED6 P" {& N) [) X# }
#endif* Q1 h0 s) |  q+ U! a5 Y
/****************** USB OTG FS CONFIGURATION **********************************/
) s# Q& t; g: v1 m/ `#ifdef USB_OTG_FS_CORE1 b7 |  R' @* k8 \" R
#define RX_FIFO_FS_SIZE                          128
2 t3 l7 s) @% n8 E #define TXH_NP_FS_FIFOSIZ                         96
6 s4 C9 H3 ]/ q& V  C #define TXH_P_FS_FIFOSIZ                          96$ E4 s7 R0 Q7 P# H% i# M
// #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT# e0 s( `" f3 h3 e% U- x; ]8 x
// #define USB_OTG_FS_SOF_OUTPUT_ENABLED
* x& f5 w0 F3 r# S* s#endif9 J5 _* I9 d. B1 O- r
/****************** USB OTG MODE CONFIGURATION ********************************/
4 i& S, g- d6 }1 x2 _' f  u#define USE_HOST_MODE+ O3 M3 _* e0 G
//#define USE_DEVICE_MODE
* O$ a( O7 f" Z& }& [; M- Y//#define USE_OTG_MODE- M  m/ f# c5 t
#ifndef USB_OTG_FS_CORE! }- [& z! F- q2 q9 y2 y' x9 }
#ifndef USB_OTG_HS_CORE
* A0 I. ?7 ~) ?; P! ?) @9 h    #error  "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined") ~" M0 G! m0 _% F( E
#endif! @5 W- f, u1 z. t' O# H
#endif
! |* @: i7 \, N  k#ifndef USE_DEVICE_MODE
/ d2 \: M+ `3 j6 B# x- i #ifndef USE_HOST_MODE2 @+ v3 T2 k) O. ~
    #error  "USE_DEVICE_MODE or USE_HOST_MODE should be defined"4 R( B8 u' f* g+ y3 g
#endif
9 G2 p! R. R- R3 r) E#endif0 g3 Q% }, E8 z& r# d
#ifndef USE_USB_OTG_HS/ ?7 h4 n, z) c. m3 a$ |0 _
#ifndef USE_USB_OTG_FS+ Q% Y: t& ?1 W
    #error  "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined") `* i% R1 j% {4 C
#endif
3 ~& f" }! H9 s#else //USE_USB_OTG_HS  p3 S# m$ r4 b. |/ m, E
#ifndef USE_ULPI_PHY
7 S( o$ v( f) V  #ifndef USE_EMBEDDED_PHY
- z$ x# a: p  A8 b: S8 B/ u7 w4 y! I7 r     #error  "USE_ULPI_PHY or USE_EMBEDDED_PHY should be defined". E  `9 _, a5 S$ K& R- w) k
  #endif
' \2 ?) t# l  q# O #endif
; Q! N( [" b5 h5 l! v! ~+ |. I1 ?#endif8 E9 w" D4 g2 N( q0 K7 X
/****************** C Compilers dependant keywords ****************************/
* i; o' Q8 M7 @" s& \8 R3 S% y; f/* In HS mode and when the DMA is used, all variables and data structures dealing; r) Z1 R, z' z' Y7 v5 t
   with the DMA during the transaction process should be 4-bytes aligned */    6 S  K" H9 W: e1 M+ r8 U1 D
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED8 q' A# _- O  w$ i& Q1 [& p4 {
  #if defined   (__GNUC__)        /* GNU Compiler */
; f: n) ^5 Z) x1 m# d0 l    #define __ALIGN_END    __attribute__ ((aligned (4)))8 {. W; L% _" r
    #define __ALIGN_BEGIN         
! x  w0 P0 b' o  #else                           6 o; W. o. [( s2 g4 ?" _  M
    #define __ALIGN_END
" s" R3 I0 [" y+ i! R* l    #if defined   (__CC_ARM)      /* ARM Compiler */  K3 B8 V; T& c/ K
      #define __ALIGN_BEGIN    __align(4)  
& d$ \6 P$ D6 _* Z) ?4 N    #elif defined (__ICCARM__)    /* IAR Compiler */
+ X* ?: N% u, @: i  H0 h) V      #define __ALIGN_BEGIN 8 N" }# m4 ]/ ~4 g' @( Z1 j8 y
    #elif defined  (__TASKING__)  /* TASKING Compiler */
  z! n& Q1 _$ f      #define __ALIGN_BEGIN    __align(4)
6 T/ E1 t! `! h1 [  X    #endif /* __CC_ARM */  8 K* q0 D0 G+ ~& L' w: P1 J! L- r
  #endif /* __GNUC__ */
, M/ |- j: b2 @- R& o#else
# O7 p" [! R& l  #define __ALIGN_BEGIN- _! E( y- m# \& g
  #define __ALIGN_END   8 W. V7 C0 C. o4 r/ S$ g3 l
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */3 r: ]9 Z$ y$ `0 K$ _/ x# }* r
/* __packed keyword used to decrease the data type alignment to 1-byte */
2 K8 M7 {3 N' {. P( p, J#if defined (__CC_ARM)         /* ARM Compiler */$ p" V' \( _6 b8 I+ c( o
  #define __packed    __packed
- ~4 T+ }* z% \$ t#elif defined (__ICCARM__)     /* IAR Compiler */
4 o; G$ @* H# Q- V; b# [9 s  #define __packed    __packed$ t' P, Z9 t- }# M  `
#elif defined   ( __GNUC__ )   /* GNU Compiler */                        4 T# b% `" U, S$ Z; h
  #define __packed    __attribute__ ((__packed__)); f3 g4 {  u0 s7 K5 K% l+ J
#elif defined   (__TASKING__)  /* TASKING Compiler */
  I# s3 Q: a8 @/ s8 f0 Q+ O  #define __packed    __unaligned
6 T* G& ^+ X" m5 X#endif /* __CC_ARM */
mon51 回答时间:2014-4-1 10:59:15

RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

主程序非常简单:(这里是用U盘iap—BOOT为例):0 e' F; ~/ \: s6 ?8 O
int main(void){: P. v6 l# Y8 P
   
1 v/ {7 j5 n  }7 [) j9 @  /*!< At this stage the microcontroller clock setting is already configured, ' n% @: X0 y- W4 ~* ~9 O% Y3 E
  this is done through SystemInit() function which is called from startup
1 [) I* A6 H  \( @' s" o. R  file (startup_stm32fxxx_xx.s) before to branch to application main.  a# c0 E1 Q9 Q5 e
  To reconfigure the default setting of SystemInit() function, refer to
; t( ?* Z' B/ z) S' u! r  system_stm32fxxx.c file& G; H, c4 |0 K* f, d
  */  
* V# x1 Z+ @7 ~2 H0 {: ^, }  + @% s8 y% D) P7 H8 T; K
  /* Init Host Library */
3 H" }5 ~5 @- B  USBH_Init(&USB_OTG_Core,
3 x  K& r. m" U# u7 P/ B            USB_OTG_HS_CORE_ID,
6 `$ {( t2 A# J9 F1 T            &USB_Host,
/ Z3 F) Q1 u$ Z* {            &USBH_MSC_cb,
5 Z2 s9 U7 O4 i7 @$ B/ ~. `" }$ C            &USR_cb);- v4 k# F5 F7 y# Y4 H9 s) @
  ) m  e8 A8 p7 s9 e; n! c
  while (1){  X+ x+ H) n2 }0 X$ [0 O
    /* Host Task handler */
* ^+ [/ i" B4 |- b9 q    USBH_Process(&USB_OTG_Core, &USB_Host);! Q" @  x: a! b& j
                if(iapRun==0){5 x2 B8 M7 }8 S! V& e1 O/ {7 L
                        IAP_URN_UserProgrammer();
  y% e$ e" w4 d8 R                }
# E3 o7 s- J0 ~" X, H  }
' x7 L$ h* r, _1 S}
mon51 回答时间:2014-4-1 11:01:59

RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

由于HOST-MSC和HID的初始化全部相同,这里先不介绍,不同点是从枚举后分析数据协议开始,所以我们在这里添加设备识别代码,然后再根据不同的设备,做相应的事情,这里主要是MSC的处理和HID设备的处理,同样也可以添加其他的设备.
+ \5 J( r  L' ]8 R, ?  case HOST_USR_INPUT:   
& z8 c; z* z; O) c; |0 o    /*The function should return user response true to move to class state */8 ], H1 b' J# a+ r
          //修改:添加MSC-HID自动判别,然后再初始化CALSS-CB
9 ^8 q: E  C! W                if(JB_MSC_HID(phost,0)){ //0:判别MSC,1:判别HID) [* ~3 _5 C$ j# ^7 j9 d
                        SetHOST_USB_MODE(0);9 u( Z2 k& Q0 _
                        phost->class_cb=&USBH_MSC_cb;
$ T" W3 ]2 t+ R& e) e1 n$ y* c. r( K                        if((phost->class_cb->Init(pdev, phost)) == USBH_OK){
; G0 Z3 b! t* W: _: q8 U# b                                phost->gState  = HOST_CLASS_REQUEST;     1 s+ O# z+ x' [% C
                        }     
  g9 C1 ?5 \: ]$ B& P                }else{# x9 \- J5 t. B8 @
                        if(JB_MSC_HID(phost,1)){ //0:判别MSC,1:判别HID/ @9 Q, k+ e4 i
                                SetHOST_USB_MODE(1);
( u1 F4 b( s2 H+ x; v/ V$ s                                phost->class_cb=&HID_cb;
+ f# u- D1 U  |6 u( M, v* c                                //phost->usr_cb=&USR_Callbacks;//???????
8 l6 d& S* h' a; ?                                if((phost->class_cb->Init(pdev, phost)) == USBH_OK){: n  y+ g2 \$ p8 |8 Z" C$ Q6 ~2 P
                                        phost->gState  = HOST_CLASS_REQUEST;     
; F/ P$ D# N  j/ A0 [6 K/ y! C# A  @& ~                                } * E7 q' @$ k- c' @% V7 u
                        }) i( ~. B+ k1 X! y8 d/ M% k
    }   2 `  M- g; F, j, Y* o+ \& ~/ w
    break;
mon51 回答时间:2014-4-1 11:02:43

RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

case HOST_ENUMERATION:     
2 i, x  r7 w# e, a8 ]    /* Check for enumeration status */  
/ g( u' f# b5 d; G" H    if ( USBH_HandleEnum(pdev , phost) == USBH_OK){
# k! m% l  w1 B4 }" S+ `4 H, \: }      /* The function shall return USBH_OK when full enumeration is complete */
9 `4 m5 A: Q8 V# t      
0 y) i" R9 [0 C4 I7 M      /* user callback for end of device basic enumeration */
& {/ Q* e5 H3 _' P      phost->usr_cb->EnumerationDone();8 B8 A( F! K5 S- v, b; e# l9 b
      + U" a% I* d( R) m+ r: @
      phost->gState  = HOST_USR_INPUT;    % q& f/ k* v, V1 s( q% n$ j) F
    }% f/ M. [! d" V' T9 U8 P9 |
    break;
mon51 回答时间:2014-4-1 11:03:56

RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

这是判别代码:- Z' J3 T  \1 C3 o$ ]4 d) M
//修改:添加MSC-HID自动判别,然后再初始化CALSS-CB* \$ w0 m& |, {# W( R! N
unsigned char JB_MSC_HID(USBH_HOST *phost,unsigned char flag){//0:判别MSC,1:判别HID8 M' `4 i, i& \4 a" b6 f7 ]
       
6 d+ L0 i( c/ }6 C if(flag==0){
3 V' C! B* w& T- d. l  e        if(phost->device_prop.Itf_Desc[0].bInterfaceClass == MSC_CLASS){
- V8 ^5 l5 A# \' o                if(phost->device_prop.Itf_Desc[0].bInterfaceProtocol == MSC_PROTOCOL)        return 1;
' Q1 p. a& w7 L7 u$ n' Q- x         }
6 W9 n4 n+ z, r/ \  d* y }else{  U9 i/ S5 {6 Z8 _+ G4 l! x) b
         if(phost->device_prop.Itf_Desc[0].bInterfaceSubClass  == HID_BOOT_CODE) return 1;
* B6 I4 K) ~+ O) n }
7 R$ a! _' {0 I, Q$ r return 0;. q( I" I3 }0 m
}
mon51 回答时间:2014-4-1 11:05:29

RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

发的帖子,自动缩进的功能没有了,看起来不方便。
mon51 回答时间:2014-4-1 11:11:33

RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

另一个重要的函数,它影响了V2.0与V2.1对U盘的兼容性。2 x. ~, i& U9 H. f) E8 s
/**2 e8 n1 u% c$ O0 M
  * @brief  USBH_CtlReq
% F. N6 q: @# Z" ^7 n+ R4 `  *         USBH_CtlReq sends a control request and provide the status after / D6 \$ s8 F; E) S& ?9 H& p
  *            completion of the request8 _) c; s  m- e
  * @param  pdev: Selected device
* S5 K7 U5 @+ t' {$ `2 J  * @param  req: Setup Request Structure
: V$ t3 v. Y$ W7 _7 L# L  * @param  buff: data buffer address to store the response
; c0 S6 r2 Z# C  A4 D/ T  * @param  length: length of the response
1 A: t/ J# O( G; L  * @retval Status: i3 h5 F# D( U3 V* U0 i
  */6 G- d, R. {1 ]1 H0 m; G7 _
USBH_Status USBH_CtlReq     (USB_OTG_CORE_HANDLE *pdev,
( ]8 [& z: Z3 V1 J& ^: E                             USBH_HOST           *phost,
% C! l) ^5 _& v+ m% M3 {: A                             uint8_t             *buff,$ n9 q) L8 z( t5 c) R' L% O6 v
                             uint16_t            length)# e! Q' @; a/ P
{
/ F+ b8 a8 f  \4 o6 @) B  USBH_Status status;
: |; N* W$ q" N9 d9 a! j  status = USBH_BUSY;
$ K! @- C2 h. ^  # x6 n& w0 G: V
  switch (phost->RequestState)
9 H' I' X1 q) s; g$ N! r. ]  {
) ?+ ~( [9 P, ]$ S) z2 ~  case CMD_SEND:
- h3 ~; ?6 j: F, C' Z6 A    /* Start a SETUP transfer */, Z7 Q) N. ~3 u1 B
    USBH_SubmitSetupRequest(phost, buff, length);
. E, M5 S! e) r$ Q    phost->RequestState = CMD_WAIT;. P& {$ A. \4 v- t9 Y" n# u
    status = USBH_BUSY;
2 r/ k% G1 ]' B1 s- x    break;
: Z2 t7 ]' Y! |) }+ t: o. L3 R    , t( p' i: P$ i! Q) \, b5 S9 ?! c
  case CMD_WAIT:
+ U( A0 ]+ A  p, ~! i                if(Get_HOST_USB_MODE()==0){ //--2014-3-30 添加2种模式判别!!!
& |4 T; k' @8 z  d0 p. Q( O4 {8 S                        if  (status == URB_DONE){4 ^8 S7 s9 |3 n, S6 {1 T3 ^) P) ]
                                /* Commands successfully sent and Response Received  */       9 k5 j0 T' X* I  j; |( T3 x9 i, i" s
                                phost->RequestState = CMD_SEND;1 N+ e5 Z% e) q! s; i/ M6 g
                                status = USBH_OK;, O% J. _- ^# [! P: I" B
                        }
( q+ O. o- Y2 t0 i, a' L6 _( E  \                        else if  (status == URB_ERROR){
1 e$ W7 |# B1 |3 v* ~                                /* Failure Mode */
+ `/ x6 |( [9 V. m( I                                phost->RequestState = CMD_SEND;$ j' }- U( n: n( Y# V8 y
                                status = USBH_FAIL;
1 ], Q: Q; P5 v                        }   
$ X  j1 J' \6 `! q" \+ @                         else if  (status == URB_STALL){% _: @$ `( G, w( y% [7 H
                                /* Commands successfully sent and Response Received  */       5 L6 {% O( J4 E' j% n! [: ]
                                phost->RequestState = CMD_SEND;
$ K3 n( X/ G4 c% p: D                                status = USBH_NOT_SUPPORTED;4 @9 u( [6 r9 {: y
                        }
/ {3 r3 ~7 l* X; g. J                }else{
' T/ Z7 _  M" O7 w( H                         if (phost->Control.state == CTRL_COMPLETE ){//HID 处理!!. R3 b& P/ ~' s7 I. z
                                        // Commands successfully sent and Response Received      
3 v# a# a4 V/ V3 X* W& _: Y                                        phost->RequestState = CMD_SEND;
, Q, {" F: A4 z, Z                                        phost->Control.state =CTRL_IDLE;  
/ |" g( E2 R& b5 D  i6 Y+ G                                        status = USBH_OK;      
* ]) `- G( S( F1 S* u: w$ |6 Q                                }
' i" y, {/ K2 n9 `' l1 S                                else if  (phost->Control.state == CTRL_ERROR)' ?9 n* O! ^, X; L. m0 @) R6 o
                                {
+ D0 K5 _7 X& g1 I# f0 g0 R. G: E                                        // Failure Mode 1 L" J8 g* T) _* Z0 V
                                        phost->RequestState = CMD_SEND;! `  f# c7 h( ^4 x
                                        status = USBH_FAIL;! G8 O: Z1 P2 m
                                }   
5 _4 c$ i. V; m% f0 Q                                 else if  (phost->Control.state == CTRL_STALLED )
7 e( i- I0 T- m: V- N5 z                                {5 H( h, c/ K" ]' F% z
                                        // Commands successfully sent and Response Received         
7 S  e( \1 _& Y7 ]7 ~' v6 v                                        phost->RequestState = CMD_SEND;4 _* i3 y  y7 @) f
                                        status = USBH_NOT_SUPPORTED;
5 |! z9 C) L& ?: s" v8 M# V5 F                                }
' ~! F; a; X. L8 u! f2 j5 B& Z0 b- l                }$ ]" e" w) z& ^4 o
        break;) z2 p$ J3 l* N( {$ r
        //-------------------------------------1 J3 x6 L" Y# T6 o
  default:# i5 x" a% _3 F+ r  i0 V
    break;
( g( B7 A  R2 `6 x5 Q) Q0 K  }0 |! B, A% ]5 j
  return status;; d( M% x; o& x( [$ l4 ?. s
}
zydwh 回答时间:2014-4-1 12:33:19

RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

请把程序打包后上传。谢谢!
风云1999~ 回答时间:2014-7-29 14:35:17

回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发

 正需要看这方面,怎么看不见
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版