|
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。 st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。4 }3 n$ I4 [* T+ t' q; X 在st官方usb库中,usb类是这样定义的: - H) H, M6 V+ p: H5 Z typedef struct _USBH_Class_cb { USBH_Status (*Init)\0 z+ }- } ?9 Z (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线/ F1 a+ z, G; T4 o$ F- r$ j9 M void (*DeInit)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源! U2 y0 l) H1 i$ H {" ?* q USBH_Status (*Requests)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求 W) a& } ] U P- C USBH_Status (*Machine)\& K; j6 J: T8 @8 j9 F7 ` (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 7 F+ g/ o, A* E6 } } USBH_Class_cb_TypeDef; 那么,我们如果要实现一个USB类,就需要编写以上四个函数。 下面就是我自己写的一个自定义类:- E3 G* e, ^2 u3 |- C) W! F& X % D: I/ h: Q9 I, X" b typedef struct+ ?4 _) c" q/ d {& P* t3 [; L4 w uint8_t hc_num_in; uint8_t hc_num_out; 6 J$ u' b; E; w$ O2 [/ J uint8_t MSBulkOutEp;; ?! T& a8 c7 e+ W# P uint8_t MSBulkInEp;2 m' K; m+ Y: Q/ Q% Q& s* v! B uint16_t MSBulkInEpSize; uint16_t MSBulkOutEpSize; }myClassTypedef; myClassTypedef myClass;$ k I! C/ V$ g- e: P USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost) { USBH_HOST *pphost = phost; short myi; char Buffer[50]={0}; unsigned char status; & r4 X7 f2 K: y* g. E sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);1 l/ x7 V6 y9 s* \ R: `- J LHLFont_DebugString(Buffer); , y5 r/ @' T8 r7 J& [/ ^8 p1 u1 j for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)7 a, o3 _% D$ A- ~. O( S { if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80) { sprintf(Buffer,"接口%d的端点0为输入",myi); } o" R' d! k* J) X else7 p3 I# O, R9 D4 @9 U* { { sprintf(Buffer,"接口%d的端点0为输出",myi); }8 c9 Q1 C8 I- p) s" @ LHLFont_DebugString(Buffer); - R2 n2 M( }% T2 r, _ sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,; m3 J ` J7 z/ m! E- x pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);+ |& t! g# m6 B LHLFont_DebugString(Buffer);. T% V2 O8 [4 }% w if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)6 m6 O" G: n e" D) S5 y2 ]0 J5 M: z {! C7 w7 }# ] w: m' j/ X sprintf(Buffer,"接口%d的端点1为输入",myi);% O( T: R4 N2 L p. o1 a$ ~ } else { sprintf(Buffer,"接口%d的端点1为输出",myi); } LHLFont_DebugString(Buffer);% v5 H! ]& ?: { 2 U. X) e( Q: c# m @: [ sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,/ K: d$ ~5 e' |: V6 A5 ]1 F/ b' c pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes); LHLFont_DebugString(Buffer); }& z' X8 Q. i2 i8 O+ S& | ( A2 U9 B& M! r/ M1 x5 h myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;; i' E) [% A, ]( [# k- D myClass.MSBulkInEp = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress; myClass.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;; G, o$ h: m( z4 [9 `) F, U+ f/ a myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;$ X; N, a+ |/ m1 ~ myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);* k$ l# n" U: s; l myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); status = USBH_Open_Channel (pdev, myClass.hc_num_out,: u, J0 _ F ?; x% ~9 W pphost->device_prop.address, pphost->device_prop.speed,/ s& ], E: `" @( r/ s, V0 {* X EP_TYPE_BULK,' G" n5 O# [, k6 K* a# ` myClass.MSBulkOutEpSize); if(status == HC_OK) status = USBH_Open_Channel (pdev,1 A+ V8 Q9 c9 S6 U myClass.hc_num_in, pphost->device_prop.address,& Q& K5 I4 y" Q- _; p( |8 z pphost->device_prop.speed, EP_TYPE_BULK,% y9 ? U: D( ^ myClass.MSBulkInEpSize);5 ]" c: s& C( v5 n& j- H$ K if(status == HC_OK)7 F& Y2 q8 l2 @0 n# R5 y) A3 i LHLFont_DebugString("USBH Open Channel Ok"); Receive_Retry = 2; return USBH_OK; . |; R% G& }- R; u7 j1 y } ! G1 C+ M U/ _: a2 O P void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)* K! |4 M' ^# m6 m. l/ H/ O {8 [8 ^5 T6 g9 V: K9 Q1 w if ( MSC_Machine.hc_num_out) { USB_OTG_HC_Halt(pdev, myClass.hc_num_out);) F3 [( p% L: s USBH_Free_Channel (pdev, myClass.hc_num_out); myClass.hc_num_out = 0; /* Reset the Channel as Free */- d) `! m' h& s; | }/ e8 J/ I# j& |( _0 Z1 ]* _9 w+ O8 z if ( MSC_Machine.hc_num_in)3 x$ L* [9 K3 ?& x' ^ { 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 */# d* e( u' i9 i, w3 |8 s } 2 [$ E1 [; T! d, m3 J; o, t" o } USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost). b- T6 n* H5 _; c, y9 W# g {7 i; M6 X/ _6 T! x1 o# Z' g! q return USBH_OK; }! e7 O. x0 C1 Y unsigned char usbbuffer[70]; unsigned short usbbufferlen=0;- ]& t& O T: M+ Q: z0 \; A- l ( V! [9 }$ D, J6 O unsigned char SendMechine = 2; int SendCount = 0; 8 a; a! p5 n. E, F unsigned char ReceiveMechine = 0; int ReceiveCount = 0; unsigned dataReceived = 0; ; y$ _: {3 C. J7 I% r void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len) { unsigned char *ptmp=usbbuffer; usbbufferlen = len; ) h" y# V5 U, ^! Z while(len--)- z; d* o- |% p! L% Z { *ptmp++ = *pbuffer++;+ q& o1 l$ T# i7 X }+ \" T2 z& ?: [" v! S' \4 z- q) M3 _ }' E$ `5 A$ O* y& O USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)) E7 x' h7 L6 _; ~) [$ ?1 i3 u { if(SendMechine==1): p7 I$ T1 t3 D9 ]' w { SendMechine=0;+ F; |* y! A( ~( L$ h% r+ E7 G1 _- R USBH_BulkSendData (pdev, (unsigned char *)usbbuffer, ) x; ?9 z' J. N, A3 @ usbbufferlen , myClass.hc_num_out); SendCount=0;! w) E! y2 V _8 u7 _ l while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0) {7 x9 n" z2 k0 y: c: f+ _; M& ~ Receive_Retry--;' U6 G- a0 \( T0 |0 C& j0 h. ` ReceiveCount=0;, c P S0 G' Z. G T- X USBH_BulkReceiveData (pdev,1 ^" G4 b4 g* y) t (unsigned char *)usbbuffer+3, 64, myClass.hc_num_in); 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自定义类开发