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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。
" I9 ^' ^( U: H0 N$ \9 ?8 Nst官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。
3 W  J, z- B  v  [" J对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。4 }3 n$ I4 [* T+ t' q; X
在st官方usb库中,usb类是这样定义的:
9 M# H( l8 G2 W - H) H, M6 V+ p: H5 Z
typedef struct _USBH_Class_cb
1 C8 n6 {6 O+ [! S' S0 t{
7 `. `2 u5 l7 e6 {+ G5 p1 X  USBH_Status  (*Init)\0 z+ }- }  ?9 Z
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线/ F1 a+ z, G; T4 o$ F- r$ j9 M
  void         (*DeInit)\
. {# Q5 V2 d" K: G/ G. j! T    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源! U2 y0 l) H1 i$ H  {" ?* q
  USBH_Status  (*Requests)\
% r, d2 Q+ P! y    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求  W) a& }  ]  U  P- C
  USBH_Status  (*Machine)\& K; j6 J: T8 @8 j9 F7 `
    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程    7 F+ g/ o, A* E6 }
  
6 l3 e+ D$ j2 b1 |5 m; ^3 S; V. r% K) L} USBH_Class_cb_TypeDef;
3 ?% \7 E6 x2 c7 y  ^那么,我们如果要实现一个USB类,就需要编写以上四个函数。
. W" z: }9 h7 l! G0 |下面就是我自己写的一个自定义类:- E3 G* e, ^2 u3 |- C) W! F& X
% D: I/ h: Q9 I, X" b
typedef struct+ ?4 _) c" q/ d
{& P* t3 [; L4 w
  uint8_t              hc_num_in;
* r1 q5 t* }! H: L" \* Q( I  uint8_t              hc_num_out; 6 J$ u' b; E; w$ O2 [/ J
  uint8_t              MSBulkOutEp;; ?! T& a8 c7 e+ W# P
  uint8_t              MSBulkInEp;2 m' K; m+ Y: Q/ Q% Q& s* v! B
  uint16_t             MSBulkInEpSize;
5 R4 L' o# `8 u% t0 k$ K8 C9 N! E3 ?  uint16_t             MSBulkOutEpSize;
* C3 A& ?+ _4 R1 f4 O}myClassTypedef;
# \# \0 g% P5 a) ?myClassTypedef myClass;$ k  I! C/ V$ g- e: P

, w/ C' _# c! F3 j& g0 l6 QUSBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)
& l) J" v/ @- ^) {# D{
) G1 q) D8 r. a! _        USBH_HOST *pphost = phost;
0 M2 @* A  q; [6 H9 L9 w; B- t, [        short myi;
  d* B7 o$ Y6 V' r        char Buffer[50]={0};
% d, Y  V8 O% N! M" t$ G) \        
" E5 X$ f% d. K/ A3 W  d0 x        unsigned char status;
; T  ~0 ]7 J: P        & r4 X7 f2 K: y* g. E
        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);1 l/ x7 V6 y9 s* \  R: `- J
        LHLFont_DebugString(Buffer);
+ ]9 D1 j3 }. b' S! M) E        , y5 r/ @' T8 r7 J& [/ ^8 p1 u1 j
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)7 a, o3 _% D$ A- ~. O( S
        {
+ m  S9 L' B4 v                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)
% R7 P' n- i, N& l( M                {
; ]1 t, }* E( _8 R                        sprintf(Buffer,"接口%d的端点0为输入",myi);
+ Q) s, s( j) F, k2 @. P: m                }  o" R' d! k* J) X
                else7 p3 I# O, R9 D4 @9 U* {
                {
6 t! B! m0 Y0 \$ e2 B9 k                        sprintf(Buffer,"接口%d的端点0为输出",myi);
$ ]1 F4 ]3 \- g                }8 c9 Q1 C8 I- p) s" @
                LHLFont_DebugString(Buffer);
. l0 K% N& ^( w7 y5 v" x: L) n                - R2 n2 M( }% T2 r, _
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,; m3 J  `  J7 z/ m! E- x
                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);+ |& t! g# m6 B
                LHLFont_DebugString(Buffer);. T% V2 O8 [4 }% w
               
, m6 }5 A/ ~! ]. B' u; t               
5 [; v0 @0 h3 d* i                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)6 m6 O" G: n  e" D) S5 y2 ]0 J5 M: z
                {! C7 w7 }# ]  w: m' j/ X
                        sprintf(Buffer,"接口%d的端点1为输入",myi);% O( T: R4 N2 L  p. o1 a$ ~
                }
3 {9 Q, O/ Q& o9 M                else
$ p$ X( b' A/ E                {
4 }% x# K" H5 G7 H+ z. E8 s! P                        sprintf(Buffer,"接口%d的端点1为输出",myi);
4 t4 h2 p7 p% W' c) n3 @                }
" ]) F# |' T  G6 I" P                LHLFont_DebugString(Buffer);% v5 H! ]& ?: {
2 U. X) e( Q: c# m  @: [
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,/ K: d$ ~5 e' |: V6 A5 ]1 F/ b' c
                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);
# e5 e) t) Q6 e. v) Q/ `( C                LHLFont_DebugString(Buffer);        
* ~- B! }: D" \' e1 u8 |$ [  }& z' X8 Q. i2 i8 O+ S& |
          ( A2 U9 B& M! r/ M1 x5 h
        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;; i' E) [% A, ]( [# k- D
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;
: A8 t- T) O9 f. g) x# i5 ?        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;; G, o$ h: m( z4 [9 `) F, U+ f/ a
        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;$ X; N, a+ |/ m1 ~
        
3 U: w3 ~5 D5 b$ r8 C3 T  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);* k$ l# n" U: s; l
  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  
3 a2 W+ S! ~# V; \0 ~! r8 K) w  
+ B9 {8 y( W. @1 D: f        status = USBH_Open_Channel  (pdev,
+ n/ H4 l  O3 B# B                                                                                        myClass.hc_num_out,: u, J0 _  F  ?; x% ~9 W
                                                                                        pphost->device_prop.address,
$ V0 L+ h# z# \5 t+ m1 ?                                                                                        pphost->device_prop.speed,/ s& ], E: `" @( r/ s, V0 {* X
                                                                                        EP_TYPE_BULK,' G" n5 O# [, k6 K* a# `
                                                                                        myClass.MSBulkOutEpSize);  
9 p' O1 w7 G' ~+ Z8 D" h        if(status == HC_OK)
6 ~8 Q- u0 R! F7 v" ]        status = USBH_Open_Channel  (pdev,1 A+ V8 Q9 c9 S6 U
                                                                                        myClass.hc_num_in,
! m& \6 q0 E/ x- I                                                                                        pphost->device_prop.address,& Q& K5 I4 y" Q- _; p( |8 z
                                                                                        pphost->device_prop.speed,
' U5 k8 t/ R0 l% p+ B                                                                                        EP_TYPE_BULK,% y9 ?  U: D( ^
                                                                                        myClass.MSBulkInEpSize);5 ]" c: s& C( v5 n& j- H$ K
        if(status == HC_OK)7 F& Y2 q8 l2 @0 n# R5 y) A3 i
        LHLFont_DebugString("USBH Open Channel Ok");
% D# A9 C8 |1 s. n: d# m2 f        
4 s: m9 f( H( I/ c% b9 @        Receive_Retry = 2;
+ ?' b$ r: t. w0 ]        
, i. O  [  L) N( k% j& M        return USBH_OK;                                 . |; R% G& }- R; u7 j1 y
}
" ]! O1 ^/ k# f) T$ p, N+ x            ! G1 C+ M  U/ _: a2 O  P
void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)* K! |4 M' ^# m6 m. l/ H/ O
{8 [8 ^5 T6 g9 V: K9 Q1 w
  if ( MSC_Machine.hc_num_out)
, p# p" S/ N+ ?0 W% {+ ^  {
8 h, q+ }! x% [9 J5 W6 }, b( T    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);) F3 [( p% L: s
    USBH_Free_Channel  (pdev, myClass.hc_num_out);
. r: V$ r  p& P9 K( V$ b    myClass.hc_num_out = 0;     /* Reset the Channel as Free */- d) `! m' h& s; |
  }/ e8 J/ I# j& |( _0 Z1 ]* _9 w+ O8 z
   
/ S: ^. L5 N% X& z& F2 h' u  if ( MSC_Machine.hc_num_in)3 x$ L* [9 K3 ?& x' ^
  {
) ~6 H3 ]) X; w# M" f% ^; L$ M    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);
( j' s3 D' ~/ K! l7 A' Z    USBH_Free_Channel  (pdev, myClass.hc_num_in);
# Q8 D8 d8 \& O( e# r    myClass.hc_num_in = 0;     /* Reset the Channel as Free */# d* e( u' i9 i, w3 |8 s
  } 2 [$ E1 [; T! d, m3 J; o, t" o
}
. [$ x7 d7 X" d& g9 }- m4 nUSBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost). b- T6 n* H5 _; c, y9 W# g
{7 i; M6 X/ _6 T! x1 o# Z' g! q
        return USBH_OK;
# L+ M8 _0 |* Q; `' c}! e7 O. x0 C1 Y
unsigned char usbbuffer[70];
& p0 T$ [; L: v4 L) [unsigned short usbbufferlen=0;- ]& t& O  T: M+ Q: z0 \; A- l
( V! [9 }$ D, J6 O
unsigned char SendMechine = 2;
' \- m) N$ L; m4 H' Y% I) _& lint SendCount = 0;
- W0 P) S" ?- U0 Z; c  ^# \ 8 a; a! p5 n. E, F
unsigned char ReceiveMechine = 0;
) |5 k' q8 T5 f- Y$ A) W* c/ p! |int ReceiveCount = 0;
. [/ l1 J: M3 Bunsigned dataReceived = 0;
# S9 ^) N' M& U) l# l ; y$ _: {3 C. J7 I% r
void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)
- k' @4 r$ b5 b( n3 [! p{
! d  g9 l; x$ s' k        unsigned char *ptmp=usbbuffer;
$ ?4 d6 p9 f/ v  ~. r! q1 F. `0 U( ], r        
0 W/ E% j9 [. }- C* ]        usbbufferlen = len;
  b2 u- ^# U0 k8 D        ) h" y# V5 U, ^! Z
        while(len--)- z; d* o- |% p! L% Z
        {
$ e: f1 D7 y" N$ |3 Q, @                *ptmp++ = *pbuffer++;+ q& o1 l$ T# i7 X
        }+ \" T2 z& ?: [" v! S' \4 z- q) M3 _
}' E$ `5 A$ O* y& O
USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)) E7 x' h7 L6 _; ~) [$ ?1 i3 u
{
' \+ p6 ^) H/ [' {$ |" P, V        if(SendMechine==1): p7 I$ T1 t3 D9 ]' w
        {
) e1 J) n, k; Z. v7 m  E3 w                SendMechine=0;+ F; |* y! A( ~( L$ h% r+ E7 G1 _- R
                USBH_BulkSendData (pdev,
2 M: ]+ O, f6 T                                                                                                 (unsigned char *)usbbuffer, ) x; ?9 z' J. N, A3 @
                                                                                                 usbbufferlen ,
1 c/ e9 }$ X* o0 ?                                                                                                 myClass.hc_num_out);
# `. b; ~2 s; ^1 w9 I! `                SendCount=0;! w) E! y2 V  _8 u7 _  l
                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)
3 r. N+ E/ Z4 O2 F' ^. ]        {7 x9 n" z2 k0 y: c: f+ _; M& ~
                Receive_Retry--;' U6 G- a0 \( T0 |0 C& j0 h. `
                ReceiveCount=0;, c  P  S0 G' Z. G  T- X
                USBH_BulkReceiveData (pdev,1 ^" G4 b4 g* y) t
                                                                 (unsigned char *)usbbuffer+3,
( r4 q( w: r: @; |3 S' E& Z                                                                 64,
6 `% M" ]4 V* B' j% H                                                                 myClass.hc_num_in);
9 t/ B, p8 M- a" \* e# V/ F) i
* Z) Q7 G0 D: h+ Z3 s9 c2 O                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
8 |% m: R9 ~5 {: [3 B您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...

; {# d, T. h  P; Y& s9 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
8 q6 h/ A2 s4 [6 t  L( e/ |9 n开发3G模块的项目要用到这个,不错
$ i# r/ W; x1 I9 z+ I0 M
您好,请问您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 手机版