在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。6 L6 g/ S% I% r6 q. P' `: N+ Y st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。' @9 s$ l* Z* Z/ d, Q4 y3 W1 a 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。 在st官方usb库中,usb类是这样定义的: : ]: P. G: h3 w# K$ N. T! [ typedef struct _USBH_Class_cb {: z8 w6 s4 T: v* p4 o3 K, B USBH_Status (*Init)\# n' }1 ?" X0 e* r+ t6 F (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线5 ?0 u: Y. B9 [) M2 u, x, Q3 c# g void (*DeInit)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源$ N$ l, ~+ U& O USBH_Status (*Requests)\5 a, E$ c4 a2 x (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求 USBH_Status (*Machine)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 0 l% R# L! H" s7 B } USBH_Class_cb_TypeDef; 那么,我们如果要实现一个USB类,就需要编写以上四个函数。, j8 t; S5 |) {+ l- R* Y 下面就是我自己写的一个自定义类:4 f0 C* J. ~$ t) O* j$ O2 H$ E L C% u! U% _! y6 t1 L) U% {1 o* L typedef struct% H, G. S( g( N0 s6 s { uint8_t hc_num_in; / s5 k3 j" ~7 t. n2 y uint8_t hc_num_out; / }: d2 k: @5 k N- a: x( C uint8_t MSBulkOutEp; uint8_t MSBulkInEp; uint16_t MSBulkInEpSize; uint16_t MSBulkOutEpSize;* b& B$ e+ P L* ~+ b }myClassTypedef; myClassTypedef myClass; USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost) {0 ^2 Y" k/ Q0 J+ |/ U USBH_HOST *pphost = phost;3 I4 _% K4 q' V. W; } short myi; @( t* F- Z8 c$ @+ x) Q char Buffer[50]={0};5 U' W) H* b, i3 f% _2 J2 z8 w unsigned char status; sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces); LHLFont_DebugString(Buffer); & N+ v* _8 l" L! m5 @ for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++) {) Q" I* {& F6 \3 n2 X% c if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80): ]3 I) O/ ]/ B; g9 }; a. ~% V {- g1 T( x0 b; J, h! h% O sprintf(Buffer,"接口%d的端点0为输入",myi);0 ]+ z" i" A1 G; O) a* J k }/ B6 ?! d8 w' J& ~# }* J, g+ w/ o else8 U0 L( m; |. n8 K, w, I { sprintf(Buffer,"接口%d的端点0为输出",myi); }' v: a" o0 ~) P! f/ B LHLFont_DebugString(Buffer); sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize, pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes); u- n9 o( \3 C9 K$ f9 n LHLFont_DebugString(Buffer); # ]; ]* P' O: a5 [! e- V& L1 D- Z if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80) {& {! w+ z! S1 q* X! U sprintf(Buffer,"接口%d的端点1为输入",myi);0 u$ }& V! Y6 Y" ^' i }$ x8 |3 @0 M* \- ~ else6 b+ d4 k5 C# X { sprintf(Buffer,"接口%d的端点1为输出",myi);, C/ m5 W( w; d } LHLFont_DebugString(Buffer); $ s0 c4 m) E8 D7 E9 ? sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,; G* J5 H. T# j2 F7 U pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes); \4 \% H& t( U# e" x LHLFont_DebugString(Buffer); }. z" O5 @8 i9 Z' w3 M8 L myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;- a1 h0 I4 W! m myClass.MSBulkInEp = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;& G8 m* W- J2 F2 v0 Z6 z: p7 y myClass.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize; myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;9 [$ t- b/ w& y : E7 O1 L9 K" a0 D, G6 M, c: } myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp); myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); status = USBH_Open_Channel (pdev,5 Y6 ~1 J; s0 W% h0 T0 N; f myClass.hc_num_out," ?* ^7 u5 R" Q) b pphost->device_prop.address,& [& T9 l; ]6 Q9 V) X' Q" D, ~ pphost->device_prop.speed, EP_TYPE_BULK,: D1 Y- i5 B+ C. u; z$ O! G0 Y myClass.MSBulkOutEpSize); 6 f2 ~! X: v- q7 I8 v$ S if(status == HC_OK). K) N" s7 c6 x# d, J: P status = USBH_Open_Channel (pdev,1 b; L9 }7 T1 ~ f' [) i* v% P myClass.hc_num_in,3 z I% k% C/ J1 D& c2 c3 A pphost->device_prop.address,# d8 N- H' o+ D9 \ pphost->device_prop.speed, w8 o$ W7 i- w) A% p' b EP_TYPE_BULK, myClass.MSBulkInEpSize);& K/ y& H. y* x* a! G if(status == HC_OK) LHLFont_DebugString("USBH Open Channel Ok");: a3 |0 P; q/ D, A( r, X* Y1 k. \& [ Receive_Retry = 2;! D+ L+ t5 m$ e3 ^$ q& y% P 5 i+ a1 I/ E7 z5 S7 @; m return USBH_OK; }' ]0 x' D1 m5 X% R- g9 ~: [- y ^& D0 d! v. R9 {+ F) z2 o void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost) {9 B2 s8 P, Q* r+ h% d2 j if ( MSC_Machine.hc_num_out), u4 v {; L, r {( Q+ J4 T) n% A$ `5 Z! k USB_OTG_HC_Halt(pdev, myClass.hc_num_out); USBH_Free_Channel (pdev, myClass.hc_num_out);8 B/ P7 z6 I. t" y( d, e2 k+ X myClass.hc_num_out = 0; /* Reset the Channel as Free */ }3 H, \9 m- y- ]! c$ I 8 X J: u& v7 N* \# G if ( MSC_Machine.hc_num_in) { USB_OTG_HC_Halt(pdev, myClass.hc_num_in); USBH_Free_Channel (pdev, myClass.hc_num_in); myClass.hc_num_in = 0; /* Reset the Channel as Free */3 y# b) ~1 c2 ~3 [ } 6 F, i8 n# D1 |7 {8 K U1 E }3 L% j4 s) K& g0 g- S4 T( e USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost) {0 r! f9 e0 L( T; y return USBH_OK; } unsigned char usbbuffer[70]; unsigned short usbbufferlen=0; & i2 D) t) a6 r/ m8 L* b! Q unsigned char SendMechine = 2; int SendCount = 0; % U' c8 I+ L) F6 w" K unsigned char ReceiveMechine = 0; ~: ]' _; J# b$ z. v; f int ReceiveCount = 0;: n$ b$ h* z1 ^0 G0 J' f5 i unsigned dataReceived = 0; void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)$ J) F! g3 `/ i {. {* L2 \$ A2 O2 I( R1 k unsigned char *ptmp=usbbuffer; / b/ V1 u+ ~' G" J5 E2 L usbbufferlen = len;5 l( X) m: s0 l% f while(len--) { *ptmp++ = *pbuffer++;3 F5 N" i1 j4 b; L" z8 Y; t6 F& e* @, S } } USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost) { if(SendMechine==1), [( f9 N2 D+ Q$ k% s0 D { SendMechine=0; USBH_BulkSendData (pdev,. h% f6 q5 N$ V0 Z (unsigned char *)usbbuffer, usbbufferlen , : F/ t" u8 J* X: o7 ^/ ]$ |% N myClass.hc_num_out);1 u8 n9 Y& d* a; r7 p SendCount=0;/ R, d7 I& B$ W# T! C. o! h; U while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0) {+ ?# H' C7 P2 G( ]6 F Receive_Retry--;0 C/ W( ~+ z( M ReceiveCount=0; USBH_BulkReceiveData (pdev, R# u: n* s5 F. t0 ~- ^4 o (unsigned char *)usbbuffer+3, 64, myClass.hc_num_in);6 G0 q1 J9 y; q+ O9 m 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自定义类开发