在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。 st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。* e% J9 b+ D" l1 @* M 在st官方usb库中,usb类是这样定义的: typedef struct _USBH_Class_cb' V; z- _& V7 v) r( G2 b( _ {1 t2 p- P5 f( r+ F3 P- \5 ` USBH_Status (*Init)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线 void (*DeInit)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源2 S( ?, l4 j0 k. Q% ] P USBH_Status (*Requests)\- ?7 B$ b/ G" |! a! Z7 `5 _ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求 USBH_Status (*Machine)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 ) x+ i- J9 C' O } USBH_Class_cb_TypeDef; 那么,我们如果要实现一个USB类,就需要编写以上四个函数。 下面就是我自己写的一个自定义类:& {0 p0 x7 L4 q3 O3 d 6 V) O" K( z* g( D8 U typedef struct$ M$ k: R) F/ A+ a r {2 b i* w4 T# v# p2 [; i. c0 K C* e4 y V uint8_t hc_num_in; 2 F) W' e& ^9 N" h' ~5 }$ { uint8_t hc_num_out; 1 i% y' a4 `# | uint8_t MSBulkOutEp; uint8_t MSBulkInEp; uint16_t MSBulkInEpSize; uint16_t MSBulkOutEpSize;; f- D t# j' O }myClassTypedef; myClassTypedef myClass;2 ~- }. |# {5 \0 A: K2 m' R; \ * R+ w) p4 T% b# m USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)+ G' U2 ^2 M- | {8 q1 b# V4 k% S5 i USBH_HOST *pphost = phost;- ~) t) J, T- ~$ j0 x short myi; char Buffer[50]={0};/ S; U% A4 ~4 C. C: i+ \ unsigned char status;/ J+ Y+ u4 U4 J9 N8 N5 g! x 3 S: x4 b7 ?/ U% a- [$ o sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);1 X$ L7 ^. R, P LHLFont_DebugString(Buffer);; u. u9 o4 b% J/ Y+ N" O0 P8 K0 ] 1 J' j# R. U2 v1 Q9 {" f for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++) {/ Z1 k! M: N0 i- _& s( | if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80) { sprintf(Buffer,"接口%d的端点0为输入",myi); } else! r# `$ m) ?. u1 m' D/ _ {/ T+ A& G0 I* z4 Q sprintf(Buffer,"接口%d的端点0为输出",myi);: y' y3 i* A* o) \ }5 N2 d( N; o' L" w$ p4 E6 r LHLFont_DebugString(Buffer); 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); 4 P7 A& d. l4 f) m if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80) { sprintf(Buffer,"接口%d的端点1为输入",myi);1 ]! o8 C7 w& t/ q; s3 ~6 E }* n |% }$ r4 u. [. x else {4 j: ]) W9 N" D2 W, W/ N sprintf(Buffer,"接口%d的端点1为输出",myi); }6 |* q7 B( u- P LHLFont_DebugString(Buffer);8 |) Y) u0 U4 c* e3 ^* n sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,+ k8 A# D$ X2 e9 ^6 K4 j' R pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);& o$ V+ {& h* h0 Q' `1 R8 e LHLFont_DebugString(Buffer); ' S# ?2 Q0 e7 H* h* N' ?, m }6 ]$ z f* F" J7 Y' m / A# y( `! B& c1 h% o0 @! w myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress; myClass.MSBulkInEp = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress; myClass.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;3 r' P2 h4 }' u0 I* ?9 v myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize; # f' t* Z6 L. W8 w6 [$ y myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);/ h5 C0 n/ H! |( N. n myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); status = USBH_Open_Channel (pdev, myClass.hc_num_out, pphost->device_prop.address,' S% j/ a+ f" U! a7 c( U9 w pphost->device_prop.speed,6 h4 _& H) D: P7 {3 K; h& Z/ m9 U EP_TYPE_BULK, myClass.MSBulkOutEpSize); if(status == HC_OK)5 f+ m0 X2 S& G4 Z) N2 Z ^ status = USBH_Open_Channel (pdev, myClass.hc_num_in,: ^4 ]' m) e, P( a8 C pphost->device_prop.address, pphost->device_prop.speed, EP_TYPE_BULK, myClass.MSBulkInEpSize);$ x* ^) j# L: C4 R- S. X! d if(status == HC_OK)' f7 k6 K+ n7 ]! [ LHLFont_DebugString("USBH Open Channel Ok");7 B4 \. j8 X" E. x Receive_Retry = 2; - z/ x* S& l9 Y return USBH_OK; . C, S' X4 n9 f6 s! L: |' E' J }$ X1 n ?! M: k* O - c: t* W. y8 I! K& W7 F: @7 C void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost) {+ J( n. R% b* ~2 Q' K+ E if ( MSC_Machine.hc_num_out) { USB_OTG_HC_Halt(pdev, myClass.hc_num_out); USBH_Free_Channel (pdev, myClass.hc_num_out);" C, N; [& R7 f myClass.hc_num_out = 0; /* Reset the Channel as Free */* h/ g; s/ I2 u }- r0 @0 b( Z: Y, T6 ? " q. \6 `. t- U6 h8 l0 g if ( MSC_Machine.hc_num_in) {; @2 q5 a$ [! x! L% t USB_OTG_HC_Halt(pdev, myClass.hc_num_in); USBH_Free_Channel (pdev, myClass.hc_num_in);" F7 U& D1 h+ P myClass.hc_num_in = 0; /* Reset the Channel as Free */) p/ f2 J3 F& _- V2 M! l) L& F8 ]! i } ( v# K7 N9 ^: |& J0 r }) c7 L# u i8 e6 z: d( s, f- i USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)# c; v2 M+ f$ Y- q# `1 K { return USBH_OK;1 P6 D4 V/ V9 B* A% P, E } unsigned char usbbuffer[70];% b/ T# j( ^$ I! k* f% I; q unsigned short usbbufferlen=0;3 a: J, L9 p# [' Q4 q3 d4 { unsigned char SendMechine = 2; int SendCount = 0; unsigned char ReceiveMechine = 0;1 X5 s8 G6 X) j2 d. G int ReceiveCount = 0;* v$ c9 v3 R+ M unsigned dataReceived = 0;0 J1 }# h1 J& U+ C; ] ! @) D4 B9 O5 h; L) [ void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len), n1 x; I4 E# y2 V. n6 M$ { { unsigned char *ptmp=usbbuffer;, A1 c3 i: b( y F9 P& y% V usbbufferlen = len;6 N. @+ t: v4 K; q4 W' l while(len--) {5 E7 C7 V6 a, s! J- Z9 t, X *ptmp++ = *pbuffer++;, j9 Q7 F6 G9 ~4 y } } USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost). l. u- g/ R8 o M: {1 N" W {5 Y( ^9 t/ V' v8 S. i if(SendMechine==1)7 G: \6 ^) n& P5 p c2 T' Z& v {# K9 o. U% O$ z/ m* l L& a SendMechine=0;; g& J4 |- d9 [' ?" _+ R- p1 K* R USBH_BulkSendData (pdev, (unsigned char *)usbbuffer, usbbufferlen , 7 U B; {# Z* A myClass.hc_num_out); SendCount=0;1 K" n5 g5 f4 y/ z while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0) { Receive_Retry--; ReceiveCount=0; USBH_BulkReceiveData (pdev,; J: u" t/ k7 H+ q& V" p" `& I (unsigned char *)usbbuffer+3, 64, 7 n% d4 O- Q6 k3 }. p! V8 { myClass.hc_num_in); 2 V, d' G1 x( B' {. P8 I6 C 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自定义类开发