在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。 st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。9 \9 e# r2 f6 w 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。 在st官方usb库中,usb类是这样定义的: typedef struct _USBH_Class_cb' v. e3 `2 A' @* X {7 h( W J/ O0 g1 j# E2 i USBH_Status (*Init)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线& {' t) ]: {! T) \5 {& A void (*DeInit)\) B) x& b$ j5 Z# W (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源 USBH_Status (*Requests)\9 m* |/ M" @) e: G (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求 USBH_Status (*Machine)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 6 }3 ^ x1 [+ }& F4 m+ l* d } USBH_Class_cb_TypeDef;3 }" R% i3 ^: R) z6 R7 _ 那么,我们如果要实现一个USB类,就需要编写以上四个函数。& W! V% T, \! H4 X 下面就是我自己写的一个自定义类: 5 F4 ?5 H# j# m) `- W( H" H; U% B typedef struct { uint8_t hc_num_in; uint8_t hc_num_out; uint8_t MSBulkOutEp; uint8_t MSBulkInEp; uint16_t MSBulkInEpSize;% t& r1 L1 Z# k6 D4 E# P uint16_t MSBulkOutEpSize;' u8 q5 w) P- S% u }myClassTypedef;3 W* u! b9 x0 q' s5 L) ^3 r myClassTypedef myClass;+ ]- m$ F5 N, ^% E& _ * d8 ]3 f+ }8 S/ O$ ^ USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost) {/ b% y3 g3 V* [ USBH_HOST *pphost = phost; short myi;4 l T/ T( H9 `% T! `* L char Buffer[50]={0}; unsigned char status; sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces); LHLFont_DebugString(Buffer);: n- y7 z# o8 P4 Z$ p1 p! E for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)) Y2 r5 C0 Z- V% H: ]- {, K- i { if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)7 ~ T- x' L& x8 ~3 P { sprintf(Buffer,"接口%d的端点0为输入",myi); }" \1 a+ z4 a2 c) D8 M9 F else$ V* J: @ K9 `9 C7 ] U$ [, ] { sprintf(Buffer,"接口%d的端点0为输出",myi);2 y+ B3 J: h$ o% s }4 O8 B. v1 D: @- g( m# _" e& [ LHLFont_DebugString(Buffer); 0 F6 ?3 ~3 r' R. Z+ x sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,* @- Z; i/ V# Q; P pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);/ y; j' ?2 W3 {. Q" F1 ^ LHLFont_DebugString(Buffer);, H! i) y; p: J5 T& W % c3 ~, U5 u( H, Z8 R: v, r0 r* p / q/ N5 k" y& J8 _. |% O if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80) {! H# P5 M7 b2 z sprintf(Buffer,"接口%d的端点1为输入",myi); } else; b7 O0 P# `5 m- ^ r1 l { sprintf(Buffer,"接口%d的端点1为输出",myi); } LHLFont_DebugString(Buffer);" j: t/ y3 d8 z 5 F% V7 ]4 \6 ~3 E' W) v sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,& q u2 A% d0 v" J+ r, U5 l pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);. K7 S1 d) V! K+ P LHLFont_DebugString(Buffer); , }- E& u; l" U; B" g } 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;# H! ~" r: n; n8 G myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;, p- S; ?8 z. X8 u$ g 3 T$ K7 P m) @3 O! n+ P& Y# r9 _ myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp); myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); " q' R6 D1 _) W1 G0 } status = USBH_Open_Channel (pdev,% `9 B5 f" W# Y. t2 D. F' J myClass.hc_num_out,; R; g6 Z8 E2 @% f/ C pphost->device_prop.address, pphost->device_prop.speed, EP_TYPE_BULK, myClass.MSBulkOutEpSize); * s8 I$ \! n4 S) | if(status == HC_OK)$ k. j0 _1 W3 c& ~/ F/ p( v status = USBH_Open_Channel (pdev, myClass.hc_num_in, pphost->device_prop.address, pphost->device_prop.speed,! f* _; i$ }' z6 j+ r( w EP_TYPE_BULK, myClass.MSBulkInEpSize); if(status == HC_OK) LHLFont_DebugString("USBH Open Channel Ok"); 5 y8 @3 I1 b2 R( {/ x1 L Receive_Retry = 2; 5 _6 w/ d" s; X7 L$ g2 R- b return USBH_OK; }9 `, H' X/ T- H void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost) {9 D+ H. l$ ^: c0 g% S4 a if ( MSC_Machine.hc_num_out) { USB_OTG_HC_Halt(pdev, myClass.hc_num_out);$ c! O, U4 T, J USBH_Free_Channel (pdev, myClass.hc_num_out); myClass.hc_num_out = 0; /* Reset the Channel as Free */) @' c& ?- `8 s } p( a! z. ]) r3 ^7 E9 Y: S # X. ? I$ t$ @# } Q4 T if ( MSC_Machine.hc_num_in): ?; J9 | [# l/ Y8 s7 L {5 N/ j/ d' N/ r2 T; e* { USB_OTG_HC_Halt(pdev, myClass.hc_num_in); USBH_Free_Channel (pdev, myClass.hc_num_in); myClass.hc_num_in = 0; /* Reset the Channel as Free */ e( x" l/ J; } } 0 |6 t' h3 R) C% a3 k }6 O! H; C! y+ J+ z, j USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost) {! f6 a9 P& ~/ J6 c8 |3 J7 [! e2 r return USBH_OK;" K6 v9 a2 ~& S }7 A4 m, [7 F) v8 G# g4 k- O unsigned char usbbuffer[70]; unsigned short usbbufferlen=0;) ?( i6 R2 N: Z" u5 p _1 N ; d7 e$ q: z9 y1 \8 g5 } unsigned char SendMechine = 2; int SendCount = 0;* A+ h$ U6 b: o8 H4 P: e ' W; H+ x) B# I, M' |2 I! w unsigned char ReceiveMechine = 0;8 c$ l5 H, a% R3 I. E6 Q& ` int ReceiveCount = 0; unsigned dataReceived = 0; void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)/ Q; i# O" \0 i! v% _1 y4 n { unsigned char *ptmp=usbbuffer;, t2 m& p- \$ |3 b8 {8 Q9 E usbbufferlen = len;- I- n, W* z! \: e( C- j% I while(len--) { *ptmp++ = *pbuffer++; }6 k9 j$ x( g5 t% t* q4 Q } USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)8 M( u; }7 ?& }- a* F { if(SendMechine==1) { K, T7 U% L9 D8 w SendMechine=0;% z0 j5 l! ~, r/ j USBH_BulkSendData (pdev,9 U' f/ q3 N0 n. G (unsigned char *)usbbuffer, usbbufferlen , " K+ F; F& c9 l myClass.hc_num_out); SendCount=0; while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)9 a% o( h1 b" A5 N- h2 u6 t O, ^ { Receive_Retry--; ReceiveCount=0; USBH_BulkReceiveData (pdev," c3 H7 y! T1 c5 r m+ \$ e7 t4 ]. T (unsigned char *)usbbuffer+3, , W3 D% p+ X8 x- D+ x 64, myClass.hc_num_in); & e9 g' [, ~4 B4 u 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自定义类开发