|
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。! H5 }: ]; `* y# H st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。 在st官方usb库中,usb类是这样定义的: typedef struct _USBH_Class_cb& |: s! C: ~- K# F { USBH_Status (*Init)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线5 j0 i- ~) }8 S' w) M7 W void (*DeInit)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源* {7 K' ]& u r. _2 j/ q4 {+ J6 u- z USBH_Status (*Requests)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求 USBH_Status (*Machine)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 ; t; A4 a0 q" T# T, c3 q5 j , `3 a$ Y% d7 }: w" R; | } USBH_Class_cb_TypeDef; 那么,我们如果要实现一个USB类,就需要编写以上四个函数。- m: n& M8 J7 w, q 下面就是我自己写的一个自定义类:5 ^- |8 S# _! ^+ m; i+ y . S: K( F6 c8 Q% m8 u7 R$ e8 C+ ~ typedef struct' T* u2 J: N. e- l( A& o {1 _4 C, a# U" ~# b N uint8_t hc_num_in; 5 c1 }( r& |0 V( P. B) M# G/ [ uint8_t hc_num_out; 2 `: f& T0 Q Z& c3 V- c' S uint8_t MSBulkOutEp;" c' f5 q/ h0 {! u3 E uint8_t MSBulkInEp; uint16_t MSBulkInEpSize;% T, ~5 k4 Y( c4 w7 M uint16_t MSBulkOutEpSize; }myClassTypedef; myClassTypedef myClass;3 Y5 E0 X0 f6 H6 m USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost) { USBH_HOST *pphost = phost;* m# M" d! i" r& R, {6 M; f' s short myi; char Buffer[50]={0}; 5 }, z) K) y/ J- Q+ E: l) r0 b. k unsigned char status; sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces); LHLFont_DebugString(Buffer);2 v- Y0 e$ \, ~1 \ ( ]; l( |$ j9 |" _0 g4 w. u for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++) {: X: ^8 j5 m5 p2 q% S if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)- S* g& i' ^7 }5 y {2 s9 N9 E9 @3 i+ i& M, p2 Y sprintf(Buffer,"接口%d的端点0为输入",myi); }: B3 P0 h8 }. T# w9 `$ O: M else {( b! \3 G5 f* a& {! M! R( ~ sprintf(Buffer,"接口%d的端点0为输出",myi); }/ h4 K& X2 x8 K2 o, ~ j, J LHLFont_DebugString(Buffer);. k) F S9 l5 Q$ z 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); LHLFont_DebugString(Buffer); ! z: p) P+ }- {7 [3 Z5 i( y if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80) {1 R! Z1 w/ @: R; \ sprintf(Buffer,"接口%d的端点1为输入",myi); t2 M. D5 h( y- d4 T( u! N- O$ R% ? }% F4 j9 K1 p, Z else: B: c& u8 h" y: S { sprintf(Buffer,"接口%d的端点1为输出",myi);. [9 H- j3 a! y- k } LHLFont_DebugString(Buffer); sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,4 ?) i- c: n6 d pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);, d% q) p) ]* W$ l! |7 ]7 r/ [ LHLFont_DebugString(Buffer); 7 t) w& Q0 ~1 u b }! H/ ^, `3 K: C/ M- f, u& x( X$ a* E$ h n8 }% c' D% o$ d. j myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;# ?1 X6 _) N7 c* K* s myClass.MSBulkInEp = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress; myClass.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize; myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize; ' B. o" d2 |( w8 y5 y. R8 U- ?0 v myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp); myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); 0 |/ @3 g1 v S6 E" x9 W ?+ O , t$ }9 `; |/ T status = USBH_Open_Channel (pdev, myClass.hc_num_out, pphost->device_prop.address, pphost->device_prop.speed, EP_TYPE_BULK,- T) O+ m" t8 N myClass.MSBulkOutEpSize); . a- Y3 P& S+ S' U" f if(status == HC_OK); P6 p! M/ z* U1 L" b6 S! S status = USBH_Open_Channel (pdev,* M7 N0 W: g3 m) H myClass.hc_num_in, pphost->device_prop.address,5 F2 s& R& u; K pphost->device_prop.speed,, d$ Z: F! w# ^ z6 ~$ D EP_TYPE_BULK, myClass.MSBulkInEpSize); if(status == HC_OK); S( x3 J! K8 k* C* I% E( ~ LHLFont_DebugString("USBH Open Channel Ok"); * H5 L/ r! p5 v6 _# V( a2 J6 o Receive_Retry = 2; " w, g: x4 Q2 t+ F; k6 a return USBH_OK; 1 _, k+ D% q/ V# o6 @5 @ } I9 Y% B7 I2 _3 d* m void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)# \3 ?9 P9 S# s& h {0 T; |& Y. q0 K( v: O) I if ( MSC_Machine.hc_num_out)# o+ ~2 `; t) U# R0 Y {. y( A# ?. U/ X7 l9 U# j3 t# l USB_OTG_HC_Halt(pdev, myClass.hc_num_out);- d2 ^: t" h1 b( F4 B2 ^) b USBH_Free_Channel (pdev, myClass.hc_num_out);* q3 V+ O, v1 M, ^/ b7 R$ S myClass.hc_num_out = 0; /* Reset the Channel as Free */ }# v( f/ e6 }9 n9 b6 o: T, Z. [; e if ( MSC_Machine.hc_num_in)3 a: {& q) S2 B6 N9 Q {* x$ G7 h' M8 ^1 z, a4 m8 H. t 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 */# |% E$ d% E6 O: A) `, ^( k3 z } }, Z7 J% [# |# a7 x6 w USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost) { return USBH_OK;9 \2 F1 ]1 a N( z2 y0 {( U } unsigned char usbbuffer[70];! F9 l- @, ?" t. |* B0 c unsigned short usbbufferlen=0; * b& u, ^6 u/ |; _# i' P4 F8 H unsigned char SendMechine = 2;5 T( A# a; {5 V& s5 ~ int SendCount = 0;3 V+ B8 v$ l; O/ H ; L1 t. b+ f) z/ [+ _+ q unsigned char ReceiveMechine = 0;" K( Y Z8 C/ M& r4 S/ f int ReceiveCount = 0; unsigned dataReceived = 0; void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len) {% L. i4 {4 [ @/ @# N n% k unsigned char *ptmp=usbbuffer; usbbufferlen = len; ; B1 {- r8 a0 y' f. {$ V! c/ B t while(len--) {( a4 n4 J' D9 e8 L4 w% Q3 M *ptmp++ = *pbuffer++; }$ b7 O) Z) D8 I0 H: Y } USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)- v8 d6 P2 P3 D# X- h { if(SendMechine==1)/ z) }6 D4 X- u. Z9 | {; k6 ]) M i3 z SendMechine=0;1 T" E: U3 B5 I/ b0 L' b USBH_BulkSendData (pdev,) R4 Q( R9 o" M9 m5 [, I/ [ (unsigned char *)usbbuffer, ( c0 e' p6 S8 P1 X% q/ G+ z- @ usbbufferlen , myClass.hc_num_out); SendCount=0;% t2 a& F- U3 C' g while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)0 s2 I9 Q+ C/ _ { Receive_Retry--; ReceiveCount=0; USBH_BulkReceiveData (pdev, (unsigned char *)usbbuffer+3, / b- t" k7 A4 K$ G* _3 W+ U 64, 3 X& t/ e, C: V/ E1 j- Q myClass.hc_num_in);6 |8 F! \' ^/ N$ Q: b# a# Z- u 3 K& F8 M; p1 _3 n 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自定义类开发