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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。! H5 }: ]; `* y# H
st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。
- a0 w0 m" Q0 B0 N% e; P& r  Z% P对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。
6 Z5 ?8 h$ }, n在st官方usb库中,usb类是这样定义的:
) h! E9 e6 t# ^  ~( J* p" `3 O
" K; y4 V& Q9 n5 R* a4 \6 Stypedef struct _USBH_Class_cb& |: s! C: ~- K# F
{
- O% P" ^' C1 i. T  USBH_Status  (*Init)\
* l1 t- L/ b* u6 v8 }. d    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线5 j0 i- ~) }8 S' w) M7 W
  void         (*DeInit)\
  {5 C! u" _: n3 n) k+ }    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源* {7 K' ]& u  r. _2 j/ q4 {+ J6 u- z
  USBH_Status  (*Requests)\
& O- Q; k4 c6 ~: s) l    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求
$ ]* {+ r/ U% `0 H9 n1 a  USBH_Status  (*Machine)\
- }. N2 K3 i4 W/ V( x2 `' L    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程    ; t; A4 a0 q" T# T, c3 q5 j
  , `3 a$ Y% d7 }: w" R; |
} USBH_Class_cb_TypeDef;
& }* h# U2 ?0 r0 O8 }. Y/ r8 A那么,我们如果要实现一个USB类,就需要编写以上四个函数。- m: n& M8 J7 w, q
下面就是我自己写的一个自定义类:5 ^- |8 S# _! ^+ m; i+ y
. S: K( F6 c8 Q% m8 u7 R$ e8 C+ ~
typedef struct' T* u2 J: N. e- l( A& o
{1 _4 C, a# U" ~# b  N
  uint8_t              hc_num_in; 5 c1 }( r& |0 V( P. B) M# G/ [
  uint8_t              hc_num_out; 2 `: f& T0 Q  Z& c3 V- c' S
  uint8_t              MSBulkOutEp;" c' f5 q/ h0 {! u3 E
  uint8_t              MSBulkInEp;
0 l) B3 j# N" G) s2 C4 X4 s  uint16_t             MSBulkInEpSize;% T, ~5 k4 Y( c4 w7 M
  uint16_t             MSBulkOutEpSize;
2 t8 D1 k! u: P, {}myClassTypedef;
7 V9 m. A! p  {# u+ U- L- dmyClassTypedef myClass;3 Y5 E0 X0 f6 H6 m

4 G% @1 x% H  mUSBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)
8 p( q6 j3 H+ c5 ?* s. X  X2 d{
/ O1 [7 I9 o. k, J        USBH_HOST *pphost = phost;* m# M" d! i" r& R, {6 M; f' s
        short myi;
( i& X: v5 F0 j' ]) J" s% H        char Buffer[50]={0};
; _6 G: ^4 R, Q/ a2 }; {        5 }, z) K) y/ J- Q+ E: l) r0 b. k
        unsigned char status;
5 x3 e7 A# ~$ _5 d  o        
. e$ z5 \+ ^: f" y4 m) }* ]' c" N        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);
" k$ e8 `2 V6 K; M( X$ e        LHLFont_DebugString(Buffer);2 v- Y0 e$ \, ~1 \
        ( ]; l( |$ j9 |" _0 g4 w. u
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)
. i! R+ c% b2 Y% Q3 I' k6 p        {: X: ^8 j5 m5 p2 q% S
                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)- S* g& i' ^7 }5 y
                {2 s9 N9 E9 @3 i+ i& M, p2 Y
                        sprintf(Buffer,"接口%d的端点0为输入",myi);
* _) C( V5 l! O# g# K7 z                }: B3 P0 h8 }. T# w9 `$ O: M
                else
% y' `, i6 D/ B( b) @; G                {( b! \3 G5 f* a& {! M! R( ~
                        sprintf(Buffer,"接口%d的端点0为输出",myi);
# R' w1 u; D4 b  P                }/ h4 K& X2 x8 K2 o, ~  j, J
                LHLFont_DebugString(Buffer);. k) F  S9 l5 Q$ z
               
& ^) M/ u( s9 T! o                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,
" {0 e4 b7 p/ }4 T$ k9 L/ R" I& g                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);
1 g$ o: F, L! m" t; p                LHLFont_DebugString(Buffer);
/ m% E: s/ Y5 T4 z* X                ! z: p) P+ }- {7 [3 Z5 i( y
               
/ ?6 n6 I9 s: _, Z( ~* m6 V                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)
& e/ x6 L& v4 F                {1 R! Z1 w/ @: R; \
                        sprintf(Buffer,"接口%d的端点1为输入",myi);  t2 M. D5 h( y- d4 T( u! N- O$ R% ?
                }% F4 j9 K1 p, Z
                else: B: c& u8 h" y: S
                {
; h* N) t7 o% c7 Z$ g3 b. R                        sprintf(Buffer,"接口%d的端点1为输出",myi);. [9 H- j3 a! y- k
                }
, d" a$ x' V- T$ u3 `" ~                LHLFont_DebugString(Buffer);
+ }+ @  s  B# `; h# O
$ i, X+ C" V1 J8 X                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,4 ?) i- c: n6 d
                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);, d% q) p) ]* W$ l! |7 ]7 r/ [
                LHLFont_DebugString(Buffer);        7 t) w& Q0 ~1 u  b
  }! H/ ^, `3 K: C/ M- f, u& x( X$ a* E$ h
            n8 }% c' D% o$ d. j
        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;# ?1 X6 _) N7 c* K* s
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;
1 [1 r$ s4 }/ n/ m( I; k        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;
% \9 f+ G- f. K6 ]* \2 ^, Q        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;
' p$ W: P# u  e- Y4 y        ' B. o" d2 |( w8 y5 y. R8 U- ?0 v
  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);
2 k8 \. w$ |" A- m' S" S  k  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  0 |/ @3 g1 v  S6 E" x9 W  ?+ O
  , t$ }9 `; |/ T
        status = USBH_Open_Channel  (pdev,
1 G/ x) a& m/ d8 N8 I3 [" |                                                                                        myClass.hc_num_out,
8 W' b% r% e0 \; c, Y; z$ ?                                                                                        pphost->device_prop.address,
) b- m6 r4 z4 B8 X                                                                                        pphost->device_prop.speed,
3 I5 B0 p1 E& ~, o* c* L' S% x                                                                                        EP_TYPE_BULK,- T) O+ m" t8 N
                                                                                        myClass.MSBulkOutEpSize);  . a- Y3 P& S+ S' U" f
        if(status == HC_OK); P6 p! M/ z* U1 L" b6 S! S
        status = USBH_Open_Channel  (pdev,* M7 N0 W: g3 m) H
                                                                                        myClass.hc_num_in,
4 I/ j. l# J: v                                                                                        pphost->device_prop.address,5 F2 s& R& u; K
                                                                                        pphost->device_prop.speed,, d$ Z: F! w# ^  z6 ~$ D
                                                                                        EP_TYPE_BULK,
! I$ W# B  W+ W9 _/ p/ {                                                                                        myClass.MSBulkInEpSize);
9 y$ K$ g: n* l, v- Y" o        if(status == HC_OK); S( x3 J! K8 k* C* I% E( ~
        LHLFont_DebugString("USBH Open Channel Ok");
  l8 z- ~5 c1 Q        * H5 L/ r! p5 v6 _# V( a2 J6 o
        Receive_Retry = 2;
5 I0 C  F0 p( A& ^3 I6 B        " w, g: x4 Q2 t+ F; k6 a
        return USBH_OK;                                 1 _, k+ D% q/ V# o6 @5 @
}
1 X+ T' ~% V2 f3 k              I9 Y% B7 I2 _3 d* m
void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)# \3 ?9 P9 S# s& h
{0 T; |& Y. q0 K( v: O) I
  if ( MSC_Machine.hc_num_out)# o+ ~2 `; t) U# R0 Y
  {. y( A# ?. U/ X7 l9 U# j3 t# l
    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);- d2 ^: t" h1 b( F4 B2 ^) b
    USBH_Free_Channel  (pdev, myClass.hc_num_out);* q3 V+ O, v1 M, ^/ b7 R$ S
    myClass.hc_num_out = 0;     /* Reset the Channel as Free */
5 W; h  _2 c( ?# Z  `3 i+ {  }# v( f/ e6 }9 n9 b6 o: T, Z. [; e
   
7 p8 ~, j0 P, A- `. {- `* ?  if ( MSC_Machine.hc_num_in)3 a: {& q) S2 B6 N9 Q
  {* x$ G7 h' M8 ^1 z, a4 m8 H. t
    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);
# |& J9 ~3 y4 ?4 w/ i; J    USBH_Free_Channel  (pdev, myClass.hc_num_in);
  m/ n) |4 [- c4 x* N0 y    myClass.hc_num_in = 0;     /* Reset the Channel as Free */# |% E$ d% E6 O: A) `, ^( k3 z
  }
) f  _9 g. [. S" B! [, Z/ z' g  ?}, Z7 J% [# |# a7 x6 w
USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)
& }) p- I' e8 a% Q: q6 E{
2 `3 w5 P& p: t( y% i! n        return USBH_OK;9 \2 F1 ]1 a  N( z2 y0 {( U
}
2 [+ m2 N4 K& x' y; J5 p* x6 bunsigned char usbbuffer[70];! F9 l- @, ?" t. |* B0 c
unsigned short usbbufferlen=0;
( t9 y% g; j$ } * b& u, ^6 u/ |; _# i' P4 F8 H
unsigned char SendMechine = 2;5 T( A# a; {5 V& s5 ~
int SendCount = 0;3 V+ B8 v$ l; O/ H
; L1 t. b+ f) z/ [+ _+ q
unsigned char ReceiveMechine = 0;" K( Y  Z8 C/ M& r4 S/ f
int ReceiveCount = 0;
* E( i/ u7 [3 v* |1 j& q, K9 t7 Zunsigned dataReceived = 0;
7 \6 C  Q* d+ E' F; K" ?
0 j- F: ^+ Z. M% Xvoid usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)
" V3 X* W7 p: g4 h{% L. i4 {4 [  @/ @# N  n% k
        unsigned char *ptmp=usbbuffer;
) O0 k0 i& X1 t0 R. J& N        
, Y& k, N' X* a1 W) J        usbbufferlen = len;
% w! L# U4 E  \        ; B1 {- r8 a0 y' f. {$ V! c/ B  t
        while(len--)
6 C- w5 W; O( W& g' n        {( a4 n4 J' D9 e8 L4 w% Q3 M
                *ptmp++ = *pbuffer++;
5 i$ D, {0 h6 v: b        }$ b7 O) Z) D8 I0 H: Y
}
( `4 S, O* ?8 Q5 a' [1 _# vUSBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)- v8 d6 P2 P3 D# X- h
{
! ~* ^7 G2 J+ E% R% N8 o+ U; h5 Z        if(SendMechine==1)/ z) }6 D4 X- u. Z9 |
        {; k6 ]) M  i3 z
                SendMechine=0;1 T" E: U3 B5 I/ b0 L' b
                USBH_BulkSendData (pdev,) R4 Q( R9 o" M9 m5 [, I/ [
                                                                                                 (unsigned char *)usbbuffer, ( c0 e' p6 S8 P1 X% q/ G+ z- @
                                                                                                 usbbufferlen ,
. m3 y4 e. P. r* g3 L/ r% W  s                                                                                                 myClass.hc_num_out);
! ~9 ]0 }/ Q" w+ L4 R% u/ t                SendCount=0;% t2 a& F- U3 C' g
                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)0 s2 I9 Q+ C/ _
        {
; O% v7 Z" |1 n6 K, h                Receive_Retry--;
( }. a8 v. E0 [& |) r; n                ReceiveCount=0;
8 ]+ V. ~0 v7 Y                USBH_BulkReceiveData (pdev,
+ m5 N4 f  h9 \! m- U                                                                 (unsigned char *)usbbuffer+3, / b- t" k7 A4 K$ G* _3 W+ U
                                                                 64, 3 X& t/ e, C: V/ E1 j- Q
                                                                 myClass.hc_num_in);6 |8 F! \' ^/ N$ Q: b# a# Z- u
3 K& F8 M; p1 _3 n
                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# b7 y4 S- S8 W3 \1 Z; J
您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...
% e' |* q) _0 i% w  x& d5 U
请问下 您的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
/ s- ]  O' t% }* W开发3G模块的项目要用到这个,不错

4 i; r3 p% |7 w  Z1 ^0 m3 ^2 z您好,请问您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 手机版