在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。* ~* F( e: t1 @; D& `: p; P st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。 在st官方usb库中,usb类是这样定义的: typedef struct _USBH_Class_cb. ~! h+ ]. M( `1 S9 D: ~ { USBH_Status (*Init)\. u* q( _$ E! ~ (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线$ [5 L- E0 J/ v void (*DeInit)\1 | o$ q, O8 _ (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源 USBH_Status (*Requests)\6 B! w/ i% y9 b U# H% J' J (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求% g/ T' h1 B T2 X8 g USBH_Status (*Machine)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 ' O. y+ G0 S! q7 P! T3 D: T } USBH_Class_cb_TypeDef; 那么,我们如果要实现一个USB类,就需要编写以上四个函数。- J; [- K1 F* V/ _! g1 X 下面就是我自己写的一个自定义类:" M0 z3 X: }) r5 x: p1 a" T typedef struct9 u, N1 n* z, Z5 b9 r0 b% S4 m( z. p) T {: G/ x: ^1 q7 D8 S8 k$ V) t uint8_t hc_num_in; " `5 {# c" Q Y5 U/ T4 ~7 P uint8_t hc_num_out; uint8_t MSBulkOutEp;1 n. w4 m# q9 E7 W* J! \2 H uint8_t MSBulkInEp; uint16_t MSBulkInEpSize;6 u' c# S/ s1 l( P uint16_t MSBulkOutEpSize;# ?/ C* E6 ]0 d$ X3 o4 r% ^; R }myClassTypedef; myClassTypedef myClass; USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)5 W& M5 e- Q, u) ~9 r: z8 Y { USBH_HOST *pphost = phost; short myi; char Buffer[50]={0}; ' Q4 l7 j3 _' K% R( S unsigned char status; sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);: v5 z" R- \ b& l8 V2 v LHLFont_DebugString(Buffer); % i( A$ B7 r7 k* o# q3 x for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)7 s. Z, J; B: N& a0 @* e { if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)! P& h0 J$ ?* ?! ~0 A; W H8 k4 F {! p6 E; p* A1 f3 y" e, } sprintf(Buffer,"接口%d的端点0为输入",myi); @ E$ r9 E1 O9 m- y } else { sprintf(Buffer,"接口%d的端点0为输出",myi); }& S7 b+ {" h% `8 i1 E LHLFont_DebugString(Buffer); sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,, e) y7 P: b4 G! v! ~2 c pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);& X8 n R) K3 `7 P LHLFont_DebugString(Buffer);& M5 I& H: h% k, ~" Y+ a if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)' s7 z# T3 I& @5 a) a/ ?2 P$ d {" G- G) V! D% O: f9 u. o sprintf(Buffer,"接口%d的端点1为输入",myi); }6 B; U% r2 ]+ ` else { sprintf(Buffer,"接口%d的端点1为输出",myi);9 D; O! k8 v9 D; @, d1 a; q8 a' _ }, h( x) y% g; l6 f2 C. C) ] LHLFont_DebugString(Buffer);. W: ?* @$ d" W 5 v1 e$ k5 N7 I7 j' M1 n 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);" G0 u! H' S. s$ K4 J2 p LHLFont_DebugString(Buffer); h* g& u+ D9 f- O+ q' Z. W } 1 h" e1 e/ ^ a5 N0 ?8 v myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;# s1 B! S. N% B$ W myClass.MSBulkInEp = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;# r& H7 t! G# r3 { myClass.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize; myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;: M* Q( w3 x# a5 w . ~- ?) Z1 k' ^2 C& A {2 e myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp); myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); status = USBH_Open_Channel (pdev,7 h. Y6 M5 _- D n2 \ myClass.hc_num_out, pphost->device_prop.address, pphost->device_prop.speed,* ]2 q0 k4 y+ g9 I% J EP_TYPE_BULK, myClass.MSBulkOutEpSize); ! J" U/ T) i+ J& p }3 A if(status == HC_OK) N7 n0 M( H/ B E# v% H. p status = USBH_Open_Channel (pdev, myClass.hc_num_in,# ?- {# @( o- O pphost->device_prop.address,( P T6 N. {2 ~9 q+ O9 V, t, c1 _) b6 ? pphost->device_prop.speed,1 N; S; C7 E O5 R4 M/ R* w EP_TYPE_BULK,$ n U: J$ L# q3 x3 K myClass.MSBulkInEpSize); if(status == HC_OK)8 x- J( k! `* h, Z# P0 F2 p4 H LHLFont_DebugString("USBH Open Channel Ok"); Receive_Retry = 2; return USBH_OK; ! ^. V1 z( C$ J l& [8 ~ r3 v }0 m4 N" F0 R: d1 \ $ O! B* O( L! J) F void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)) z" w& o: X: a, [) i6 D# W, G" B { if ( MSC_Machine.hc_num_out)+ @2 y% g: c- R0 m { USB_OTG_HC_Halt(pdev, myClass.hc_num_out);( K; x, A7 F, T q* S USBH_Free_Channel (pdev, myClass.hc_num_out); myClass.hc_num_out = 0; /* Reset the Channel as Free */ } if ( MSC_Machine.hc_num_in) {# F" M7 R# ^1 m USB_OTG_HC_Halt(pdev, myClass.hc_num_in);2 t3 f9 d: c; H USBH_Free_Channel (pdev, myClass.hc_num_in); myClass.hc_num_in = 0; /* Reset the Channel as Free */ } ! `' X; X' i- z4 m! J) f% J# p8 v } USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost) {: h _8 x# H8 a- _ return USBH_OK; }/ `) J) t, | A4 S" m5 U( |: f unsigned char usbbuffer[70]; unsigned short usbbufferlen=0;# \6 b* y! Z: V2 r , y+ w R5 h! _ unsigned char SendMechine = 2; int SendCount = 0; 9 n% F' R# i! B& w1 s4 [. [ unsigned char ReceiveMechine = 0; int ReceiveCount = 0; unsigned dataReceived = 0;& M' `" a# v4 c# L4 P void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len) { unsigned char *ptmp=usbbuffer; 5 a( E( f6 o7 k, R2 G usbbufferlen = len; " ^. i& S) X1 f! n7 b5 G% x while(len--)3 ~5 s3 q0 i6 R {/ O( }; [% Z$ {5 `: h$ V: d *ptmp++ = *pbuffer++;* w6 a8 V& x6 f } } USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost) {* U. j: _ O+ q u8 S if(SendMechine==1) { SendMechine=0; USBH_BulkSendData (pdev, (unsigned char *)usbbuffer, usbbufferlen , , |: z$ p3 z& u7 J4 b myClass.hc_num_out); SendCount=0; while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0) {0 e% x2 ]8 h- s Receive_Retry--; ReceiveCount=0;, q+ R i' n* {5 B, { USBH_BulkReceiveData (pdev,& [9 |" ^4 `2 ~1 h: r+ H (unsigned char *)usbbuffer+3, 8 I7 H# l6 Y5 w7 o V 64, myClass.hc_num_in); 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自定义类开发