圈圈发布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的合并开发
继续发图:8 {: N. s" B1 q
电路很简单,占用F207的HS-usb:
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
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;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);
5 i4 S8 T( L: }
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |
GPIO_Pin_13 |, g/ v( |' r2 c% H. H* G
GPIO_Pin_14 |
GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
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) ;
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) ;
//---------------------------------------------------------------
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) ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
! 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();
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
#define USE_USB_OTG_HS
#endif /* USE_USB_OTG_HS */. t" c) g$ r: d
#ifndef USE_ULPI_PHY
//#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
#endif
/*******************************************************************************. [! W2 d7 K/ N! O4 Y# P' X
* FIFO Size Configuration in Host mode% d+ V" O2 @1 }' f) c. q
*
* (i) Receive data FIFO size = (Largest Packet Size / 4) + 1 or
* 2x (Largest Packet Size / 4) + 1, If a 4 e+ ]. g4 X7 ^* f5 j
* high-bandwidth channel or multiple isochronous
* channels are enabled
*
* (ii) For the host nonperiodic Transmit FIFO is the largest maximum packet size
* 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
* the largest maximum packet size for all supported periodic OUT channels.
* 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
/****************** USB OTG HS CONFIGURATION **********************************/
#ifdef USB_OTG_HS_CORE- L4 L; w' U4 _, r6 `/ ~$ w) O
#define RX_FIFO_HS_SIZE 512
#define TXH_NP_HS_FIFOSIZ 256$ W8 ^1 ^2 @ G4 k, P# C* p* k
#define TXH_P_HS_FIFOSIZ 256
// #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
#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
#endif
#define USB_OTG_HS_INTERNAL_DMA_ENABLED+ P4 u. X6 I* J7 }
#define USB_OTG_EXTERNAL_VBUS_ENABLED
//#define USB_OTG_INTERNAL_VBUS_ENABLED6 P" {& N) [) X# }
#endif* Q1 h0 s) | q+ U! a5 Y
/****************** USB OTG FS CONFIGURATION **********************************/
#ifdef USB_OTG_FS_CORE1 b7 | R' @* k8 \" R
#define RX_FIFO_FS_SIZE 128
#define TXH_NP_FS_FIFOSIZ 96
#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
#endif9 J5 _* I9 d. B1 O- r
/****************** USB OTG MODE CONFIGURATION ********************************/
#define USE_HOST_MODE+ O3 M3 _* e0 G
//#define USE_DEVICE_MODE
//#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
#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
#ifndef USE_DEVICE_MODE
#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
#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
#else //USE_USB_OTG_HS p3 S# m$ r4 b. |/ m, E
#ifndef USE_ULPI_PHY
#ifndef USE_EMBEDDED_PHY
#error "USE_ULPI_PHY or USE_EMBEDDED_PHY should be defined". E `9 _, a5 S$ K& R- w) k
#endif
#endif
#endif8 E9 w" D4 g2 N( q0 K7 X
/****************** C Compilers dependant keywords ****************************/
/* 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 */
#define __ALIGN_END __attribute__ ((aligned (4)))8 {. W; L% _" r
#define __ALIGN_BEGIN
#else 6 o; W. o. [( s2 g4 ?" _ M
#define __ALIGN_END
#if defined (__CC_ARM) /* ARM Compiler */ K3 B8 V; T& c/ K
#define __ALIGN_BEGIN __align(4)
#elif defined (__ICCARM__) /* IAR Compiler */
#define __ALIGN_BEGIN 8 N" }# m4 ]/ ~4 g' @( Z1 j8 y
#elif defined (__TASKING__) /* TASKING Compiler */
#define __ALIGN_BEGIN __align(4)
#endif /* __CC_ARM */ 8 K* q0 D0 G+ ~& L' w: P1 J! L- r
#endif /* __GNUC__ */
#else
#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 */
#if defined (__CC_ARM) /* ARM Compiler */$ p" V' \( _6 b8 I+ c( o
#define __packed __packed
#elif defined (__ICCARM__) /* IAR Compiler */
#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 */
#define __packed __unaligned
#endif /* __CC_ARM */
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
int main(void){: P. v6 l# Y8 P
/*!< 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
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
system_stm32fxxx.c file& G; H, c4 |0 K* f, d
*/
+ @% s8 y% D) P7 H8 T; K
/* Init Host Library */
USBH_Init(&USB_OTG_Core,
USB_OTG_HS_CORE_ID,
&USB_Host,
&USBH_MSC_cb,
&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 */
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();
}
}
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
case HOST_USR_INPUT:
/*The function should return user response true to move to class state */8 ], H1 b' J# a+ r
//修改:添加MSC-HID自动判别,然后再初始化CALSS-CB
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;
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){
phost->gState = HOST_CLASS_REQUEST; 1 s+ O# z+ x' [% C
}
}else{# x9 \- J5 t. B8 @
if(JB_MSC_HID(phost,1)){ //0:判别MSC,1:判别HID/ @9 Q, k+ e4 i
SetHOST_USB_MODE(1);
phost->class_cb=&HID_cb;
//phost->usr_cb=&USR_Callbacks;//???????
if((phost->class_cb->Init(pdev, phost)) == USBH_OK){: n y+ g2 \$ p8 |8 Z" C$ Q6 ~2 P
phost->gState = HOST_CLASS_REQUEST;
} * E7 q' @$ k- c' @% V7 u
}) i( ~. B+ k1 X! y8 d/ M% k
} 2 ` M- g; F, j, Y* o+ \& ~/ w
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 */
/* user callback for end of device basic enumeration */
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;
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
//修改:添加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 ]
if(flag==0){
if(phost->device_prop.Itf_Desc[0].bInterfaceClass == MSC_CLASS){
if(phost->device_prop.Itf_Desc[0].bInterfaceProtocol == MSC_PROTOCOL) return 1;
}
}else{ U9 i/ S5 {6 Z8 _+ G4 l! x) b
if(phost->device_prop.Itf_Desc[0].bInterfaceSubClass == HID_BOOT_CODE) return 1;
}
return 0;. q( I" I3 }0 m
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
/**2 e8 n1 u% c$ O0 M
* @brief USBH_CtlReq
* 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
* @param req: Setup Request Structure
* @param buff: data buffer address to store the response
* @param length: length of the response
* @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,
USBH_HOST *phost,
uint8_t *buff,$ n9 q) L8 z( t5 c) R' L% O6 v
uint16_t length)# e! Q' @; a/ P
{
USBH_Status status;
status = USBH_BUSY;
# x6 n& w0 G: V
switch (phost->RequestState)
{
case CMD_SEND:
/* Start a SETUP transfer */, Z7 Q) N. ~3 u1 B
USBH_SubmitSetupRequest(phost, buff, length);
phost->RequestState = CMD_WAIT;. P& {$ A. \4 v- t9 Y" n# u
status = USBH_BUSY;
break;
, t( p' i: P$ i! Q) \, b5 S9 ?! c
case CMD_WAIT:
if(Get_HOST_USB_MODE()==0){ //--2014-3-30 添加2种模式判别!!!
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
}
else if (status == URB_ERROR){
/* Failure Mode */
phost->RequestState = CMD_SEND;$ j' }- U( n: n( Y# V8 y
status = USBH_FAIL;
}
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;
status = USBH_NOT_SUPPORTED;4 @9 u( [6 r9 {: y
}
}else{
if (phost->Control.state == CTRL_COMPLETE ){//HID 处理!!. R3 b& P/ ~' s7 I. z
// Commands successfully sent and Response Received
phost->RequestState = CMD_SEND;
phost->Control.state =CTRL_IDLE;
status = USBH_OK;
}
else if (phost->Control.state == CTRL_ERROR)' ?9 n* O! ^, X; L. m0 @) R6 o
{
// 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
}
else if (phost->Control.state == CTRL_STALLED )
{5 H( h, c/ K" ]' F% z
// Commands successfully sent and Response Received
phost->RequestState = CMD_SEND;4 _* i3 y y7 @) f
status = USBH_NOT_SUPPORTED;
}
}$ ]" 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;
}0 |! B, A% ]5 j
return status;; d( M% x; o& x( [$ l4 ?. s
}
RE:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发
回复:【MCU实战经验】STM32F207的host USB的MSC和HID的合并开发