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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。$ b5 |) ?7 G4 Y% n" @' g
st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。
& w8 m( H3 J! r对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。
$ @% l. S  @- i9 C在st官方usb库中,usb类是这样定义的:9 _/ x3 E; H2 S- [

3 R: w/ {1 X5 ^  \9 t, H8 Ptypedef struct _USBH_Class_cb
$ _! G, c: M) |% p7 o# J4 e# @# k{( h. i4 X- u5 ]. L0 D
  USBH_Status  (*Init)\: _6 f$ r4 ?. {4 q, o
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线/ S4 ]# T8 `- W; \
  void         (*DeInit)\
) ?' V7 w* B5 ?0 O. e    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源
) V  s$ q+ @/ ?, L: c: _0 @( m  USBH_Status  (*Requests)\
! [. W- Z; V5 }% [7 R3 @    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求+ U, M6 X/ M* g  j
  USBH_Status  (*Machine)\
3 G% b4 m; b4 [; |4 K4 P  N3 I1 R    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程    : f4 {9 V, Y% h' q/ b* J
  ' h3 _4 i+ H/ ]
} USBH_Class_cb_TypeDef;
$ E$ u) d- r( ?! N1 E9 O那么,我们如果要实现一个USB类,就需要编写以上四个函数。
. p; t1 G! m$ i: X( z' y* L. P, E下面就是我自己写的一个自定义类:9 o$ o  z6 N8 Y! K8 \1 j: U( j, w( O
( y, _: Z# ?$ d0 A
typedef struct
' S1 e, f3 \' t) x{
2 `" l/ e9 O% z3 J5 e6 }# ]  uint8_t              hc_num_in;
  n7 d" w8 O  K5 \/ c: V/ N  uint8_t              hc_num_out;
7 y9 o% n$ X0 c$ H- c5 `5 b* P- q  uint8_t              MSBulkOutEp;
5 h$ B* n; _  A5 }; w: T  uint8_t              MSBulkInEp;( F1 b5 c7 w7 o# l$ ]6 b; J$ S
  uint16_t             MSBulkInEpSize;( T& x0 B% d4 \. T+ g/ e
  uint16_t             MSBulkOutEpSize;: i' v7 @% O1 S: u/ k( S) s- C, I0 T
}myClassTypedef;) _8 }. z: {& j
myClassTypedef myClass;
! k) n/ p; g% i$ w2 L' Q # t# y; R# X! ~/ K! g- K3 O2 V( k
USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)
; U2 @  }$ V; v4 [: }{
/ R, y" O6 Q2 Q. Z, z6 }0 ]7 @        USBH_HOST *pphost = phost;4 `$ S, n/ z. X$ N' m  A# b7 R
        short myi;
! ~; ~( b; w0 y        char Buffer[50]={0};
7 d7 T4 [6 T5 x* {: V        . G! F( D' W. A  K1 w: a2 J4 i
        unsigned char status;/ D$ [6 L8 A/ J6 v
        + b! V+ G  b! p! p$ m
        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);8 B4 y3 E3 A7 {2 c
        LHLFont_DebugString(Buffer);
  Q1 ~/ {$ Z) ?2 i* ~; E! f        4 _( g2 D: K4 ?! g
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)
- {1 a8 u. P, G  b        {
" L+ J8 v  I, C                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)
# h( a" Q  Y) N# z+ G                {
) f) X9 c2 i* e& w0 t5 T                        sprintf(Buffer,"接口%d的端点0为输入",myi);
" ?4 K  c% a# ]7 b                }
. r; d% j- O  F- }                else
9 v0 p/ _$ l! [5 v& {8 A5 y2 \' |" u7 q* g                {
5 n7 q! ?) l2 |: T) @( P                        sprintf(Buffer,"接口%d的端点0为输出",myi);' ]$ ~( ?* o! B& V3 q6 X. H& [
                }3 @. L) V; {% H: D
                LHLFont_DebugString(Buffer);
9 b. w! G/ b! G; X  z               
6 m1 B( T: x  g                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,, I. z4 k7 a$ C' L
                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);
: A1 g, c1 k$ o8 h3 ~                LHLFont_DebugString(Buffer);
9 w9 b; c8 J( ]$ l  h& u5 z               
! F; J( Y# _" F  n- W1 x                1 Y: T7 j$ L' ~; S4 }9 `! l
                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)" a) e+ h7 O) `
                {" C) @5 q7 @6 K6 i' z
                        sprintf(Buffer,"接口%d的端点1为输入",myi);
7 N! f- z! h1 D+ @  _                }
3 Y8 j1 T8 I: a( S) Y- t; f: E0 Q                else
. F! D# u" X3 a* c7 ]2 |/ |                {: R8 M; g7 P4 B' A- I+ D) L+ S
                        sprintf(Buffer,"接口%d的端点1为输出",myi);
9 a9 }9 ~* o  n0 C4 ?# Y' U/ h2 @                }
  r- G( d3 _* D* f# ]* I! t                LHLFont_DebugString(Buffer);7 v- m' I. S9 D

* f& v- J0 g1 k- C                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,
6 {! _* G! P7 T& j; N* t1 V/ T0 ~, d                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);9 o5 F) L4 i+ H: d6 _8 h5 {
                LHLFont_DebugString(Buffer);        
& z8 X  a0 U  `) y& S5 H  }1 S! r' h7 X& s( J- ?
         
- {+ ?$ y5 F. k3 l4 t        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;
/ v; Z2 ?6 G# c) {( |        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;) v& E2 S2 `; c4 A
        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;# [% {- T6 E4 t# N
        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;
8 P9 b" V" x1 U( ~        7 M) Q' X* }3 ^  U( a: O5 S
  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);4 O; O- Y* O$ c' u1 F
  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  # l9 G5 d' k0 K1 F7 |5 f
  4 Y! o. W: ~+ U' }4 Z( X
        status = USBH_Open_Channel  (pdev,  p) o& C; s3 b
                                                                                        myClass.hc_num_out,
9 @  n) T1 n( z, l                                                                                        pphost->device_prop.address,/ Q3 C/ Z9 {7 ^/ {% Z
                                                                                        pphost->device_prop.speed,5 X9 W- l: ?* H
                                                                                        EP_TYPE_BULK,
. `0 @' x+ o$ B+ H8 z                                                                                        myClass.MSBulkOutEpSize);  2 h1 P! N9 G- Y) O
        if(status == HC_OK)
* {: K6 N0 ?% C* p. }( n9 ~        status = USBH_Open_Channel  (pdev,
* Y. [2 P8 P+ ]7 i% g0 e                                                                                        myClass.hc_num_in,. f; {( |2 x  s" G$ [. D+ r! l( x0 T1 @
                                                                                        pphost->device_prop.address,
7 r  H0 d1 W" A' Z' D+ z                                                                                        pphost->device_prop.speed,
/ W. R; ]" u. X) A7 J# M+ k- o                                                                                        EP_TYPE_BULK,
! d' H: R) c: M5 T3 O6 J                                                                                        myClass.MSBulkInEpSize);
5 N' Y, j5 c5 U1 }$ ~5 I( l' N        if(status == HC_OK)
2 Q- l+ S: c; y        LHLFont_DebugString("USBH Open Channel Ok");: g6 o2 d: C6 @! G' Y0 z! r; U
        / [; p% V7 {1 K
        Receive_Retry = 2;
" X( E- c. Z4 P4 m" y3 z        0 c2 X0 t) P6 n0 F
        return USBH_OK;                                 
. U8 F, `- H0 U}
/ w( Y' d8 @& h9 R( G* j0 X5 s            
( X6 N0 ~3 Z+ g: ?$ }; \+ Gvoid DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost). x$ p! p6 h0 A2 l6 ?
{
6 G: U  \% G: V% d  if ( MSC_Machine.hc_num_out)8 j, i6 s+ a% ~5 t0 o2 u5 S0 v1 X
  {/ W6 p$ i' t; r( _  `0 n& ^! y- a2 X
    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);
) W$ `: g( A( W( K' [0 K- V- S! n! n" g    USBH_Free_Channel  (pdev, myClass.hc_num_out);4 J! d3 Z1 o2 e4 _  [
    myClass.hc_num_out = 0;     /* Reset the Channel as Free */
) k9 U& ?" E, ^  g1 O$ O  }
- U+ E: @# B& |* B( m% Q& Y* K) U   
4 g# w3 A+ q9 J% S9 Y  if ( MSC_Machine.hc_num_in)* l1 g* @) s# M2 \5 |  R* B
  {0 t% O. d+ A2 d2 ^
    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);: Y1 E/ w  l' ^- h  N$ X
    USBH_Free_Channel  (pdev, myClass.hc_num_in);
- t- a8 ^# {/ u. a3 x    myClass.hc_num_in = 0;     /* Reset the Channel as Free */, [/ _  l9 v3 ^( i8 l
  } % z5 D2 I6 y) m  y9 L! l6 |
}
) r" ]- e5 m" Q5 O/ z' K) n5 A% SUSBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost): ^, ]% {, D: {" K* X$ v# L
{' h; F1 i8 i. C7 r
        return USBH_OK;0 }' b  T  s/ {6 |
}
% t3 j. f" B) A) v2 R) q8 m8 ^; J, L, ]unsigned char usbbuffer[70];
( g! a' Y+ V5 ^, Zunsigned short usbbufferlen=0;
) E5 a/ y: U- ? ! c& W+ i: {3 w. c: ]4 r2 f
unsigned char SendMechine = 2;
1 w. M: ?8 N) B' V7 [8 hint SendCount = 0;
7 N( {/ l5 o8 G 4 F1 X9 H4 [, }" a$ m+ }* [1 t
unsigned char ReceiveMechine = 0;& M: U5 s0 o7 M% N" ^
int ReceiveCount = 0;
1 O7 _& t3 Y' Hunsigned dataReceived = 0;
4 M- O  G, w2 Z( K
2 k& I" I# x- s  qvoid usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)
. @" a" A) E* t; \+ r& D{
% K  {" r+ R$ B% D6 s6 [& W        unsigned char *ptmp=usbbuffer;
) A+ i3 e2 T0 w% ^, {+ e$ e        & \" ?- s( N: V
        usbbufferlen = len;
1 f0 Q$ |& c" {6 I$ n& y" V        
1 b% m3 _. x9 I7 \1 I. x        while(len--)3 r  Z' O  `+ Z. }' C
        {
/ m, `, F- o" r: Z. u                *ptmp++ = *pbuffer++;+ }+ }+ w( k0 X
        }
7 f7 l8 m' l, w7 E/ [}
# m5 p! k: b8 x! Z# P- ?USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost): P8 J6 q9 G# _: V
{$ [, }7 v# l# F; ]# d: }% J: U8 J
        if(SendMechine==1)4 Y- P2 V- Y/ d! {+ u
        {5 h! u3 e! P' T7 q: b2 @
                SendMechine=0;
1 W! G3 J) K4 G! ^; ~! N; }                USBH_BulkSendData (pdev,* F* b: Q7 m0 b" \+ d# P5 I
                                                                                                 (unsigned char *)usbbuffer, 8 m0 E. T: ?2 j# X/ l
                                                                                                 usbbufferlen , 3 {* H/ T3 T# U* H0 I' D" p
                                                                                                 myClass.hc_num_out);
) E2 E. l# z! I7 S9 G. j6 f9 Y                SendCount=0;
7 S% ~* c: w* t1 \3 q                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)+ \) n  J3 l1 |# P
        {! }2 u4 P3 {8 N( A' H# l
                Receive_Retry--;
( {2 M2 x) c- [6 T# t6 \2 e                ReceiveCount=0;; N7 w; ^& t1 Y4 N
                USBH_BulkReceiveData (pdev,9 F+ [1 e1 i8 p2 v) O
                                                                 (unsigned char *)usbbuffer+3, ; q- @7 V3 E" |/ H; @! F
                                                                 64,
0 J0 k7 j& X% _5 g                                                                 myClass.hc_num_in);
% k+ q! ^2 j  c- v! m' |  f1 F/ X: H: m- F& ]) R1 {2 b2 |3 r4 g& Z$ j$ l
                while(HCD_GetURB_State(pdev, myClass.hc_num_in) != URB_DONE &&ReceiveCount

自定义usb类.zip

下载

2.03 KB, 下载次数: 1209

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

举报

53个回答
bwsz 回答时间:2016-12-21 16:49:24
heiheiaizfx 发表于 2015-4-24 21:31
0 G: S0 o5 P$ r1 o4 J! j您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...
# A- M! h2 P1 b& |
请问下 您的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:19
0 q" J/ z" d% w& e# T3 B/ b0 H# \开发3G模块的项目要用到这个,不错

  R. v2 I( e% P2 Q6 A$ I6 b您好,请问您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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版