在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。 st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。; i; |8 H8 k8 p6 t4 S0 T& ? 在st官方usb库中,usb类是这样定义的:, V5 v% K2 @3 d8 j8 H& H( g ! V5 O" B) ^5 s/ W9 I% h0 _5 A/ B: _ typedef struct _USBH_Class_cb {6 w$ o$ n+ P- y/ P USBH_Status (*Init)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线 void (*DeInit)\) O$ A9 O( K$ y (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源 USBH_Status (*Requests)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求% r% y0 t- N0 i: w/ L/ U USBH_Status (*Machine)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 ; ~% ?" a+ o8 T8 ^6 ^6 k } USBH_Class_cb_TypeDef;5 g6 ]( O, c+ S* j, M 那么,我们如果要实现一个USB类,就需要编写以上四个函数。 下面就是我自己写的一个自定义类:1 n, ^; C1 m' E' a5 s/ A 3 T- [4 D! N. m# u; B typedef struct: U. ~/ X! x5 L6 H* `: | {! r) r h" ~. Q' u* l3 D uint8_t hc_num_in; ; ^. Y5 F4 k7 p uint8_t hc_num_out; 6 P* G* T& {. O4 u+ S uint8_t MSBulkOutEp; uint8_t MSBulkInEp;! @% i0 o* s0 w- u' H uint16_t MSBulkInEpSize;, B6 b" K4 B$ A# t! L& F uint16_t MSBulkOutEpSize;* k) ?2 z) B1 s" G }myClassTypedef; myClassTypedef myClass; 8 g3 A) E( A. _) x5 M- M USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost) { USBH_HOST *pphost = phost;! t, y1 a/ i( U. P/ o short myi;6 D% i) `4 |. Y" J char Buffer[50]={0}; - c2 m* }+ Y- g0 L: M7 K a unsigned char status; 2 U) n6 R/ k' M' T ~2 h6 J sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);6 x6 o/ s* N- @4 K. h1 R LHLFont_DebugString(Buffer); $ ]2 ]. U3 P4 w( m for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++) {* d, ]9 _! C9 W" I9 g, b if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80) {0 {- ~5 [- v4 v/ v sprintf(Buffer,"接口%d的端点0为输入",myi);1 {, S. G6 |& g/ y7 X# s) d. f2 P0 { } else1 t/ D& o4 t/ Y3 e {; d Q8 G) G4 c6 R sprintf(Buffer,"接口%d的端点0为输出",myi); }! H2 H+ d8 R3 o7 g2 S7 |( \, `" y LHLFont_DebugString(Buffer);$ F; h0 D: @3 Z# a3 s% a 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); $ J. m* J6 a9 k# q2 |7 v if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80); m! e( l& E+ o& n8 ~& ~ {, `, i5 o+ b* {- O& Y, {8 e0 h sprintf(Buffer,"接口%d的端点1为输入",myi); }) ~' F( q U) z7 z! i1 @. ^3 Q else { sprintf(Buffer,"接口%d的端点1为输出",myi); } LHLFont_DebugString(Buffer);) `9 ^) C' {) M% J& h+ Z / d: e0 r b3 a. a. p) c, w. q 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); . ]( q3 x. T0 J" v }+ z& Q- z# }) j3 y$ u: R myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;: y: e$ a4 v# i! i myClass.MSBulkInEp = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress; myClass.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;# i" K* O- S6 ]* n myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize; myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp); myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); 7 M7 T, n- ]" j status = USBH_Open_Channel (pdev, myClass.hc_num_out, pphost->device_prop.address,$ s5 s3 A( J& M/ R* B# R pphost->device_prop.speed, EP_TYPE_BULK,5 z) o' Q* F" v* Y3 P, Z5 V3 `0 e myClass.MSBulkOutEpSize); / V J4 W4 m. v$ i if(status == HC_OK) status = USBH_Open_Channel (pdev, myClass.hc_num_in, pphost->device_prop.address,7 Z/ Q! U% F/ ]) w, A; } pphost->device_prop.speed,* V4 q. G, X) Q5 A! {) G4 A EP_TYPE_BULK,0 y* o1 S+ o* V; q' K9 x3 u myClass.MSBulkInEpSize);8 a- {" J ]' b- Z: d6 ] if(status == HC_OK)9 ]; F' x* h) ? LHLFont_DebugString("USBH Open Channel Ok"); Receive_Retry = 2; : Y+ U/ |' v! j7 d% t return USBH_OK; } ; G8 I) k' @2 h3 Q7 j2 j3 t void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost) {4 C& O! A# J7 f+ j" M) K4 p$ F U if ( MSC_Machine.hc_num_out)" W: F1 H* |: m: J6 [# t" w/ M5 W# d {4 f4 G9 K( T5 e- {: f G, w USB_OTG_HC_Halt(pdev, myClass.hc_num_out);. T+ g6 E/ x- x: l& X9 n USBH_Free_Channel (pdev, myClass.hc_num_out); myClass.hc_num_out = 0; /* Reset the Channel as Free */- J1 b% Q3 n M! [ } % H* t' R9 ]& @& W+ q# h if ( MSC_Machine.hc_num_in)! R% g$ G3 X3 s/ B0 ~. y {! O9 N- W0 R: V$ \ USB_OTG_HC_Halt(pdev, myClass.hc_num_in);8 i1 u( M$ ?; N5 I+ I: U, p USBH_Free_Channel (pdev, myClass.hc_num_in); myClass.hc_num_in = 0; /* Reset the Channel as Free */ } : l- f1 `/ @/ M) [' ~ }1 d( W; H' _; s5 Y% K7 g; E USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost); |9 M' J2 `( w! K { return USBH_OK;% f r. P8 y2 i s. C" I( K( a }+ F8 R4 O+ C% S. m2 T. c- ? unsigned char usbbuffer[70]; unsigned short usbbufferlen=0; * Z; S( q% b/ [2 e1 N unsigned char SendMechine = 2; int SendCount = 0; * L+ A' h) F/ ] unsigned char ReceiveMechine = 0; int ReceiveCount = 0; unsigned dataReceived = 0;3 Y% v" d9 ^( C: {+ L2 C3 x $ g& n4 m- m! E! o% c void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len) { unsigned char *ptmp=usbbuffer; usbbufferlen = len;9 y) n' y4 `! x3 L 2 q6 p% {3 T8 ~ while(len--)* u5 f2 d5 R- {, I { *ptmp++ = *pbuffer++; } } USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost) { if(SendMechine==1)+ N' U, J1 {8 d. G; \, z$ A- ] {6 _& W" \% Q7 e) X0 W6 t SendMechine=0; USBH_BulkSendData (pdev, (unsigned char *)usbbuffer, usbbufferlen , myClass.hc_num_out); SendCount=0; while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)$ _1 D. I# ]; v6 l { Receive_Retry--;7 q, j# w1 s! E C) C3 i ReceiveCount=0; USBH_BulkReceiveData (pdev," x8 I: j: w" Y( E9 |% P (unsigned char *)usbbuffer+3, ' t: T) E" P, p 64, myClass.hc_num_in); 0 ~4 j* O4 {% [ ^# @1 p* p6 v 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自定义类开发