|
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。$ b5 |) ?7 G4 Y% n" @' g st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。 在st官方usb库中,usb类是这样定义的:9 _/ x3 E; H2 S- [ typedef struct _USBH_Class_cb {( h. i4 X- u5 ]. L0 D USBH_Status (*Init)\: _6 f$ r4 ?. {4 q, o (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线/ S4 ]# T8 `- W; \ void (*DeInit)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源 USBH_Status (*Requests)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求+ U, M6 X/ M* g j USBH_Status (*Machine)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 : f4 {9 V, Y% h' q/ b* J ' h3 _4 i+ H/ ] } USBH_Class_cb_TypeDef; 那么,我们如果要实现一个USB类,就需要编写以上四个函数。 下面就是我自己写的一个自定义类:9 o$ o z6 N8 Y! K8 \1 j: U( j, w( O ( y, _: Z# ?$ d0 A typedef struct { uint8_t hc_num_in; uint8_t hc_num_out; uint8_t MSBulkOutEp; uint8_t MSBulkInEp;( F1 b5 c7 w7 o# l$ ]6 b; J$ S uint16_t MSBulkInEpSize;( T& x0 B% d4 \. T+ g/ e uint16_t MSBulkOutEpSize;: i' v7 @% O1 S: u/ k( S) s- C, I0 T }myClassTypedef;) _8 }. z: {& j myClassTypedef myClass; # t# y; R# X! ~/ K! g- K3 O2 V( k USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost) { USBH_HOST *pphost = phost;4 `$ S, n/ z. X$ N' m A# b7 R short myi; char Buffer[50]={0}; . G! F( D' W. A K1 w: a2 J4 i unsigned char status;/ D$ [6 L8 A/ J6 v + b! V+ G b! p! p$ m sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);8 B4 y3 E3 A7 {2 c LHLFont_DebugString(Buffer); 4 _( g2 D: K4 ?! g 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); } else { sprintf(Buffer,"接口%d的端点0为输出",myi);' ]$ ~( ?* o! B& V3 q6 X. H& [ }3 @. L) V; {% H: D LHLFont_DebugString(Buffer); sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,, I. z4 k7 a$ C' L pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes); LHLFont_DebugString(Buffer); 1 Y: T7 j$ L' ~; S4 }9 `! l if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)" a) e+ h7 O) ` {" C) @5 q7 @6 K6 i' z sprintf(Buffer,"接口%d的端点1为输入",myi); } else {: R8 M; g7 P4 B' A- I+ D) L+ S sprintf(Buffer,"接口%d的端点1为输出",myi); } LHLFont_DebugString(Buffer);7 v- m' I. S9 D sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize, pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);9 o5 F) L4 i+ H: d6 _8 h5 { LHLFont_DebugString(Buffer); }1 S! r' h7 X& s( J- ? myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress; myClass.MSBulkInEp = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;) v& E2 S2 `; c4 A myClass.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;# [% {- T6 E4 t# N myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize; 7 M) Q' X* }3 ^ U( a: O5 S myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);4 O; O- Y* O$ c' u1 F myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); # l9 G5 d' k0 K1 F7 |5 f 4 Y! o. W: ~+ U' }4 Z( X status = USBH_Open_Channel (pdev, p) o& C; s3 b myClass.hc_num_out, pphost->device_prop.address,/ Q3 C/ Z9 {7 ^/ {% Z pphost->device_prop.speed,5 X9 W- l: ?* H EP_TYPE_BULK, myClass.MSBulkOutEpSize); 2 h1 P! N9 G- Y) O if(status == HC_OK) status = USBH_Open_Channel (pdev, myClass.hc_num_in,. f; {( |2 x s" G$ [. D+ r! l( x0 T1 @ pphost->device_prop.address, pphost->device_prop.speed, EP_TYPE_BULK, myClass.MSBulkInEpSize); if(status == HC_OK) LHLFont_DebugString("USBH Open Channel Ok");: g6 o2 d: C6 @! G' Y0 z! r; U / [; p% V7 {1 K Receive_Retry = 2; 0 c2 X0 t) P6 n0 F return USBH_OK; } void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost). x$ p! p6 h0 A2 l6 ? { if ( MSC_Machine.hc_num_out)8 j, i6 s+ a% ~5 t0 o2 u5 S0 v1 X {/ W6 p$ i' t; r( _ `0 n& ^! y- a2 X USB_OTG_HC_Halt(pdev, myClass.hc_num_out); USBH_Free_Channel (pdev, myClass.hc_num_out);4 J! d3 Z1 o2 e4 _ [ myClass.hc_num_out = 0; /* Reset the Channel as Free */ } if ( MSC_Machine.hc_num_in)* l1 g* @) s# M2 \5 | R* B {0 t% O. d+ A2 d2 ^ USB_OTG_HC_Halt(pdev, myClass.hc_num_in);: Y1 E/ w l' ^- h N$ X USBH_Free_Channel (pdev, myClass.hc_num_in); myClass.hc_num_in = 0; /* Reset the Channel as Free */, [/ _ l9 v3 ^( i8 l } % z5 D2 I6 y) m y9 L! l6 | } USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost): ^, ]% {, D: {" K* X$ v# L {' h; F1 i8 i. C7 r return USBH_OK;0 }' b T s/ {6 | } unsigned char usbbuffer[70]; unsigned short usbbufferlen=0; ! c& W+ i: {3 w. c: ]4 r2 f unsigned char SendMechine = 2; int SendCount = 0; 4 F1 X9 H4 [, }" a$ m+ }* [1 t unsigned char ReceiveMechine = 0;& M: U5 s0 o7 M% N" ^ int ReceiveCount = 0; unsigned dataReceived = 0; void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len) { unsigned char *ptmp=usbbuffer; & \" ?- s( N: V usbbufferlen = len; while(len--)3 r Z' O `+ Z. }' C { *ptmp++ = *pbuffer++;+ }+ }+ w( k0 X } } USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost): P8 J6 q9 G# _: V {$ [, }7 v# l# F; ]# d: }% J: U8 J if(SendMechine==1)4 Y- P2 V- Y/ d! {+ u {5 h! u3 e! P' T7 q: b2 @ SendMechine=0; USBH_BulkSendData (pdev,* F* b: Q7 m0 b" \+ d# P5 I (unsigned char *)usbbuffer, 8 m0 E. T: ?2 j# X/ l usbbufferlen , 3 {* H/ T3 T# U* H0 I' D" p myClass.hc_num_out); SendCount=0; while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)+ \) n J3 l1 |# P {! }2 u4 P3 {8 N( A' H# l Receive_Retry--; ReceiveCount=0;; N7 w; ^& t1 Y4 N USBH_BulkReceiveData (pdev,9 F+ [1 e1 i8 p2 v) O (unsigned char *)usbbuffer+3, ; q- @7 V3 E" |/ H; @! F 64, myClass.hc_num_in); : H: m- F& ]) R1 {2 b2 |3 r4 g& Z$ j$ l while(HCD_GetURB_State(pdev, myClass.hc_num_in) != URB_DONE &&ReceiveCount |
èªå®ä¹usbç±».zip
下载2.03 KB, 下载次数: 1209
微信公众号
手机版
请问下 您的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自定义类开发