
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。2 y/ r; ~# [* P/ k st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。 在st官方usb库中,usb类是这样定义的: 0 @) s; H* p* X typedef struct _USBH_Class_cb { USBH_Status (*Init)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线 void (*DeInit)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源& t0 ~$ n. u2 v7 F" o USBH_Status (*Requests)\- D/ | I) F, d/ K+ T% y: y (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求# P m/ K* W" ]" ]! A USBH_Status (*Machine)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 , O: t' u/ b3 G1 z9 K } USBH_Class_cb_TypeDef; 那么,我们如果要实现一个USB类,就需要编写以上四个函数。9 _$ N% b) X5 F 下面就是我自己写的一个自定义类:$ d: t- t4 z1 T. g' z! K ( S9 v$ x1 q2 x* t typedef struct, b5 w" f6 a3 X# E8 L {- x0 q' X' r- z* z7 i uint8_t hc_num_in; % ^- \& q5 f" t7 w* q% k4 A6 v, } uint8_t hc_num_out; uint8_t MSBulkOutEp;+ u6 j3 o9 b; ^; a3 V uint8_t MSBulkInEp; uint16_t MSBulkInEpSize;" e2 g* C+ R# c5 a& \6 K M uint16_t MSBulkOutEpSize; }myClassTypedef;- u' N4 R' S& [% x7 J6 ?1 I myClassTypedef myClass; USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost), N4 ~! o1 }" d8 s { USBH_HOST *pphost = phost; short myi; char Buffer[50]={0}; unsigned char status; sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces); LHLFont_DebugString(Buffer);, F: z8 ?5 R- Q for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++) { if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)- Z1 ]) _* C; o ^" ?6 e { sprintf(Buffer,"接口%d的端点0为输入",myi);: |7 p5 E. ~2 q- ~ } else { sprintf(Buffer,"接口%d的端点0为输出",myi);2 x- ?, i5 w) `2 b } LHLFont_DebugString(Buffer); sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,0 s- @, e8 i( w- J; X# B pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes); LHLFont_DebugString(Buffer); n, p3 ]3 X7 M- c' d 6 S0 D1 N- ~# v, ~1 J4 @; a' q if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80) {! q9 u4 N% r% b: \1 K6 @ sprintf(Buffer,"接口%d的端点1为输入",myi);9 U* e$ f6 ^8 V [ } else' `! Z5 m* |: m6 n F( G {! ^1 w% {; U% L sprintf(Buffer,"接口%d的端点1为输出",myi);# w7 I R! o h6 y) j } LHLFont_DebugString(Buffer);- a) y: g% s3 m9 D: ~- ~ 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);/ A/ J, {/ W" } LHLFont_DebugString(Buffer); ' G5 S Z, Y7 ?; j) s3 x" ]% j }9 L7 R3 m( l2 M+ x* B3 i+ n / z( a/ O7 E) o, t9 E myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;! [# f- f- u2 t myClass.MSBulkInEp = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;9 k! D0 q3 z" x+ f; e |8 k5 E myClass.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;6 T" i4 e1 N, f: U! ~, {4 Z myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize; 1 _( z- G5 G0 R( r. {4 O myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp); myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); $ @/ j, X9 ?3 i& k0 A. [# h) ~ 2 W9 X; p }* ~# A status = USBH_Open_Channel (pdev,; Y, e3 s! e; S4 ]: p$ F myClass.hc_num_out,2 ?; N% Y5 i' x5 @* a ^* O pphost->device_prop.address,; u* z5 v. d4 m, N% s/ `3 u) B. I0 [, f pphost->device_prop.speed, EP_TYPE_BULK,; {8 N" o1 A5 V4 x, E4 o# R0 Y myClass.MSBulkOutEpSize); u* \; E2 `' s4 ~ if(status == HC_OK) status = USBH_Open_Channel (pdev,7 K$ [' n4 D$ |1 L$ ] myClass.hc_num_in, pphost->device_prop.address,) K; E8 D& R; w4 @/ T' S pphost->device_prop.speed,8 L& }* b m1 U/ Q5 L4 h. x EP_TYPE_BULK, myClass.MSBulkInEpSize); if(status == HC_OK) LHLFont_DebugString("USBH Open Channel Ok"); Receive_Retry = 2;2 J% ~; t% S4 y/ z c- i1 ` return USBH_OK; } & a% O4 M6 s& `) X' q! c void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost) { if ( MSC_Machine.hc_num_out) { USB_OTG_HC_Halt(pdev, myClass.hc_num_out);* v. ]) {! f8 T, S% w$ }; F USBH_Free_Channel (pdev, myClass.hc_num_out);* O0 u& H6 W/ }/ k. a8 T e myClass.hc_num_out = 0; /* Reset the Channel as Free */) ?+ a6 l7 F: N: S, v! b* U$ w& p0 q } if ( MSC_Machine.hc_num_in) {. e& J3 \4 J% V) g# _- ]7 L USB_OTG_HC_Halt(pdev, myClass.hc_num_in);% Y2 M, w2 d* J' ]4 C USBH_Free_Channel (pdev, myClass.hc_num_in);+ M2 O5 M4 L3 b- K9 U* t- _ myClass.hc_num_in = 0; /* Reset the Channel as Free */ } ' E! `7 K% U+ a# H5 T' p3 ^! H! f9 n9 j }; T) X' O1 A2 z8 l2 z* f USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost) {( K n$ R- C$ [' s- t9 G* Y return USBH_OK; } unsigned char usbbuffer[70]; unsigned short usbbufferlen=0;; Z! a! i* j8 T" u2 M8 o d unsigned char SendMechine = 2;/ i, D' f% P/ b/ ]2 Q: w- u int SendCount = 0; unsigned char ReceiveMechine = 0; int ReceiveCount = 0; unsigned dataReceived = 0; void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)$ j% q! Y7 y5 g9 P; N( e" v' l {# U9 o# L7 W4 i: @9 j unsigned char *ptmp=usbbuffer;4 i: L: m/ L! v2 ~' x# X, F usbbufferlen = len;, ?3 P! D* e) W) t2 _ while(len--)# B3 K* |$ P" R0 u2 k( M {, R5 i5 O7 |7 _" a& V% C) X1 \ *ptmp++ = *pbuffer++;5 U! n0 y! W: y/ c8 o3 g } }$ c3 F* s5 J( c- k; r USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost) o% d1 h3 z; l' A g: G) A7 r { if(SendMechine==1)/ n. G2 b! @! y: h' E { SendMechine=0;1 x( N% |: U/ j. Y USBH_BulkSendData (pdev,' e9 M/ y/ t. J (unsigned char *)usbbuffer, usbbufferlen , myClass.hc_num_out);1 Z6 y( q# ]; Z* g3 V6 r SendCount=0;, a. @# b' J$ A3 J( l3 S while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0) {4 z# w5 }( l0 j Receive_Retry--;1 }% F/ B- q5 B- u; w7 B) L ReceiveCount=0; USBH_BulkReceiveData (pdev,3 b1 u; n) t! C# l i9 S (unsigned char *)usbbuffer+3, 64, . S, Q! {& @9 ?' ~% h myClass.hc_num_in);1 R8 {/ e& V5 _ 9 p/ s! g. `' x- t6 p while(HCD_GetURB_State(pdev, myClass.hc_num_in) != URB_DONE &&ReceiveCount |
èªå®ä¹usbç±».zip
下载2.03 KB, 下载次数: 1205
请问下 您的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自定义类开发