请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【MCU实战经验】+stm32f407之usbhost自定义类开发  

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。* ]6 X1 U& n$ k; Y# v
st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。* Y5 N' o# y+ X: w
对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。
# G3 O5 V, d6 @2 s) \& y! J4 }在st官方usb库中,usb类是这样定义的:
" Y# y9 \; X% W& O9 D( T
1 w- t$ |  F, ptypedef struct _USBH_Class_cb, }# l6 d! t9 U' l" g1 N! D. _( Y
{
* U/ V& N( S( T! |$ S. z. t  USBH_Status  (*Init)\
) ?" w) r- X2 Z9 V    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线
) Y6 z/ x! _# \4 N1 l  void         (*DeInit)\/ j9 ?; u& L6 L3 h9 f! \) r
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源8 i5 o$ K* g* U9 }* P
  USBH_Status  (*Requests)\4 c! K" _6 Z6 m7 V( X3 G4 u
    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求/ D$ u% s( s1 H! R& j
  USBH_Status  (*Machine)\; ^, D$ L4 R' x
    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程    , c* ~; z. T0 H* C$ @  w. K
  
( h4 Z, ?( o' e& K/ ^# |} USBH_Class_cb_TypeDef;- r% q0 q" A& ]' o; Y" t% c4 U
那么,我们如果要实现一个USB类,就需要编写以上四个函数。( u1 F2 N6 ?  V4 ^; h
下面就是我自己写的一个自定义类:
' N# `1 Q7 g3 S3 ]0 n
2 ~& [9 ^  Q5 c9 htypedef struct
# V9 |' Z2 ^1 g( l" s8 Q{
2 j0 f# C- b# r1 s, I8 W# s  uint8_t              hc_num_in; : D# d; @" V  L( i) ]( j
  uint8_t              hc_num_out;
# m' G! b7 y+ V3 s* B6 ?  uint8_t              MSBulkOutEp;
/ Y( s) _$ I4 W" ]* J+ [  uint8_t              MSBulkInEp;
# p8 P. K; x3 K, I  uint16_t             MSBulkInEpSize;4 c7 P7 z; j! q
  uint16_t             MSBulkOutEpSize;
4 |  H$ b* b( ?: _* n: l# O% `}myClassTypedef;
3 F5 A. Z$ j' D, |7 k* CmyClassTypedef myClass;4 }* m+ f* y3 M; {+ _0 A
% n7 A9 C& y  }$ E0 m- Z; t
USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)' z8 D$ [6 }  Q' C/ S6 `6 M4 ]
{
; k/ ?6 T9 C1 h0 T: \2 H8 k+ J        USBH_HOST *pphost = phost;
5 `) n- B9 `. m* R2 J8 L        short myi;
3 f2 E6 O  u; A( \+ _2 J% W        char Buffer[50]={0};9 X" Z- w! \- {# g, z3 @3 z* `9 L
        & r4 v  p- c) y3 L
        unsigned char status;
) O* W' f& M+ e  S# b/ `5 p3 \        
8 Y# x, c/ D: z( l/ @. i  i4 i        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);
6 w  c3 H3 N6 i" j& g        LHLFont_DebugString(Buffer);2 O& T* i( l  A; ~# F6 E
        
" e; Q- o1 S5 P        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)7 ]+ ~9 _. G/ k/ {: z* `) q
        {
6 ~4 K) K: h# l# L4 S- l" i                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)
8 t  `7 `- J0 h; [  L                {% ]; g7 C0 p; l, n% b& {- M
                        sprintf(Buffer,"接口%d的端点0为输入",myi);
, H& m2 I& B( ^                }
$ @( ]& |* N0 J* f& F& T$ o                else
- U: e6 x) P- \6 f: [  c) b0 `# U                {
* j) `6 o: K% Q; |& b. T                        sprintf(Buffer,"接口%d的端点0为输出",myi);
5 u9 U. Q# z4 Q, t0 u                }3 z  l5 o% j# x( W  H
                LHLFont_DebugString(Buffer);* c1 a6 l$ D% S
               
. M3 w$ |8 l! I$ [0 H0 f                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,$ N8 V; I! @* P( F5 N
                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);$ W, c" N% U; @3 U5 O6 U; b
                LHLFont_DebugString(Buffer);# }: L' k/ c  n2 j: j
                6 W1 e& l' U8 x8 `0 E
               
% W& z- b% _2 {: C                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)
: _+ V4 ?! m: G8 O/ ~                {. {7 O7 s0 n" V* K: o6 o5 k8 Z% C4 w
                        sprintf(Buffer,"接口%d的端点1为输入",myi);
3 q4 ?, X; V' |7 E, Y                }) v; v- ?; X( e4 F& Y
                else5 v+ X/ h9 Y& S( n) W  K$ `& j- M
                {( I3 h) Q+ {8 c6 [; R& Y
                        sprintf(Buffer,"接口%d的端点1为输出",myi);$ a" T5 w' b. u  A- n# m2 O; v# j
                }
5 z! v# R( u# y% \                LHLFont_DebugString(Buffer);# J7 m6 r7 _& r4 o7 R8 V: P

* ?) z$ e& I1 D! W5 a1 |( m                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,. g# g2 u! o8 b
                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);
% s0 q- l; v5 ]2 e                LHLFont_DebugString(Buffer);        6 [, U6 i! ^3 u4 m3 n; t2 E
  }8 k+ R; s- e$ _. G% f
          # K& g* F8 |& H. Q! w2 P+ v6 V
        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;6 _% t2 s1 m, B* k8 M* Z
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;
, G/ t; c" c3 @; z% v        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;
+ l' E  ]2 `6 O* u0 C6 V+ Q        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;9 \: H3 n7 L. i" m9 m* j; d+ [
        
, t4 V: }7 F* z  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);
* _, ?9 {# q& H  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  " R6 Y0 [6 H( l5 F. E! T6 f
  * w; S. x) Y, ^" A. k
        status = USBH_Open_Channel  (pdev,; ^- R7 u8 L  o5 K
                                                                                        myClass.hc_num_out,
5 T1 s) C7 y' z( |( P& q                                                                                        pphost->device_prop.address,
# }  s/ G: f9 u9 G; S/ X# z                                                                                        pphost->device_prop.speed,) L$ M8 B* Q- s' t0 H; P; ^- |% \: ~
                                                                                        EP_TYPE_BULK,
; M6 V4 p  [5 G1 j; O4 @7 |* t                                                                                        myClass.MSBulkOutEpSize);  
9 J8 w: P: P3 n! D. t. @        if(status == HC_OK)
8 l. h6 R4 E6 E6 G$ h4 j        status = USBH_Open_Channel  (pdev,
5 [, q3 @, Q: C                                                                                        myClass.hc_num_in,. c. `9 s" }$ M; `/ R4 i& x
                                                                                        pphost->device_prop.address,# P  g1 H; O. [! k. r2 T; R, E" r$ t
                                                                                        pphost->device_prop.speed,
9 S- @) k& r; L4 l6 Q7 O* U1 ~                                                                                        EP_TYPE_BULK,
& w6 w3 w: p% j# j                                                                                        myClass.MSBulkInEpSize);
3 E5 R) t# J& O, c  d        if(status == HC_OK)2 m( g+ R' D( N
        LHLFont_DebugString("USBH Open Channel Ok");. a* l6 D$ d  I. O* z% f8 ^
        
) `6 o4 t( M. d4 ?( [        Receive_Retry = 2;
6 N) s* I/ d0 V; D. U/ r        
2 Y$ J/ p4 m# \5 l4 \0 n        return USBH_OK;                                 
: m0 E; {7 e! K8 E( ]}
- l! d# z9 ^4 T+ r5 ?            
2 t3 A( C0 j: `# r& j! e$ }. qvoid DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)/ D1 Z* f5 F' B# o5 ?# Z
{3 j) b5 v( t) `" k
  if ( MSC_Machine.hc_num_out)3 n1 d, A+ E2 ~  R0 H3 i
  {) m% U5 s/ {9 N) i  A
    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);
# u( {) v" M8 k( {- H+ X- Z* y    USBH_Free_Channel  (pdev, myClass.hc_num_out);. N. h% f& S  ?+ ~7 v# V
    myClass.hc_num_out = 0;     /* Reset the Channel as Free */
$ _2 b6 a  u3 T1 {, P  }6 N0 }3 i; o: G, D6 l7 Y+ C) ^/ I
   
2 e' J) R% \9 X- D# z! x6 m  if ( MSC_Machine.hc_num_in)
- k& l2 E3 t* i: y; V1 N6 w  {% w# F! {- K" E1 ]
    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);
1 ^' N; G, `/ m' [$ k    USBH_Free_Channel  (pdev, myClass.hc_num_in);
, \. y& k7 z- w    myClass.hc_num_in = 0;     /* Reset the Channel as Free */
) p- I! `' ^: J! y* P  }
& [' z7 {# J3 V% J8 M& K}
3 s; Q# ~0 S# j, xUSBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)
5 y; f  `5 h3 u! {" U$ A) k{( e$ E; |' c; N  o
        return USBH_OK;+ N7 Y* s. Q$ e3 y) o( n
}
5 l* a; I2 b( m' P' K$ {unsigned char usbbuffer[70];
+ `& `. P' }5 Y1 Z4 o! hunsigned short usbbufferlen=0;; V' h6 k* D9 F5 B
9 I" ]! B$ Q) J. `. Z6 d
unsigned char SendMechine = 2;
! x  J: J5 a/ p; o* Uint SendCount = 0;
6 G5 L) q9 B6 ?2 f4 ~5 w7 n7 n" ^ 2 F' `* k- u( N# F+ [* O
unsigned char ReceiveMechine = 0;
0 f. Y- ?) U. g( Yint ReceiveCount = 0;0 {4 l9 G8 w( j+ ^2 [7 z
unsigned dataReceived = 0;6 y5 v' ?, r2 O) g
' k* a/ B) ?# N3 L# d9 E" Q
void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)/ w: j/ q% q' \1 |" e0 b5 z, |
{% z3 J* H6 D! B+ D3 I' o
        unsigned char *ptmp=usbbuffer;2 b9 Z: ~9 e2 L! l# Z2 Q! Y/ _$ z
        
' \. e4 p: Y  G+ H        usbbufferlen = len;0 K/ N) F9 o$ F% [8 p
        
2 |; p" L, Y) [' j) c! {        while(len--)
! Q$ Z; x( ?: _4 c" i9 f        {
1 N' |1 @" A* F8 G/ i  h. T8 T. A                *ptmp++ = *pbuffer++;
+ [; _4 z* k4 d6 V8 l9 E        }, ~1 N4 a( N+ Z8 l
}( e& [. |* h# r
USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)9 p$ w  |! t$ T  k
{
4 O. w2 q3 C' [        if(SendMechine==1)
  O7 d1 D, f3 Y        {; `) E4 U! g; a" p
                SendMechine=0;* X$ \/ m: O1 `- U) ^
                USBH_BulkSendData (pdev,
8 A. c& K8 q; J, \* W% O2 P) ?                                                                                                 (unsigned char *)usbbuffer, + J5 b  {( N9 e" [
                                                                                                 usbbufferlen , 5 E% e  o- j9 e4 o! p
                                                                                                 myClass.hc_num_out);+ R3 ^+ N0 v) R- A2 l+ Z+ p
                SendCount=0;
, [# N' O% p' I# E9 K9 _( {4 Z4 @                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)( L" V7 f4 [( M! h. K* }/ H. H
        {/ n% D8 K# {0 U4 E: L
                Receive_Retry--;  Q2 i6 N1 F5 u5 @+ j4 D) h) q( M
                ReceiveCount=0;& A  f2 V. E$ M3 P! x6 C
                USBH_BulkReceiveData (pdev,2 ]" _( ^- V- M* }" V: I( F' k
                                                                 (unsigned char *)usbbuffer+3, ) ?* S7 v( c' k7 Q  q
                                                                 64, 6 x& G: R7 V2 y6 _/ |- T! P
                                                                 myClass.hc_num_in);- P) F. c) W* i
, w7 \+ S. M7 x% L8 R8 I
                while(HCD_GetURB_State(pdev, myClass.hc_num_in) != URB_DONE &&ReceiveCount

自定义usb类.zip

下载

2.03 KB, 下载次数: 1199

1 收藏 11 评论53 发布时间:2014-4-1 12:30

举报

53个回答
bwsz 回答时间:2016-12-21 16:49:24
heiheiaizfx 发表于 2015-4-24 21:31
  @$ S, S7 [/ |5 M# \您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...
, e" g3 |; S% r) I$ A/ q/ Y/ L" G
请问下 您的3G模块驱动弄好了吗  能发一份给我参考下吗?我邮箱是bwsz.1@163.com
770781327 回答时间:2014-12-31 17:26:20
你好,我最近在弄107的host,目前可以进入自定义类,现在我想给设备发送数据,我知道得用USBH_BulkSendData(),但这个具体怎么用呢?我没用scs,也没用fatfs。应该得用USBH_BulkSendData,但具体怎么用求指教!!
chenjian1989 回答时间:2015-4-24 21:31:28
cn99788 发表于 2014-10-13 09:194 g. c0 u" i9 L0 ?
开发3G模块的项目要用到这个,不错

6 i: ~  x( S% J您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程序给我,谢谢。
鼻儿眼睛花 回答时间:2014-4-1 12:53:42

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

这个坛子火热程度不够啊,精华帖子太少了。加油吧,大家把这个坛子做的更有活力。
stm32f103vc 回答时间:2014-4-1 14:38:13

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

不错,帖子很有条理,有借鉴意义
froxy 回答时间:2014-4-5 23:17:36

回复:【MCU实战经验】+stm32f407之usbhost自定义类开发

楼主很厉害啊,
benten22 回答时间:2014-4-6 00:22:24

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

好想搞USb就是还不会
isi408 回答时间:2014-4-15 10:51:55

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

期待中,正在开发这个,呵呵谢谢楼主的无私奉献!!!
回答时间:2014-4-25 15:54:26

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

谢谢分享,辛苦了!
kinetis-425530 回答时间:2014-5-6 17:44:25

回复:【MCU实战经验】+stm32f407之usbhost自定义类开发

支持,顶顶 
zxm_auto 回答时间:2014-5-27 14:49:46

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

支持,顶顶支持,顶顶
yaoohui 回答时间:2014-6-7 15:42:16

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

简单明了,支持!!!
正点原子-122954 回答时间:2014-6-15 19:48:59

回复:【MCU实战经验】+stm32f407之usbhost自定义类开发

谢谢分享......
freeman9507 回答时间:2014-7-7 23:20:17

回复:【MCU实战经验】+stm32f407之usbhost自定义类开发

学习学
zttx 回答时间:2014-8-12 22:44:03

回复:【MCU实战经验】+stm32f407之usbhost自定义类开发

不错,正是我需要的,
laoluovip 回答时间:2014-8-14 23:22:07

回复:【MCU实战经验】+stm32f407之usbhost自定义类开发

 正在调试,多谢分享!!!
mcu猎鹰 回答时间:2014-8-15 10:41:35

回复:【MCU实战经验】+stm32f407之usbhost自定义类开发

很好的东西 能下载吗
1234下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版