在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。; m; U' ^9 E( U8 p2 P st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。- p( _3 |% c8 L3 s3 i0 f _( t) W 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。" P' Z0 y- f- n' k- q6 x 在st官方usb库中,usb类是这样定义的:/ }. o. X+ k- y : P7 H# Q7 j- t0 L4 C typedef struct _USBH_Class_cb' p; s0 \5 T a! D1 A {* c7 v8 j, m9 P* O+ E USBH_Status (*Init)\0 Y2 H- o' |* H$ D, u (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线3 Z6 u. C3 d7 v2 L/ T- _) d void (*DeInit)\9 \, l9 b" C, E (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源 USBH_Status (*Requests)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求$ [( n" E ^, z USBH_Status (*Machine)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 # k& [3 T [0 n& A% Q } USBH_Class_cb_TypeDef; 那么,我们如果要实现一个USB类,就需要编写以上四个函数。 下面就是我自己写的一个自定义类: _; ^$ T: X b- w. f/ ] typedef struct {" Z, F# h) r1 {/ B/ Y uint8_t hc_num_in; ' i) {5 V3 y8 u; V( W uint8_t hc_num_out; uint8_t MSBulkOutEp;, b/ D) i) ?- H0 t# q uint8_t MSBulkInEp;* N8 r4 B7 Q7 [+ h6 F" { uint16_t MSBulkInEpSize;" C# p: Z9 D8 _ uint16_t MSBulkOutEpSize; }myClassTypedef;0 x6 r0 h9 K0 m4 M' S myClassTypedef myClass;; C1 ?- L% h& B4 f f) E USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost) { USBH_HOST *pphost = phost; short myi; char Buffer[50]={0}; unsigned char status;( S$ T4 O6 U% p5 C/ `, [7 i& i 4 h, x- G: h! X( @: { sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);+ q9 L& K* Z$ [* J( u e LHLFont_DebugString(Buffer);2 N! E" H; @% `* T! z9 _6 q h4 @9 |* i- T3 v% i1 M4 a# E for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++) { if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80) { sprintf(Buffer,"接口%d的端点0为输入",myi); D4 y- g7 Z, k. J9 I }% z+ [: Q& m+ p9 H# ]# a else, z' K T; J' i! \/ w { sprintf(Buffer,"接口%d的端点0为输出",myi); } LHLFont_DebugString(Buffer); 5 {7 m) \% Y+ W( Z/ }: m sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,2 S x8 h* E) y5 p C" z9 E7 s" `& n! ` pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes); LHLFont_DebugString(Buffer); A8 z9 p6 _2 b& ]$ ~, O 7 l3 D1 r- A. O/ A if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)* @1 J3 E! t5 m1 R { sprintf(Buffer,"接口%d的端点1为输入",myi); }$ s) R1 |# K, F* M+ W else2 a1 G4 x" b/ _0 C {' P3 {& z2 L. E& E1 O* r9 B; X- M sprintf(Buffer,"接口%d的端点1为输出",myi); } LHLFont_DebugString(Buffer); sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,' I. `6 H% B7 W+ H i pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);8 f, x" K0 s0 ^2 m( _* ^ LHLFont_DebugString(Buffer); " V1 h& }" J* _, W8 ?% a8 T } , \8 g& r; Q( o; s$ r) q+ C myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress; myClass.MSBulkInEp = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;( P3 F0 ?' c8 ]9 ~ myClass.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;/ q/ I& B2 M) p8 L" v4 Q5 Q myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize; myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);5 ]: v6 w9 |2 O0 x) |1 \ myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); , i& z/ A8 _% U1 V: _ S/ Y status = USBH_Open_Channel (pdev,/ }) i1 J m: C6 \+ S! _ myClass.hc_num_out,5 M+ g0 Q1 C1 @; m* n; K' g pphost->device_prop.address, pphost->device_prop.speed, EP_TYPE_BULK,3 R% B8 k; \ [; Y/ ] myClass.MSBulkOutEpSize); # p3 W' E& r- ~/ J if(status == HC_OK)$ ]' n' \$ e2 w+ F ^ status = USBH_Open_Channel (pdev," J. f+ I$ G. S5 K myClass.hc_num_in, V3 f4 d3 O' Z- H* U1 `2 l) q7 P pphost->device_prop.address, pphost->device_prop.speed, EP_TYPE_BULK,/ ]+ U& ], P, x- \! u& D: E, T myClass.MSBulkInEpSize);- b k8 ` J) p1 a# x1 j if(status == HC_OK)4 m q. q M' `# R7 N" O( W LHLFont_DebugString("USBH Open Channel Ok");7 U2 q/ z2 ?& {- D# `1 e Receive_Retry = 2;) Z+ N0 O0 s' g return USBH_OK; } O7 |( h) M5 H5 Q3 E void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost). z. M* b0 E* c8 i3 h. b( V5 D0 s {4 R n+ u/ E; N6 x) n, [* o if ( MSC_Machine.hc_num_out)/ z; \$ }6 U' \ v \ { USB_OTG_HC_Halt(pdev, myClass.hc_num_out);0 f: L! u* r* Z USBH_Free_Channel (pdev, myClass.hc_num_out);" W/ d2 d4 H0 H myClass.hc_num_out = 0; /* Reset the Channel as Free */ } if ( MSC_Machine.hc_num_in)* n( U5 U# B, U4 L3 K3 T0 h { USB_OTG_HC_Halt(pdev, myClass.hc_num_in); USBH_Free_Channel (pdev, myClass.hc_num_in);8 P* S) r# G2 ~, {# L' M myClass.hc_num_in = 0; /* Reset the Channel as Free */ } & g8 t7 d- ^* B! y$ u( G } USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)' ]# \/ ]6 F' N/ G( { {- M4 T$ O5 P& Y8 m$ a return USBH_OK; }& F5 B% b5 q) ?8 ~" ] unsigned char usbbuffer[70];2 K5 x% _, ^% a9 l. h. G1 s, C/ J unsigned short usbbufferlen=0;8 G6 x" a* _6 F2 b unsigned char SendMechine = 2;) V- `3 {% `7 H int SendCount = 0;" F- g% f& n0 ?( l: p' N1 k unsigned char ReceiveMechine = 0;8 _; q1 T, [! M! i4 d- B' f7 U int ReceiveCount = 0; unsigned dataReceived = 0; void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)0 ]4 X, l$ r4 F6 P5 x$ W {. S, ^# K+ ?+ Z" {: k unsigned char *ptmp=usbbuffer; usbbufferlen = len; while(len--) { *ptmp++ = *pbuffer++; }, D( W* h4 g: N# L$ L3 Q }* O3 A" s4 b9 L1 O- k& T8 i USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)- N/ u5 m, U0 r) E: @3 k+ j) f { if(SendMechine==1) { A( m c9 o( P8 o+ N SendMechine=0;1 a$ y# |8 @( Y, C* v( z USBH_BulkSendData (pdev,* b `( z4 J9 x d (unsigned char *)usbbuffer, , }% y. |! Z% c' ] usbbufferlen , myClass.hc_num_out);5 S/ V6 s |. z) v4 T/ e$ o* O! z SendCount=0;$ Z |1 @' S z8 N$ C- I while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)3 j6 g5 I0 l& j' N { Receive_Retry--;: K* `- Q$ X. d. W7 [ ReceiveCount=0;/ S8 P) m9 K5 O# B- A* v, O' x- c USBH_BulkReceiveData (pdev, (unsigned char *)usbbuffer+3, 64, 4 { i& v+ X$ g& g3 D4 G( I+ z; S# |9 o myClass.hc_num_in); X; ]4 ~7 E' v( N' a9 I . @. N- Y$ X" e, h! w; x- N while(HCD_GetURB_State(pdev, myClass.hc_num_in) != URB_DONE &&ReceiveCount |
èªå®ä¹usbç±».zip
下载2.03 KB, 下载次数: 1199
请问下 您的3G模块驱动弄好了吗 能发一份给我参考下吗?我邮箱是bwsz.1@163.com
您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程序给我,谢谢。
RE:【MCU实战经验】+stm32f407之usbhost自定义类开发
RE:【MCU实战经验】+stm32f407之usbhost自定义类开发
回复:【MCU实战经验】+stm32f407之usbhost自定义类开发
RE:【MCU实战经验】+stm32f407之usbhost自定义类开发
RE:【MCU实战经验】+stm32f407之usbhost自定义类开发
RE:【MCU实战经验】+stm32f407之usbhost自定义类开发
回复:【MCU实战经验】+stm32f407之usbhost自定义类开发
RE:【MCU实战经验】+stm32f407之usbhost自定义类开发
RE:【MCU实战经验】+stm32f407之usbhost自定义类开发
回复:【MCU实战经验】+stm32f407之usbhost自定义类开发
回复:【MCU实战经验】+stm32f407之usbhost自定义类开发
回复:【MCU实战经验】+stm32f407之usbhost自定义类开发
回复:【MCU实战经验】+stm32f407之usbhost自定义类开发
回复:【MCU实战经验】+stm32f407之usbhost自定义类开发