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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。
6 i. d5 l' ^) U* m4 Cst官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。3 \9 Q) ~3 V6 P. M( l: e
对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。& y9 k% L! ~/ F" U+ x" F
在st官方usb库中,usb类是这样定义的:* V8 }7 Y7 O6 H: c( U1 h, ]
' m) l# ?' I. |' @& ?& M# o8 Z
typedef struct _USBH_Class_cb% n* p2 Z* l+ ?; A% E9 P
{1 e: x0 m4 |. Q, `3 c
  USBH_Status  (*Init)\
  t- h( ]& @9 p; d9 R8 N& Q    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线: \" m! U% P1 i/ |8 T  w9 v
  void         (*DeInit)\
% V2 S7 f. |% ^( j6 _/ K    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源# C: @% I8 Q/ ^; |" d  ^/ F' v
  USBH_Status  (*Requests)\
0 N% |! }+ v2 A% J5 @    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求( J1 _% X$ ^8 J, o# o6 [% I! G3 N
  USBH_Status  (*Machine)\8 |" d+ k6 q) I- m1 F2 w3 o( @
    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程   
9 a' O8 b7 D. y4 z* k  . Y& ^5 r$ P4 b4 M" ], k3 U7 t) K$ X
} USBH_Class_cb_TypeDef;, h) ?2 C( d9 l% f7 e
那么,我们如果要实现一个USB类,就需要编写以上四个函数。" [$ ~" V$ v# {  w6 j& U: h) t' I
下面就是我自己写的一个自定义类:$ [4 q0 A$ b# U

! j/ Z6 u2 K( v6 R0 Vtypedef struct! k/ b/ u# j+ g  C/ a
{
6 F$ L1 n% r* ^9 l' C+ {  uint8_t              hc_num_in; 3 ?  D! y# X, S" G, A, Y
  uint8_t              hc_num_out; ! @) E. P1 @1 g
  uint8_t              MSBulkOutEp;
: M/ e; K2 l- L' P2 h0 T/ b  uint8_t              MSBulkInEp;: h! a7 }/ t3 l/ }- Y5 i
  uint16_t             MSBulkInEpSize;
8 t& F2 S1 M" q+ Y: g1 k' I6 C  uint16_t             MSBulkOutEpSize;( a! X9 ^2 R; X$ H$ y$ o, s6 Q
}myClassTypedef;2 H. g; |+ i- T8 O% l7 }& ]
myClassTypedef myClass;
: M2 \' G8 i# ~7 m, G( R + s6 ]  C& g) |- R1 k5 _' r
USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)% ~/ m7 `" |9 F5 X% M" Y
{
! \8 g  L3 P: P8 E' h- S        USBH_HOST *pphost = phost;
: A8 v7 w2 \. P7 g1 h7 K( q) `# n        short myi;
7 k) F4 X, R- o        char Buffer[50]={0};3 W* P% B0 l2 U, c' S
        : b7 t8 {4 G0 t4 _0 j1 E' v: K+ @
        unsigned char status;
' l8 `2 w+ e2 V3 ^9 y        
& X6 w& C- R5 Z6 e7 e4 D9 v7 S        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);
! [+ q" r  G+ F1 f( O        LHLFont_DebugString(Buffer);4 ]; j( L1 j  O. F- |
        1 B  p2 k# b, _, W
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)" A; r/ @4 x' i, W
        {8 ?% U& g( U/ p- b: |
                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)
, }* W5 d$ C' e5 R* s                {
' J% k6 \" Y  e9 h, c( C" w+ L                        sprintf(Buffer,"接口%d的端点0为输入",myi);
* r$ V! V2 y2 i6 J                }
9 u- A' s) m" `5 C9 S                else, p1 Q9 Y/ M4 q, l
                {
6 B% Y2 ?! A$ C0 H: L                        sprintf(Buffer,"接口%d的端点0为输出",myi);" b0 l' c  H  T2 m
                }
) J3 N2 t3 Y% V* _- ]4 i. m                LHLFont_DebugString(Buffer);, q/ H) q+ Q2 t9 n4 q  O5 w  K
                " F, H4 H1 J  [, [
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,+ _) T; [9 f& @: ]- R" W
                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);
6 j5 \$ |: n2 N/ i/ t                LHLFont_DebugString(Buffer);
  c7 F) K. j8 _. l* v: a               
  {. V2 K, A$ ~1 R                $ o% }& l& w- q  E9 H
                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)' o2 h+ }8 Y" q4 L" q8 m% l& o
                {0 Z; a5 D- W# g& \" p% a6 w$ ?
                        sprintf(Buffer,"接口%d的端点1为输入",myi);& Q6 e2 P% g: W  b% _+ R
                }: d+ E+ ~# Y7 }3 y
                else
1 P& m4 j# X) q) ]) n. Y. @# g                {
, g+ C; `+ d: b                        sprintf(Buffer,"接口%d的端点1为输出",myi);( k) }5 v9 H5 h' p3 j" E
                }. i' L  ~! j* s: b
                LHLFont_DebugString(Buffer);1 f0 p# s2 U; u2 ~- z1 {8 S3 O3 L# s

% k" x, U, m2 L- ]5 |; j7 U                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,
" ~+ v7 `! @& z3 O- X                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);
! P) C4 A' N+ S+ X                LHLFont_DebugString(Buffer);        
) a8 e0 p' ?- T/ C) C  }) n. O1 X% j1 n$ R7 L
         
& w4 F$ R& d$ `0 q. H        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;1 C# |& ]$ c) m8 ^
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;! t5 c" V" |5 t* q. d6 z/ @& M
        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;
* l% l, O+ F. }        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;
8 Y; {! I4 O) R        
; L! X- p7 Q: T" h. d* \  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);. M. l: U5 ~: x) r  F- E( k' ^
  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  : g. a, ^& a) K) F; t$ t
  ) @" W1 I! `& F
        status = USBH_Open_Channel  (pdev,
+ N, x% ], _  W( l7 e. t                                                                                        myClass.hc_num_out,0 u8 i) M( i7 ~% M% n$ e5 S9 ?
                                                                                        pphost->device_prop.address,* O; |, Z/ v* Y/ g5 u5 y
                                                                                        pphost->device_prop.speed,0 u" d: r$ w, W
                                                                                        EP_TYPE_BULK,
3 B' k2 p6 i) h0 t1 A- m                                                                                        myClass.MSBulkOutEpSize);  
# q. M0 ~4 a1 ?$ [% y5 A        if(status == HC_OK)/ `1 @% F% i$ C6 q' \
        status = USBH_Open_Channel  (pdev,! ?& x3 l9 p: I4 z1 _0 m
                                                                                        myClass.hc_num_in,5 \  d/ n3 k, v5 g* |3 D0 a* G6 r
                                                                                        pphost->device_prop.address,- o9 `$ m) G! S4 n
                                                                                        pphost->device_prop.speed,, n  L5 Z$ k+ Y& b8 R( x* }1 ~
                                                                                        EP_TYPE_BULK,
! V% m1 Y5 T3 J4 ?4 L$ i: E                                                                                        myClass.MSBulkInEpSize);
2 s. v& N7 \  @" \1 |9 @/ t' ^        if(status == HC_OK)
! u8 G' ~4 _9 {* r& R        LHLFont_DebugString("USBH Open Channel Ok");
7 u% T2 d* u. I. k. y        
2 k# D3 z; ^) n9 |8 z$ {' h7 T        Receive_Retry = 2;
& d! }, l+ k: V6 i. Y: _8 m        
& H/ ], J: p8 k# u3 g8 ~( o7 U6 W+ B        return USBH_OK;                                 
  v& A  r8 K0 u}
  X% s# [) ~) t* t9 Y& J) o6 ^) |- V            
' h: a6 r; S8 j8 N. o( Dvoid DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)9 [  t* r) ?5 D$ A4 [$ ]' y
{: ^. T3 }8 h8 J) L# j# s
  if ( MSC_Machine.hc_num_out)
8 e8 W; I' J9 {+ I5 t  {
8 f5 e  z8 \# c! s. h    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);* T$ N% }: P) Y- w7 V
    USBH_Free_Channel  (pdev, myClass.hc_num_out);
, H- V3 l# x+ I; o1 D! v    myClass.hc_num_out = 0;     /* Reset the Channel as Free */7 U/ g) P) t6 P
  }
4 C8 H2 }  T8 A# e$ x3 x/ ^: j/ v# L   
; c3 ~" z7 s! K  if ( MSC_Machine.hc_num_in)% C0 S! j9 _- \6 C1 e
  {7 D+ F. {, _* a& `, ?/ ?
    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);
4 L: O4 t- M5 d. V' Q# }5 @* n    USBH_Free_Channel  (pdev, myClass.hc_num_in);
2 f, z0 @) n2 n) y: E    myClass.hc_num_in = 0;     /* Reset the Channel as Free */) c' Q; F3 Y8 G
  }
7 x/ b6 Q+ {- ~1 B+ e}
: c. `9 ]- T7 e( t- ]& VUSBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)
) h$ h* W. A! J, |{
; z0 _* `9 Y2 k9 y        return USBH_OK;1 X: b  j  P9 \3 O' R# D
}0 P) c: I3 Y3 C$ g6 x
unsigned char usbbuffer[70];# i; V2 e' `: v6 q" f: @; ^- E
unsigned short usbbufferlen=0;: m  r% S* l. [" M* p& s  j) k
5 D6 ?+ O% |% l' h1 f3 [
unsigned char SendMechine = 2;
8 p! [9 B' W, |. O* [/ hint SendCount = 0;
1 J/ t2 J" R- s) |8 t# i . U& U0 c3 m( Q6 D
unsigned char ReceiveMechine = 0;  n+ u. u; b" R6 {
int ReceiveCount = 0;5 N+ l8 P9 N- w6 Z8 d! F
unsigned dataReceived = 0;
# M" W( `- B$ q& x; @ 6 R1 [4 u5 o/ Y" }0 ^
void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)
3 _! n' d- K3 [& L% {{: c) J! U( L, ~8 _: g0 c( \/ h
        unsigned char *ptmp=usbbuffer;
/ L3 Q) Q* P) l1 _. u  ?        
: ^5 G+ m/ L+ U6 ^+ t        usbbufferlen = len;" I. _% l: s3 q  d
        
! o. }7 ~0 @2 n7 z        while(len--)5 @5 \' F) E4 c! g% j" h3 g
        {
% h9 N* Z3 I  G) o                *ptmp++ = *pbuffer++;
* z. i; q+ S) p& `* X        }
3 F3 f5 {  D, ~6 g* K9 i}
5 O; A0 n8 p/ Q* e: C0 c* RUSBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)
! R! b8 |6 W( j: |* v{4 E" c- d) S; {7 `0 w: o) m& A0 z
        if(SendMechine==1)
$ g* m9 l& f4 `& t4 S2 t        {
- v, t4 r  r9 o/ \2 {% y+ m# C8 l                SendMechine=0;8 S, |2 _3 x* L, z) w% s9 C( y' q
                USBH_BulkSendData (pdev,
; i6 D/ v- B( H2 P. `                                                                                                 (unsigned char *)usbbuffer, 9 ]6 r- H  C! U: ~
                                                                                                 usbbufferlen ,
" ~! L" `9 f" c, Q                                                                                                 myClass.hc_num_out);
+ g% r8 O; T- b- e                SendCount=0;6 z% f/ ?- A" F& {- R: L4 F& a8 ^+ Z
                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0). V% J  t" X: x
        {
2 o3 w; |- F3 N  L                Receive_Retry--;5 T$ l0 W/ n9 f4 I/ P. M  T% W
                ReceiveCount=0;( s2 b8 G! s: v# k& T% R6 @
                USBH_BulkReceiveData (pdev,
% Y- @. D. j% A2 m7 T" I                                                                 (unsigned char *)usbbuffer+3, 3 x/ s$ q9 a  T* ~4 ?; l
                                                                 64,
! b2 }3 U" V0 E- ^6 y                                                                 myClass.hc_num_in);* e1 J: e4 i# J, C0 h

; j9 I# n9 \: w3 K                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
  A! s( a" a+ D, a您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...

$ S% Q5 Z! x! F: o3 r: R/ p' u6 [请问下 您的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
$ {. v1 _9 H+ u/ G1 c4 }开发3G模块的项目要用到这个,不错

* H( o3 t4 ?! \# m4 s您好,请问您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 手机版