在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。7 Y9 B; q% V9 m. W* U c% p2 z st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。2 c! i& A) {2 w' m; I 在st官方usb库中,usb类是这样定义的:8 b& u! r) n+ L typedef struct _USBH_Class_cb4 D/ v2 m. u; q+ R { \6 G8 j8 a: ?( `! l3 u% n$ d USBH_Status (*Init)\" C+ x2 B) c# O9 U3 N# n2 H! [ (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线 void (*DeInit)\& q6 x' r9 s+ t( {$ Z0 k- J2 X' [ (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源 USBH_Status (*Requests)\! x2 k$ M/ n" X" A; q( l | (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求) z {/ h! Q( P1 x$ Z/ r0 V USBH_Status (*Machine)\6 Q1 \+ ^1 f! |; K/ K1 j8 ~$ B (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 } USBH_Class_cb_TypeDef;/ Z: i/ L' J+ e8 d4 d- X 那么,我们如果要实现一个USB类,就需要编写以上四个函数。 下面就是我自己写的一个自定义类:4 [" n' R0 V9 Y* F$ L6 _ & w& S; a$ B4 t$ o% ^% Q1 z+ P typedef struct {+ Z2 P# Q8 W/ T: K6 d _5 s uint8_t hc_num_in; $ v8 `! N. r/ ?, \/ e2 o uint8_t hc_num_out; 2 G6 \( W4 {* u6 N" V uint8_t MSBulkOutEp; uint8_t MSBulkInEp; uint16_t MSBulkInEpSize;( c- X* f$ p7 f. v) ` uint16_t MSBulkOutEpSize;& X( b% x( o7 `, z }myClassTypedef;/ d6 u" H2 U+ K myClassTypedef myClass; USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost) {. v: W0 j3 i- e5 C8 g; v3 x USBH_HOST *pphost = phost; w+ L/ t, K% s3 E short myi;4 m |8 l6 i$ e. D. f0 t; U4 z5 n char Buffer[50]={0};" V* X' Q) ~# ^5 N+ K unsigned char status;# l. L2 Z1 o+ A3 ~ 2 D) p( B- \" ?3 m2 a q+ X! x sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces); LHLFont_DebugString(Buffer); & ?6 G5 o& v/ z4 r2 V4 {& O2 C for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)+ L( }( x% z6 A. s8 x { if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)+ D) i+ O5 _1 F0 d" N' [ { sprintf(Buffer,"接口%d的端点0为输入",myi);" K4 l9 z1 w0 {; w" W% |; y2 _ } else { sprintf(Buffer,"接口%d的端点0为输出",myi);% y' E- X( G8 W) v, _ }9 i) u- M7 O. D LHLFont_DebugString(Buffer); 7 E1 ~. b5 Q, s( G: d 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);( o" _# P, o$ E4 L7 B2 z+ H! x . N2 u7 F( a f) V if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80) {* I7 t A3 l- E7 E& T sprintf(Buffer,"接口%d的端点1为输入",myi); } else2 \/ I$ @) y0 P9 S {/ ]7 i$ r+ R1 P, _* D8 s sprintf(Buffer,"接口%d的端点1为输出",myi); } LHLFont_DebugString(Buffer);% }4 x u+ f% y! y: i # e4 R6 B$ c( G 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);1 c4 [' u: }, z8 a# Y- ?4 j" l- t: P2 P LHLFont_DebugString(Buffer); 2 @; `! G0 O" w5 A* A- x }: L: {) j$ m) F4 R% v7 W8 R. ~5 v' Q" x . ]; X( s1 u# U! m myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;' O9 E4 p; c* n P- p7 L6 r1 g! U7 t 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;3 D8 A( V0 G6 m" r myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);$ I# `! F: L# ?* A7 d myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); $ g0 b* s( X/ _8 G/ D! p status = USBH_Open_Channel (pdev,. G' l* m; z" L' I' e8 d( E" s. _ myClass.hc_num_out,. T0 T! v) J% | F9 d3 p: L pphost->device_prop.address,- R2 y) {2 ?+ K# d- [0 B) K pphost->device_prop.speed, EP_TYPE_BULK," Y/ o$ Y, Y# N2 j. U; F7 B myClass.MSBulkOutEpSize); # h/ q1 V# Z' ~' x7 m7 M$ ` if(status == HC_OK) status = USBH_Open_Channel (pdev, myClass.hc_num_in,1 }$ \+ z0 u8 a1 w pphost->device_prop.address,3 r5 N& W# [2 u pphost->device_prop.speed," t% q9 f# }& _ EP_TYPE_BULK, myClass.MSBulkInEpSize);$ K' B1 j' m& k if(status == HC_OK)' v/ H% g: b8 l0 |- }/ s; h4 [$ | LHLFont_DebugString("USBH Open Channel Ok");- V7 u# |7 M& o- j, b# o7 I$ N Receive_Retry = 2;4 E+ ~& F2 ^6 d% G$ ` return USBH_OK; } void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost) { if ( MSC_Machine.hc_num_out)! R4 h8 a- {( r- [& w; T0 H6 B {; w* v4 r/ L7 n. S% t$ E* { L USB_OTG_HC_Halt(pdev, myClass.hc_num_out);: C+ W; _" n3 U USBH_Free_Channel (pdev, myClass.hc_num_out);1 t9 x( n% j% G: O& B6 S9 V myClass.hc_num_out = 0; /* Reset the Channel as Free */ }% y& b4 z% V" v if ( MSC_Machine.hc_num_in), z. Y( {& C, _8 q { USB_OTG_HC_Halt(pdev, myClass.hc_num_in);# K2 Y# \' K5 ]6 g; `) x( L) z USBH_Free_Channel (pdev, myClass.hc_num_in); myClass.hc_num_in = 0; /* Reset the Channel as Free */; p; b0 u* f3 T) k7 d+ |3 a* S } } USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost) {& P" \+ m* J; @8 @ return USBH_OK;; G4 _# ], A+ K, x }4 ^4 J5 j1 p- M; g' Z, [! x unsigned char usbbuffer[70]; unsigned short usbbufferlen=0; + e6 }- o% x: u: |) E unsigned char SendMechine = 2; int SendCount = 0; 1 e4 L, f5 D, y6 k) S! ~ unsigned char ReceiveMechine = 0; int ReceiveCount = 0;: e, I& A, p/ y x* T unsigned dataReceived = 0; 4 M, i/ P7 D P" Q9 c; | void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)0 F9 a6 m6 a+ e7 b( n- E9 g {4 R' w$ R5 A [8 M6 H5 @ unsigned char *ptmp=usbbuffer; W x' Y1 A4 d8 G; d usbbufferlen = len; while(len--)4 l0 y! i$ `0 b: P7 V {, z( U& m9 _! S ?& Z *ptmp++ = *pbuffer++;& V: C6 D' B- v9 J; A } }! Q* c# i" t& h- n5 M, l USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)# E; W; ]& V) T% e8 ] { if(SendMechine==1)# x* }1 n3 c9 h# G$ u# o8 L { SendMechine=0; USBH_BulkSendData (pdev,& f5 p+ `3 G- K+ L! q" c4 y (unsigned char *)usbbuffer, usbbufferlen , J1 \3 O' N' W% q myClass.hc_num_out); SendCount=0; while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0) {- F$ V i+ w* b3 {; a) _. D Receive_Retry--; ReceiveCount=0;* A5 V3 }0 U8 x( q2 ^1 W4 l; R USBH_BulkReceiveData (pdev,5 P O/ Z5 M( C- _. ?' H (unsigned char *)usbbuffer+3, 64, ; }+ Q( W: E6 z- Z( A2 D myClass.hc_num_in);5 h0 O1 ^' j* P# G' w, p- N 1 z6 e" I' ]8 U$ [8 ^) b! \ 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自定义类开发