圈圈发布USB图书第二版有感,以及分享一些我学习USB过程...
最全USB HID开发资料,悉心整理一个月,亲自测试
USB Audio设计与实现
【MCU实战经验】+STM32F107的USB使用
STM32F4-DISC 实现USB主机(U盘)和USB设备(虚拟串口)自动切换
STM32 USB-HID通信移植步骤STM32 USB HID键盘例程
stm32f207/stm32f407擦除内部flash讲解
【经验分享】STM32F2 中 DMA 的 FIFO 模式
【经验分享】在进行 USB CDC 类开发时,无法发送 64整数倍的数据
如何让CDC类USB设备批量接收64字节以上数据
RE:STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
电路很简单,占用F207的HS-usb:
回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
继续发图:
电路很简单,占用F207的HS-usb:
# J* Z4 w( ?3 e1 w. V
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev){) K$ I. i$ J5 C# t0 t) i3 R5 Y A
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);( }4 D8 A! Q u& A
' O0 U/ M0 ^" \0 c
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |
GPIO_Pin_13 |$ m" M" L- k' K) v
GPIO_Pin_14 |
GPIO_Pin_15;" a6 K0 q( F! W* ~3 ]0 F% _
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;2 M: `& T2 \/ {1 J# x- @% @
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;4 I* d- e X0 H8 P" P
GPIO_Init(GPIOB, &GPIO_InitStructure); ; j( T5 k9 Z8 d- s
GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_OTG2_FS) ; , z6 m& D& g* y2 V: @/ Z/ ^& m
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_FS) ; ( o2 v E2 u( A0 O( B3 `
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG2_FS) ;
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG2_FS) ;& z) w0 t7 _* n
//---------------------------------------------------------------% X/ X% @& \0 m; K2 z7 a; Q
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ;
//-----------------------------------------------------------------9 G) P) O A7 H
//Vbus_EN 根据实际电路修改!" v6 @% g8 B* l
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE , ENABLE) ; 5 C3 l0 z9 z! j, A- Z
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;( R! b+ A! m5 ^/ _, ^9 B
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; * e* A4 j! f: a4 U- E9 ?$ ~' y
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_ResetBits(GPIOE, GPIO_Pin_0);
//-------------------------------------------------------------------* @4 B0 u- j8 R3 a
USB_OTG_BSP_TimeInit();
USB_OTG_BSP_mDelay(500); //Delay is need for stabilising the Vbus Low
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
#ifndef USE_USB_OTG_HS- J5 ]9 q9 ]6 k) Y8 {. r
#define USE_USB_OTG_HS
#endif /* USE_USB_OTG_HS */4 c9 u2 t; c* z
#ifndef USE_ULPI_PHY
//#define USE_ULPI_PHY6 I: Y: G8 Z5 O) u
#endif /* USE_ULPI_PHY */
#ifndef USE_EMBEDDED_PHY0 m& j$ `- K, H0 g
#define USE_EMBEDDED_PHY
#endif /* USE_EMBEDDED_PHY */
#ifdef USE_USB_OTG_HS / X7 @1 C# P5 R8 [
#define USB_OTG_HS_CORE
#endif
/*******************************************************************************
* FIFO Size Configuration in Host mode
* ( P) J3 k. h8 D# j" \& h6 K
* (i) Receive data FIFO size = (Largest Packet Size / 4) + 1 or
* 2x (Largest Packet Size / 4) + 1, If a
* high-bandwidth channel or multiple isochronous
* channels are enabled
*
* (ii) For the host nonperiodic Transmit FIFO is the largest maximum packet size 5 \" B$ M! _; j/ j# p& O, h+ j
* for all supported nonperiodic OUT channels. Typically, a space
* corresponding to two Largest Packet Size is recommended.& m( E ]% ?. v/ U3 u
*( F$ B% h$ G( r' ^ Q* ]7 U) O3 l
* (iii) The minimum amount of RAM required for Host periodic Transmit FIFO is 3 V" K/ j2 R/ ?$ h. n6 ~7 R
* the largest maximum packet size for all supported periodic OUT channels.
* If there is at least one High Bandwidth Isochronous OUT endpoint,
* then the space must be at least two times the maximum packet size for 7 ]2 @; L- }, `; r
* that channel.
*******************************************************************************/
# S7 V* [5 b* Y! t1 b+ @
/****************** USB OTG HS CONFIGURATION **********************************/3 i$ W$ X8 P W# R$ p
#ifdef USB_OTG_HS_CORE
#define RX_FIFO_HS_SIZE 5121 D% q0 y. n: [. k2 b6 W4 ^* t, c
#define TXH_NP_HS_FIFOSIZ 256
#define TXH_P_HS_FIFOSIZ 256, j, w5 B* T# U6 m& ~
// #define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT& K L4 z2 C+ ?) o8 Y
// #define USB_OTG_HS_SOF_OUTPUT_ENABLED
#ifdef USE_ULPI_PHY2 b- ?0 g$ U& t t- X0 @ m/ y7 `) X
#define USB_OTG_ULPI_PHY_ENABLED5 D. _5 ~2 L+ o! t+ B
#endif
#ifdef USE_EMBEDDED_PHY
#define USB_OTG_EMBEDDED_PHY_ENABLED
#endif7 ]% v) @7 j. T
#define USB_OTG_HS_INTERNAL_DMA_ENABLED
#define USB_OTG_EXTERNAL_VBUS_ENABLED* U! C$ Z9 _- U4 S# \
//#define USB_OTG_INTERNAL_VBUS_ENABLED9 u. x, _- ~( C$ G3 P5 l2 l
#endif
/****************** USB OTG FS CONFIGURATION **********************************/% ?" ~- b4 O- _8 S" A/ f& h/ O
#ifdef USB_OTG_FS_CORE
#define RX_FIFO_FS_SIZE 1288 O* o8 _$ I, t" n- ^7 d7 l3 U
#define TXH_NP_FS_FIFOSIZ 961 U" v" J5 _( L/ G
#define TXH_P_FS_FIFOSIZ 96
// #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT
// #define USB_OTG_FS_SOF_OUTPUT_ENABLED
#endif7 f$ _ h5 Q# K. @2 C7 j
/****************** USB OTG MODE CONFIGURATION ********************************/7 {2 V/ @/ F t8 o
#define USE_HOST_MODE$ o1 [, a) ] c8 ]- |2 n
//#define USE_DEVICE_MODE& Q+ V7 B% H0 l ]/ x3 D
//#define USE_OTG_MODE
#ifndef USB_OTG_FS_CORE
#ifndef USB_OTG_HS_CORE
#error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined"0 S6 v! r) ~3 }( Z- O/ e5 m
#endif
#endif; y8 [+ |0 W" U( S
#ifndef USE_DEVICE_MODE
#ifndef USE_HOST_MODE v5 r8 k( i+ u$ {7 S; F
#error "USE_DEVICE_MODE or USE_HOST_MODE should be defined"1 e$ x- S5 X& `, z: U# w6 N
#endif3 u3 U9 I/ g# \6 |4 _1 t1 r% S
#endif* R% B: ?3 b8 N% P4 ~
#ifndef USE_USB_OTG_HS
#ifndef USE_USB_OTG_FS( y5 C1 ^6 o* l" Q* p( t5 K
#error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined"0 A: b0 B) X1 l+ K+ U) f
#endif H/ W( P; Z+ \0 K% f
#else //USE_USB_OTG_HS
#ifndef USE_ULPI_PHY
#ifndef USE_EMBEDDED_PHY7 ^& J, f4 Z* K$ i8 N
#error "USE_ULPI_PHY or USE_EMBEDDED_PHY should be defined"
#endif
#endif7 T+ w5 t s4 o' G( |8 u9 S3 a) E
#endif' F2 G7 N& z2 z4 h0 H
/****************** C Compilers dependant keywords ****************************/
/* In HS mode and when the DMA is used, all variables and data structures dealing
with the DMA during the transaction process should be 4-bytes aligned */
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
#if defined (__GNUC__) /* GNU Compiler */
#define __ALIGN_END __attribute__ ((aligned (4)))
#define __ALIGN_BEGIN
#else 6 o# h0 \' U: Y4 V
#define __ALIGN_END
#if defined (__CC_ARM) /* ARM Compiler */
#define __ALIGN_BEGIN __align(4)
#elif defined (__ICCARM__) /* IAR Compiler */! a( l. I( c% ]& O1 z
#define __ALIGN_BEGIN
#elif defined (__TASKING__) /* TASKING Compiler */
#define __ALIGN_BEGIN __align(4) ; H0 e& B0 A; [( R
#endif /* __CC_ARM */ 8 C/ r, n6 x( y" F% G
#endif /* __GNUC__ */
#else" ?7 k9 E: ~+ u( L. O5 m; v7 _
#define __ALIGN_BEGIN
#define __ALIGN_END
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */; W E0 X4 P/ a% S/ k# u
/* __packed keyword used to decrease the data type alignment to 1-byte */. [$ }4 K7 y& a, I b
#if defined (__CC_ARM) /* ARM Compiler */
#define __packed __packed
#elif defined (__ICCARM__) /* IAR Compiler */$ O) i* m2 J+ ^" ]7 }
#define __packed __packed% G, W8 A+ A e3 G! ?: Z
#elif defined ( __GNUC__ ) /* GNU Compiler */ ; J* Q/ A! K( T1 R; R d
#define __packed __attribute__ ((__packed__))" a7 h7 |) c2 k
#elif defined (__TASKING__) /* TASKING Compiler */
#define __packed __unaligned2 e! W, A4 B& L# A
#endif /* __CC_ARM */
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
int main(void){
+ Z2 Q: i7 B0 K2 L3 x4 |) z3 m+ x/ k
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup: K- f6 E6 ?, a( S
file (startup_stm32fxxx_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to! f2 t% G b) p4 C5 F- f+ D
system_stm32fxxx.c file6 D4 U% V$ m; F9 x$ V2 U
*/ # R' n6 ^( P a
/* Init Host Library */
USBH_Init(&USB_OTG_Core, ( H* U6 D, r$ C, h
USB_OTG_HS_CORE_ID,, H" O4 L% X7 A9 B7 `' H
&USB_Host,6 I/ A4 G4 R, S9 P9 Y" Y
&USBH_MSC_cb,
&USR_cb);( w8 N: a2 S7 j* Z; z7 B' |$ t1 p
while (1){& |' D, U, ~" g0 |0 r
/* Host Task handler */& k$ ?$ c: ?1 N% ?! C
USBH_Process(&USB_OTG_Core, &USB_Host);
if(iapRun==0){
IAP_URN_UserProgrammer();
}8 ?. _/ c- y- ?0 M
}# m" v3 f% w1 N, p0 s
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
case HOST_USR_INPUT:
/*The function should return user response true to move to class state */& [: ~0 H, W: u* ?
//修改:添加MSC-HID自动判别,然后再初始化CALSS-CB+ t: i6 G x& R F$ Y& [% a8 l
if(JB_MSC_HID(phost,0)){ //0:判别MSC,1:判别HID
SetHOST_USB_MODE(0);
phost->class_cb=&USBH_MSC_cb;1 S7 z! C! t6 R& b- L ]
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){
phost->gState = HOST_CLASS_REQUEST; : E/ y6 P" ]8 e; k6 h7 Y3 h m8 f
}
}else{1 O6 w% r: M" k6 v2 E/ W
if(JB_MSC_HID(phost,1)){ //0:判别MSC,1:判别HID4 r/ q# L- @2 l6 q9 c
SetHOST_USB_MODE(1);- ~& P& d, D4 d8 i" e
phost->class_cb=&HID_cb;+ C5 f' j4 e% M' {
//phost->usr_cb=&USR_Callbacks;//???????
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){4 K) S+ h; v( R3 R$ r: M& A" d
phost->gState = HOST_CLASS_REQUEST;
} ; q9 C0 i* P* Y% ]
}
}
break;
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
/* Check for enumeration status */
if ( USBH_HandleEnum(pdev , phost) == USBH_OK){
/* The function shall return USBH_OK when full enumeration is complete */* w' r* ?7 L, Z9 T, \# Y. O% u9 h& [
8 k0 f( p7 A& m
/* user callback for end of device basic enumeration */( W& B/ N. T; [
phost->usr_cb->EnumerationDone();
! v+ m# A9 X! |# @, {
phost->gState = HOST_USR_INPUT; 3 j& m/ z9 C8 W- h2 e. J& V/ C1 }
}, t$ x& J7 z( i, u5 T, [/ k
break;
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
//修改:添加MSC-HID自动判别,然后再初始化CALSS-CB, A8 A. G+ O9 c. K# ~
unsigned char JB_MSC_HID(USBH_HOST *phost,unsigned char flag){//0:判别MSC,1:判别HID
% j0 y9 o9 N1 r
if(flag==0){& B$ Q+ X; n! f+ P1 D8 |8 E$ L5 i
if(phost->device_prop.Itf_Desc[0].bInterfaceClass == MSC_CLASS){1 p* Y z8 x6 y; I- L
if(phost->device_prop.Itf_Desc[0].bInterfaceProtocol == MSC_PROTOCOL) return 1;+ G2 \/ z7 L' r1 |% C
}1 j5 f+ a" a/ X9 t1 h4 e8 V
}else{2 s; u) b+ ?8 Z% q
if(phost->device_prop.Itf_Desc[0].bInterfaceSubClass == HID_BOOT_CODE) return 1;
}9 ~) A& q8 H9 ^, E* N
return 0;
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
/**) p- G$ ~4 R2 w# p
* @brief USBH_CtlReq* {/ g) v3 H) J5 N7 o/ ~
* USBH_CtlReq sends a control request and provide the status after
* completion of the request3 ?2 K5 j( ?3 z4 ~
* @param pdev: Selected device/ x" Q4 v; c8 O$ y9 F" L
* @param req: Setup Request Structure
* @param buff: data buffer address to store the response7 n! _+ b& s9 G! i! f. H
* @param length: length of the response
* @retval Status
*/
USBH_Status USBH_CtlReq (USB_OTG_CORE_HANDLE *pdev,
USBH_HOST *phost,
uint8_t *buff,
uint16_t length)5 Q# F, f$ a5 w* o* |
{9 M, |& W v4 G W$ o7 [, n+ M* l+ ^
USBH_Status status;6 P5 g& Y, a1 r( M' w# s. m
status = USBH_BUSY;
H4 ?1 ~, K1 N$ R9 V
switch (phost->RequestState)
{
case CMD_SEND:3 B$ r: ]; }# f! D5 {/ R6 n
/* Start a SETUP transfer */
USBH_SubmitSetupRequest(phost, buff, length); n; I5 Q! h9 w
phost->RequestState = CMD_WAIT;
status = USBH_BUSY;
break;$ ^: \4 `/ x& {* F) m. y5 c: b
' q: g# U( l5 _! `: x$ Z- X I
case CMD_WAIT:
if(Get_HOST_USB_MODE()==0){ //--2014-3-30 添加2种模式判别!!!
if (status == URB_DONE){8 R! U" ?: }5 |- G- M' B5 X! Q
/* Commands successfully sent and Response Received */
phost->RequestState = CMD_SEND;" w% F* B8 q) S0 c% q8 h9 Z
status = USBH_OK; n+ f8 B0 i& B0 G' [0 I
}
else if (status == URB_ERROR){- F0 B4 g* ~% ]. l* O
/* Failure Mode */
phost->RequestState = CMD_SEND;
status = USBH_FAIL;
} 9 {/ p% X Q$ j+ O: d% U# H
else if (status == URB_STALL){8 I+ ]$ o7 G& Y+ ?
/* Commands successfully sent and Response Received */
phost->RequestState = CMD_SEND;* ]% \% f; f, v$ O
status = USBH_NOT_SUPPORTED;! I2 M8 ?- m9 r$ l2 o8 B" N
}8 \8 x# |2 f/ V$ c
}else{
if (phost->Control.state == CTRL_COMPLETE ){//HID 处理!!% L0 u, \5 q8 w$ c, Q' f
// Commands successfully sent and Response Received
phost->RequestState = CMD_SEND;4 x% H' c7 n X) O0 {- R
phost->Control.state =CTRL_IDLE; + f _0 m. ]* U2 Q, S
status = USBH_OK;
}
else if (phost->Control.state == CTRL_ERROR)
{
// Failure Mode 7 ^+ C; o r- g! C* D* z
phost->RequestState = CMD_SEND;! Z. H& G+ e4 |* w8 C0 j5 |: q2 F
status = USBH_FAIL;* X5 Q$ Q* M3 f( r
} , X( X. G( N/ D" b7 @' A' ~
else if (phost->Control.state == CTRL_STALLED ). h- S5 r" N2 L# X$ a5 G9 O8 ^
{$ E6 j) e6 L& m7 k+ e) Q4 l
// Commands successfully sent and Response Received
phost->RequestState = CMD_SEND;
status = USBH_NOT_SUPPORTED;
}
}0 G8 s3 ]9 w; {. U! q, I
break;
//-------------------------------------
default:7 M, m+ M+ ?+ F, @0 y- u$ |
break; 9 i+ p- m, [- E% R( z
}
return status;( G8 U- U1 `8 n, J7 \- S
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发