在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。 st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。/ M# `, p( m: S0 O2 e; d5 y- v2 H/ C 对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。 在st官方usb库中,usb类是这样定义的: $ t6 _ B. y7 p" g2 F$ d- U/ c typedef struct _USBH_Class_cb" m: Q7 g: A2 m4 n { USBH_Status (*Init)\3 _. x3 E( ], A8 @6 D2 Y/ X" \' e& W (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线5 b3 E7 K5 r% Y void (*DeInit)\ (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源 USBH_Status (*Requests)\ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb类请求 USBH_Status (*Machine)\; ]- g- L8 D" S1 |& Q# @7 _ (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程 , W( w3 Z- H& q; |* V! C } USBH_Class_cb_TypeDef; 那么,我们如果要实现一个USB类,就需要编写以上四个函数。+ \' ]5 X1 u0 ^9 G, _8 ? 下面就是我自己写的一个自定义类: typedef struct {3 p/ J# P2 }! v) L, f uint8_t hc_num_in; |0 d" V* M4 @- L' P uint8_t hc_num_out; uint8_t MSBulkOutEp;2 V8 ^! R+ ~* u( c+ d$ o uint8_t MSBulkInEp;8 e( B* r/ ~, l& @ uint16_t MSBulkInEpSize;& D0 w; M" G. N' ~/ ~2 @; L uint16_t MSBulkOutEpSize; }myClassTypedef;7 a5 B& K. ~# ]$ `) a9 p& |$ ^ myClassTypedef myClass; USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost) {2 [) ?2 {2 Z0 h3 E USBH_HOST *pphost = phost;) @: ?! h' j1 S5 `# A/ ~+ W7 @+ Q short myi; char Buffer[50]={0}; ) I; N9 n3 |* X' S unsigned char status;+ n( i: i6 C$ i, S ' ?, c) }- R5 J) `/ d sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);! F3 k/ s, [' v) Z; |' ?( _0 [ LHLFont_DebugString(Buffer);- N; {0 s2 p0 c& m' W9 b. y8 p for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)& k0 e6 B H0 W. L' z { if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80). a! n/ ? @8 b! a {1 ^6 A6 T( W) ~' ? P2 b sprintf(Buffer,"接口%d的端点0为输入",myi); } else- \( n6 o! z/ W# x: z9 T) C {! t; a& u& K o sprintf(Buffer,"接口%d的端点0为输出",myi);/ q2 z) V. `. Q# ~ } 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); if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80) {$ P W1 r1 u+ l9 M8 H6 h/ u sprintf(Buffer,"接口%d的端点1为输入",myi); }7 @ G$ j3 F1 p, \* U else {4 [& u& ^. o5 L sprintf(Buffer,"接口%d的端点1为输出",myi); } LHLFont_DebugString(Buffer); . _* N, a& G% a 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); LHLFont_DebugString(Buffer); " P7 w- w! m4 | }& U5 }$ z" L+ L( n . o' A# y- e3 }# T( Y$ H myClass.MSBulkOutEp = pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;* e6 j7 s' h) o/ w0 F8 c) a# |9 { 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;7 N) ^- Y6 a; ~( y8 i7 E/ y , T" ^* D+ [! m* }- y( J! l% ?9 r myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp); myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp); # V; o2 R$ Q( C4 L+ v: n status = USBH_Open_Channel (pdev,7 B/ J* H# m9 X+ U, j myClass.hc_num_out, pphost->device_prop.address,3 p" n; ?# O5 \; O; k' s* L pphost->device_prop.speed,7 H; M& z& N& ^! L8 b+ _ EP_TYPE_BULK,# }4 |- G9 v" S# s; S' { myClass.MSBulkOutEpSize); . M8 R' Y! V) T/ S- T! }$ o8 i if(status == HC_OK)4 M; n3 P. ?: `6 n! X status = USBH_Open_Channel (pdev,& P' G/ w* N, l/ `, v$ e myClass.hc_num_in, pphost->device_prop.address, pphost->device_prop.speed,) a( q1 T; o5 y+ y6 _' X. M+ c% T EP_TYPE_BULK,+ e- {% s! m$ ^% G5 p myClass.MSBulkInEpSize); if(status == HC_OK) LHLFont_DebugString("USBH Open Channel Ok"); K, O9 D& _' F% B Receive_Retry = 2; 1 }) M/ \4 o% d) D8 \, h return USBH_OK; 4 V4 ?0 ]8 H/ M }2 j- d! ~. o# v# q3 [ : c2 H1 V: q; U# v void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost) { if ( MSC_Machine.hc_num_out) { USB_OTG_HC_Halt(pdev, myClass.hc_num_out); USBH_Free_Channel (pdev, myClass.hc_num_out); myClass.hc_num_out = 0; /* Reset the Channel as Free */ } if ( MSC_Machine.hc_num_in)( U; {) d9 g% F% u { USB_OTG_HC_Halt(pdev, myClass.hc_num_in); USBH_Free_Channel (pdev, myClass.hc_num_in);8 |, z: \3 ?: @/ F4 V5 f; i; j myClass.hc_num_in = 0; /* Reset the Channel as Free */ } : z9 a9 _8 g5 l1 K. P% S } USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost) {. |7 P. M+ P, Q+ ~ return USBH_OK; } unsigned char usbbuffer[70]; unsigned short usbbufferlen=0;" F3 z. P& C0 [" W5 x' r& @ # G O+ R G: W4 U unsigned char SendMechine = 2;; O1 }8 ^; {9 c9 B2 S) u) N1 P int SendCount = 0;6 U, K# f8 X* H 9 l( A% A$ J' {$ T0 Z' G8 S3 G unsigned char ReceiveMechine = 0;' |3 ?6 _1 o1 b, P, H int ReceiveCount = 0;7 ~, Q! J4 }2 U0 w unsigned dataReceived = 0;: T; Z+ c) d# F: q7 ? void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len) {5 Y n( N6 h) h9 b" T unsigned char *ptmp=usbbuffer; usbbufferlen = len; 4 B) S( D+ d) H) ^" v% g3 s7 P8 [ while(len--)! f; Q# F0 X" D9 | U$ e6 ^ {; q) ~! p/ s2 a' U8 ~: y9 m *ptmp++ = *pbuffer++;: C* c- _7 ^( ?# Z/ N$ M3 h }! L8 G. D: g( ^2 N0 V0 X } USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)6 X% u0 H+ }' ^ b; i6 E { if(SendMechine==1) { SendMechine=0;- D( O; O3 ?9 L" D/ a# }0 ] USBH_BulkSendData (pdev,; Y; \9 A5 R1 Y2 ^! ? {3 H (unsigned char *)usbbuffer, usbbufferlen , myClass.hc_num_out); SendCount=0;$ p( X+ l1 l+ _$ e( I- ^; [- b while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)$ m9 c; y( m) B* T' B4 U {/ C' R+ V& o1 C2 c Receive_Retry--; ReceiveCount=0; USBH_BulkReceiveData (pdev, (unsigned char *)usbbuffer+3, 64, A& a' U2 |; p% @$ C5 D$ q6 Y myClass.hc_num_in);7 C d3 d& m9 w6 t V5 f! r5 F" { ( a0 l' K) F3 O8 J# P% n1 w 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自定义类开发