在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。 st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。3 \9 Q) ~3 V6 P. M( l: e 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。& y9 k% L! ~/ F" U+ x" F 在st官方usb库中,usb类是这样定义的:* V8 }7 Y7 O6 H: c( U1 h, ] ' m) l# ?' I. |' @& ?& M# o8 Z typedef struct _USBH_Class_cb% n* p2 Z* l+ ?; A% E9 P {1 e: x0 m4 |. Q, `3 c USBH_Status (*Init)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线: \" m! U% P1 i/ |8 T w9 v void (*DeInit)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源# C: @% I8 Q/ ^; |" d ^/ F' v USBH_Status (*Requests)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求( J1 _% X$ ^8 J, o# o6 [% I! G3 N USBH_Status (*Machine)\8 |" d+ k6 q) I- m1 F2 w3 o( @ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 . Y& ^5 r$ P4 b4 M" ], k3 U7 t) K$ X } USBH_Class_cb_TypeDef;, h) ?2 C( d9 l% f7 e 那么,我们如果要实现一个USB类,就需要编写以上四个函数。" [$ ~" V$ v# { w6 j& U: h) t' I 下面就是我自己写的一个自定义类:$ [4 q0 A$ b# U typedef struct! k/ b/ u# j+ g C/ a { uint8_t hc_num_in; 3 ? D! y# X, S" G, A, Y uint8_t hc_num_out; ! @) E. P1 @1 g uint8_t MSBulkOutEp; uint8_t MSBulkInEp;: h! a7 }/ t3 l/ }- Y5 i uint16_t MSBulkInEpSize; uint16_t MSBulkOutEpSize;( a! X9 ^2 R; X$ H$ y$ o, s6 Q }myClassTypedef;2 H. g; |+ i- T8 O% l7 }& ] myClassTypedef myClass; + s6 ] C& g) |- R1 k5 _' r USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)% ~/ m7 `" |9 F5 X% M" Y { USBH_HOST *pphost = phost; short myi; char Buffer[50]={0};3 W* P% B0 l2 U, c' S : b7 t8 {4 G0 t4 _0 j1 E' v: K+ @ unsigned char status; sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces); LHLFont_DebugString(Buffer);4 ]; j( L1 j O. F- | 1 B p2 k# b, _, W for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)" A; r/ @4 x' i, W {8 ?% U& g( U/ p- b: | if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80) { sprintf(Buffer,"接口%d的端点0为输入",myi); } else, p1 Q9 Y/ M4 q, l { sprintf(Buffer,"接口%d的端点0为输出",myi);" b0 l' c H T2 m } LHLFont_DebugString(Buffer);, q/ H) q+ Q2 t9 n4 q O5 w K " F, H4 H1 J [, [ sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,+ _) T; [9 f& @: ]- R" W pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes); LHLFont_DebugString(Buffer); $ o% }& l& w- q E9 H if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)' o2 h+ }8 Y" q4 L" q8 m% l& o {0 Z; a5 D- W# g& \" p% a6 w$ ? sprintf(Buffer,"接口%d的端点1为输入",myi);& Q6 e2 P% g: W b% _+ R }: d+ E+ ~# Y7 }3 y else { sprintf(Buffer,"接口%d的端点1为输出",myi);( k) }5 v9 H5 h' p3 j" E }. i' L ~! j* s: b LHLFont_DebugString(Buffer);1 f0 p# s2 U; u2 ~- z1 {8 S3 O3 L# s 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); LHLFont_DebugString(Buffer); }) n. O1 X% j1 n$ R7 L myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;1 C# |& ]$ c) m8 ^ myClass.MSBulkInEp = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;! t5 c" V" |5 t* q. d6 z/ @& M myClass.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize; myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize; myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);. M. l: U5 ~: x) r F- E( k' ^ myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); : g. a, ^& a) K) F; t$ t ) @" W1 I! `& F status = USBH_Open_Channel (pdev, myClass.hc_num_out,0 u8 i) M( i7 ~% M% n$ e5 S9 ? pphost->device_prop.address,* O; |, Z/ v* Y/ g5 u5 y pphost->device_prop.speed,0 u" d: r$ w, W EP_TYPE_BULK, myClass.MSBulkOutEpSize); if(status == HC_OK)/ `1 @% F% i$ C6 q' \ status = USBH_Open_Channel (pdev,! ?& x3 l9 p: I4 z1 _0 m myClass.hc_num_in,5 \ d/ n3 k, v5 g* |3 D0 a* G6 r pphost->device_prop.address,- o9 `$ m) G! S4 n pphost->device_prop.speed,, n L5 Z$ k+ Y& b8 R( x* }1 ~ EP_TYPE_BULK, myClass.MSBulkInEpSize); if(status == HC_OK) LHLFont_DebugString("USBH Open Channel Ok"); Receive_Retry = 2; return USBH_OK; } void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)9 [ t* r) ?5 D$ A4 [$ ]' y {: ^. T3 }8 h8 J) L# j# s if ( MSC_Machine.hc_num_out) { USB_OTG_HC_Halt(pdev, myClass.hc_num_out);* T$ N% }: P) Y- w7 V USBH_Free_Channel (pdev, myClass.hc_num_out); myClass.hc_num_out = 0; /* Reset the Channel as Free */7 U/ g) P) t6 P } if ( MSC_Machine.hc_num_in)% C0 S! j9 _- \6 C1 e {7 D+ F. {, _* a& `, ?/ ? 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 */) c' Q; F3 Y8 G } } USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost) { return USBH_OK;1 X: b j P9 \3 O' R# D }0 P) c: I3 Y3 C$ g6 x unsigned char usbbuffer[70];# i; V2 e' `: v6 q" f: @; ^- E unsigned short usbbufferlen=0;: m r% S* l. [" M* p& s j) k 5 D6 ?+ O% |% l' h1 f3 [ unsigned char SendMechine = 2; int SendCount = 0; . U& U0 c3 m( Q6 D unsigned char ReceiveMechine = 0; n+ u. u; b" R6 { int ReceiveCount = 0;5 N+ l8 P9 N- w6 Z8 d! F unsigned dataReceived = 0; 6 R1 [4 u5 o/ Y" }0 ^ void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len) {: c) J! U( L, ~8 _: g0 c( \/ h unsigned char *ptmp=usbbuffer; usbbufferlen = len;" I. _% l: s3 q d while(len--)5 @5 \' F) E4 c! g% j" h3 g { *ptmp++ = *pbuffer++; } } USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost) {4 E" c- d) S; {7 `0 w: o) m& A0 z if(SendMechine==1) { SendMechine=0;8 S, |2 _3 x* L, z) w% s9 C( y' q USBH_BulkSendData (pdev, (unsigned char *)usbbuffer, 9 ]6 r- H C! U: ~ usbbufferlen , myClass.hc_num_out); SendCount=0;6 z% f/ ?- A" F& {- R: L4 F& a8 ^+ Z while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0). V% J t" X: x { Receive_Retry--;5 T$ l0 W/ n9 f4 I/ P. M T% W ReceiveCount=0;( s2 b8 G! s: v# k& T% R6 @ USBH_BulkReceiveData (pdev, (unsigned char *)usbbuffer+3, 3 x/ s$ q9 a T* ~4 ?; l 64, myClass.hc_num_in);* e1 J: e4 i# J, C0 h 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自定义类开发