在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。 st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。 在st官方usb库中,usb类是这样定义的: / G5 n4 i9 a2 i- q' D, X typedef struct _USBH_Class_cb; l# x) ]% {7 b F {. i& }3 i% G9 \) R$ f) T, r USBH_Status (*Init)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线% E3 r- M7 `% \0 V9 \4 ] void (*DeInit)\% O" h; j2 ?6 ~% y% x (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源 USBH_Status (*Requests)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求 USBH_Status (*Machine)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 # c) \- v; Z3 F0 H* ` } USBH_Class_cb_TypeDef;1 f% U* a) A, Q% c8 J6 p6 N 那么,我们如果要实现一个USB类,就需要编写以上四个函数。) B- Z4 ^. _9 W, C0 D 下面就是我自己写的一个自定义类: V- p2 u2 Q( }; \1 A2 L- n ' B' c! d2 }4 s4 O, A# Y: ? typedef struct3 X* m0 Y% h. X- y/ ? { uint8_t hc_num_in; uint8_t hc_num_out; 2 e" A! w$ }- k9 C1 s) K: h/ I uint8_t MSBulkOutEp; uint8_t MSBulkInEp; uint16_t MSBulkInEpSize; uint16_t MSBulkOutEpSize;6 Z( c9 l, H* }- W }myClassTypedef;8 ~8 f, q* B' t& `9 s9 E myClassTypedef myClass;# E: U9 H& f! L: N; F5 ~, P 9 l- U5 e8 F! b/ E3 C! t6 e) Y USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost) { USBH_HOST *pphost = phost;3 r* w1 i# q5 {2 t2 K5 T short myi;3 }9 X a5 \6 ?/ w! T7 v, D p char Buffer[50]={0}; 6 w7 T$ G. E/ F7 L: X! _3 \ unsigned char status;4 |$ _8 ^9 d. k5 m+ Q+ s: l9 n z C' j sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);+ e; j# K8 ?6 a LHLFont_DebugString(Buffer); }, Y1 Q; w( x" A" g3 U 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);; V, @8 ]5 {% k- Q' x }4 A: E. B7 Y* M: G$ m) J else {' c9 W! d+ z7 o, F7 X! ^ sprintf(Buffer,"接口%d的端点0为输出",myi);& R k C# _5 ? e3 r0 }6 E }- |! U' v4 G/ K+ e1 R! Z/ N! p LHLFont_DebugString(Buffer); sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,, j( L" @% O; D pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);/ `! t- ?8 W9 \/ m/ B LHLFont_DebugString(Buffer); if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)+ z" a% c( p/ d6 C4 v( \7 U { sprintf(Buffer,"接口%d的端点1为输入",myi); }( j- S' m/ O/ O( X else2 C9 b7 d+ R; X3 q {& e! Z2 h, f! Y2 I0 g, b8 P: T sprintf(Buffer,"接口%d的端点1为输出",myi);! O9 u5 t1 E- D0 N/ U0 X } |' n2 t1 P0 m3 Q) U: A1 y LHLFont_DebugString(Buffer);! N7 h( M* u" g7 o6 S: s0 _0 s u 6 W0 m/ j6 p# g, Z! B! [. n* m sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,# N; D' N7 s) h8 o! j! p% ~2 ] pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes); LHLFont_DebugString(Buffer); } myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;+ U3 r7 T$ d% T+ w$ C) O0 A myClass.MSBulkInEp = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;* M5 v' h( k+ P7 }8 j; _ myClass.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;# A3 P! }/ o* R2 z. z myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;% u: S) [ x2 {' p1 W- U3 c2 h& z0 S $ m! J+ H( b# d. |4 `/ p& h myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);# a$ L- W; l6 ` myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); / J1 o3 ?5 s& Z3 \' K) e- L + P; w' O9 _. x2 H( V" K5 d status = USBH_Open_Channel (pdev,! s0 F* m2 Y* ^- q) Q, X myClass.hc_num_out,0 E/ a y) q; N0 [% T' Q! a pphost->device_prop.address,! s$ E3 _8 G+ T0 a( Z; M# N% [! c pphost->device_prop.speed, EP_TYPE_BULK,5 U1 s4 O2 J. O. L3 q- B" a! K7 j myClass.MSBulkOutEpSize); if(status == HC_OK)+ O! V! d6 E8 q a% l status = USBH_Open_Channel (pdev,8 ]/ J' u8 N+ w: o myClass.hc_num_in, pphost->device_prop.address, pphost->device_prop.speed, EP_TYPE_BULK,, _ J& c1 f# E7 G8 F, J9 @ myClass.MSBulkInEpSize);4 h1 f( M$ a( q if(status == HC_OK)1 ~( U8 L/ r7 D0 |' w! D. C5 W LHLFont_DebugString("USBH Open Channel Ok"); Receive_Retry = 2;0 n& `1 [& ] S# m6 N/ E # A. [2 C0 w- p& H return USBH_OK; 1 g$ X3 f8 @! m# u9 i2 e+ h }/ a, r8 J8 z' n( ]8 v void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost) { if ( MSC_Machine.hc_num_out) {& s+ g- f, |+ u; H+ x USB_OTG_HC_Halt(pdev, myClass.hc_num_out); USBH_Free_Channel (pdev, myClass.hc_num_out); myClass.hc_num_out = 0; /* Reset the Channel as Free */ }9 a' g7 p1 y- p! O ) l$ s( y' t8 { if ( MSC_Machine.hc_num_in) { USB_OTG_HC_Halt(pdev, myClass.hc_num_in);! a* l4 E' b& P8 ] USBH_Free_Channel (pdev, myClass.hc_num_in); myClass.hc_num_in = 0; /* Reset the Channel as Free */5 ?6 l* w. Q) W2 r, I0 i) | } } USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost) { return USBH_OK;( `( }. V8 e9 b } unsigned char usbbuffer[70];( r* C9 n7 O4 X! {- W0 W9 m unsigned short usbbufferlen=0;- j4 e& H$ N' G, V unsigned char SendMechine = 2;" c! }- b [+ k5 n! F2 ` int SendCount = 0; 7 V9 A4 v9 D$ Z( _) L unsigned char ReceiveMechine = 0; int ReceiveCount = 0;" ^$ D( [+ C: q. i- p unsigned dataReceived = 0; / B% n# Q e' U* m5 K( T void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len) { unsigned char *ptmp=usbbuffer; H4 p# N% M1 q3 ~5 P# m ! T; P+ N9 c. P4 l" [ usbbufferlen = len; # O/ |* }( h! v1 s while(len--) { *ptmp++ = *pbuffer++; } } N+ A( ]$ o4 W' { USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost) { if(SendMechine==1)& M/ ]2 J6 Q. \* ` {6 r% `4 m8 @* ?. c7 X% r' y SendMechine=0;& m8 z, x! Z. K4 M USBH_BulkSendData (pdev,0 T* `& A6 L0 c8 I- ]/ ? (unsigned char *)usbbuffer, 4 l; p. e- J0 c8 {" b! D usbbufferlen , ; U! v2 O, `4 d2 Y8 N5 G$ d myClass.hc_num_out);9 D4 Z, {: D% A( V SendCount=0; while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0) { Receive_Retry--; ReceiveCount=0;4 d; j+ u0 u3 D9 T2 c% Y; K USBH_BulkReceiveData (pdev,) B+ I+ T- I( A4 g5 o (unsigned char *)usbbuffer+3, 64, myClass.hc_num_in); ; ~9 s" S- z* U8 [3 c 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自定义类开发