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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。
" B3 V# [4 M+ z: S! d1 Cst官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。
* ^9 t+ n% w8 R- }8 i; v对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。
8 j2 _* ^& a. J1 U) [在st官方usb库中,usb类是这样定义的:
( K/ ]2 ?9 T# D" }1 ^ / G5 n4 i9 a2 i- q' D, X
typedef struct _USBH_Class_cb; l# x) ]% {7 b  F
{. i& }3 i% G9 \) R$ f) T, r
  USBH_Status  (*Init)\
  j* w: h. o/ Z    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线% E3 r- M7 `% \0 V9 \4 ]
  void         (*DeInit)\% O" h; j2 ?6 ~% y% x
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源
- n9 }) P) j! k( x. l1 s% ~  USBH_Status  (*Requests)\
& `$ A$ @7 P/ W5 h    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求
+ q* Z) N, S1 e  USBH_Status  (*Machine)\
- D% P+ j( j7 [; |- o    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程   
! T, \+ F  r+ z  # c) \- v; Z3 F0 H* `
} USBH_Class_cb_TypeDef;1 f% U* a) A, Q% c8 J6 p6 N
那么,我们如果要实现一个USB类,就需要编写以上四个函数。) B- Z4 ^. _9 W, C0 D
下面就是我自己写的一个自定义类:  V- p2 u2 Q( }; \1 A2 L- n
' B' c! d2 }4 s4 O, A# Y: ?
typedef struct3 X* m0 Y% h. X- y/ ?
{
8 T7 h4 w) `( A  uint8_t              hc_num_in;
5 T% @" k, O( T% r6 b# w7 n( }  uint8_t              hc_num_out; 2 e" A! w$ }- k9 C1 s) K: h/ I
  uint8_t              MSBulkOutEp;
5 N' Q1 d( F; a# l% K. R8 g6 G  uint8_t              MSBulkInEp;
- L1 c7 s8 O% u) O. R+ ^/ X( ^( }  uint16_t             MSBulkInEpSize;
' x2 N" x5 O: K8 X3 F- ~. D  x  uint16_t             MSBulkOutEpSize;6 Z( c9 l, H* }- W
}myClassTypedef;8 ~8 f, q* B' t& `9 s9 E
myClassTypedef myClass;# E: U9 H& f! L: N; F5 ~, P
9 l- U5 e8 F! b/ E3 C! t6 e) Y
USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)
. I' c* Y, R) Q{
- Y$ a- w. h0 M0 e9 [: ?        USBH_HOST *pphost = phost;3 r* w1 i# q5 {2 t2 K5 T
        short myi;3 }9 X  a5 \6 ?/ w! T7 v, D  p
        char Buffer[50]={0};
* i) l# f# E$ x7 w" N% i1 C. m        6 w7 T$ G. E/ F7 L: X! _3 \
        unsigned char status;4 |$ _8 ^9 d. k5 m+ Q+ s: l9 n  z  C' j
        
, `! S1 ?) H* w2 b1 ~        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);+ e; j# K8 ?6 a
        LHLFont_DebugString(Buffer);
+ J9 V5 e9 p% z7 C+ f          }, Y1 Q; w( x" A" g3 U
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)
( P1 X& U% m. B: D- R5 @        {
# i6 B' Q- I$ j/ {' S                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)
! o0 ]/ O& F# r( u                {
3 \3 c* T  e3 x/ B3 ^$ n                        sprintf(Buffer,"接口%d的端点0为输入",myi);; V, @8 ]5 {% k- Q' x
                }4 A: E. B7 Y* M: G$ m) J
                else
$ e& p; t$ R" i2 E* n- r5 B                {' c9 W! d+ z7 o, F7 X! ^
                        sprintf(Buffer,"接口%d的端点0为输出",myi);& R  k  C# _5 ?  e3 r0 }6 E
                }- |! U' v4 G/ K+ e1 R! Z/ N! p
                LHLFont_DebugString(Buffer);
- m, ]$ I; ^; p/ c               
: n" a# C: l/ I3 a4 ~5 n                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,, j( L" @% O; D
                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);/ `! t- ?8 W9 \/ m/ B
                LHLFont_DebugString(Buffer);
8 f9 @1 X/ Z+ D               
1 O( t" d' r/ z- |  I% _& T               
, J! x+ w' L) ?                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)+ z" a% c( p/ d6 C4 v( \7 U
                {
, h4 s" V; B! B7 L( i7 L. C                        sprintf(Buffer,"接口%d的端点1为输入",myi);
1 w5 ^2 f) d7 W4 E" w                }( j- S' m/ O/ O( X
                else2 C9 b7 d+ R; X3 q
                {& e! Z2 h, f! Y2 I0 g, b8 P: T
                        sprintf(Buffer,"接口%d的端点1为输出",myi);! O9 u5 t1 E- D0 N/ U0 X
                }  |' n2 t1 P0 m3 Q) U: A1 y
                LHLFont_DebugString(Buffer);! N7 h( M* u" g7 o6 S: s0 _0 s  u
6 W0 m/ j6 p# g, Z! B! [. n* m
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,# N; D' N7 s) h8 o! j! p% ~2 ]
                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);
$ a* X1 H# _( m8 X  Q% y: u                LHLFont_DebugString(Buffer);        
, @  _, I& I" R: L& q0 w  }
; G* y* x# O; @9 g9 O8 @         
9 ?3 B' f6 ^( L! H$ c! x        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;+ U3 r7 T$ d% T+ w$ C) O0 A
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;* M5 v' h( k+ P7 }8 j; _
        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;# A3 P! }/ o* R2 z. z
        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;% u: S) [  x2 {' p1 W- U3 c2 h& z0 S
        $ m! J+ H( b# d. |4 `/ p& h
  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);# a$ L- W; l6 `
  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  / J1 o3 ?5 s& Z3 \' K) e- L
  + P; w' O9 _. x2 H( V" K5 d
        status = USBH_Open_Channel  (pdev,! s0 F* m2 Y* ^- q) Q, X
                                                                                        myClass.hc_num_out,0 E/ a  y) q; N0 [% T' Q! a
                                                                                        pphost->device_prop.address,! s$ E3 _8 G+ T0 a( Z; M# N% [! c
                                                                                        pphost->device_prop.speed,
8 x& F5 u8 b9 d0 Z* l4 C! k  ?                                                                                        EP_TYPE_BULK,5 U1 s4 O2 J. O. L3 q- B" a! K7 j
                                                                                        myClass.MSBulkOutEpSize);  
& e8 ~* D/ D7 H3 y9 K. c        if(status == HC_OK)+ O! V! d6 E8 q  a% l
        status = USBH_Open_Channel  (pdev,8 ]/ J' u8 N+ w: o
                                                                                        myClass.hc_num_in,
8 `& Y2 d2 s! j7 A                                                                                        pphost->device_prop.address,
: v8 l2 ~/ A0 K6 z( u1 G                                                                                        pphost->device_prop.speed,
+ E" ~! Y4 @, s2 J" O+ D1 X                                                                                        EP_TYPE_BULK,, _  J& c1 f# E7 G8 F, J9 @
                                                                                        myClass.MSBulkInEpSize);4 h1 f( M$ a( q
        if(status == HC_OK)1 ~( U8 L/ r7 D0 |' w! D. C5 W
        LHLFont_DebugString("USBH Open Channel Ok");
5 {/ a* n' |3 m+ \; S: }2 }. `# e        
: Q# Q1 `& E4 J        Receive_Retry = 2;0 n& `1 [& ]  S# m6 N/ E
        # A. [2 C0 w- p& H
        return USBH_OK;                                 1 g$ X3 f8 @! m# u9 i2 e+ h
}/ a, r8 J8 z' n( ]8 v
            
7 Z+ r$ ?* M1 y" Ivoid DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)
& l& a' A% J% w$ \{
3 `2 j) M' i' Q4 E  if ( MSC_Machine.hc_num_out)
9 v( I0 t& B: `" \& J% `6 e$ P  {& s+ g- f, |+ u; H+ x
    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);
% j* Q6 H* i7 w. o6 e    USBH_Free_Channel  (pdev, myClass.hc_num_out);
: k1 |) i- g+ w: \" m    myClass.hc_num_out = 0;     /* Reset the Channel as Free */
/ ^2 m7 U: N% T" P# ?2 K) x  }9 a' g7 p1 y- p! O
   ) l$ s( y' t8 {
  if ( MSC_Machine.hc_num_in)
1 X( d5 P3 g3 C9 u$ F  {
1 E( ^0 y9 J0 J# n0 g9 {7 r    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);! a* l4 E' b& P8 ]
    USBH_Free_Channel  (pdev, myClass.hc_num_in);
; S& d7 n0 \7 m1 c4 l* A  Z    myClass.hc_num_in = 0;     /* Reset the Channel as Free */5 ?6 l* w. Q) W2 r, I0 i) |
  }
& X& D% R/ `+ t: ~}
5 o8 F' A6 e( ~# pUSBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)
! q/ u% r! v0 ]' b2 Q' p+ b9 }3 T  {{
. A& ]. E, _2 i        return USBH_OK;( `( }. V8 e9 b
}
- Z" u" i* n0 m. iunsigned char usbbuffer[70];( r* C9 n7 O4 X! {- W0 W9 m
unsigned short usbbufferlen=0;- j4 e& H$ N' G, V

/ }2 T5 h: p  ^$ W# {unsigned char SendMechine = 2;" c! }- b  [+ k5 n! F2 `
int SendCount = 0;
7 g- L! x; r& U; J+ k8 B/ k 7 V9 A4 v9 D$ Z( _) L
unsigned char ReceiveMechine = 0;
$ Z! q8 S/ j/ Y2 o5 mint ReceiveCount = 0;" ^$ D( [+ C: q. i- p
unsigned dataReceived = 0;
! f2 T- W6 S* [  [# `( m" N / B% n# Q  e' U* m5 K( T
void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)
/ n/ T) C5 f6 H' H  ]: W8 l{
) t9 g7 k5 Y8 R3 Q: i        unsigned char *ptmp=usbbuffer;  H4 p# N% M1 q3 ~5 P# m
        ! T; P+ N9 c. P4 l" [
        usbbufferlen = len;
; X$ J1 ^; r* i- B        # O/ |* }( h! v1 s
        while(len--)
0 C1 h2 B4 y: l, @        {
/ W/ a4 p( b  h/ T* o% _' C) y% M                *ptmp++ = *pbuffer++;
5 q6 f0 }8 u0 a5 j  j( `5 d" R        }
/ \6 m" M! b; G( O. T- O3 k}  N+ A( ]$ o4 W' {
USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)
+ e3 T3 i6 q3 ?' {6 H+ [5 S{
  Y. Q. Z; g; q2 _+ K& J% J6 W, v' L        if(SendMechine==1)& M/ ]2 J6 Q. \* `
        {6 r% `4 m8 @* ?. c7 X% r' y
                SendMechine=0;& m8 z, x! Z. K4 M
                USBH_BulkSendData (pdev,0 T* `& A6 L0 c8 I- ]/ ?
                                                                                                 (unsigned char *)usbbuffer, 4 l; p. e- J0 c8 {" b! D
                                                                                                 usbbufferlen , ; U! v2 O, `4 d2 Y8 N5 G$ d
                                                                                                 myClass.hc_num_out);9 D4 Z, {: D% A( V
                SendCount=0;
9 W3 @* h+ T9 h- D1 t$ r                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)
1 I/ P1 p' m: v: P6 D9 C2 e        {
6 t! `0 P$ ^1 Y; w0 {                Receive_Retry--;
* M% l' I2 _. f                ReceiveCount=0;4 d; j+ u0 u3 D9 T2 c% Y; K
                USBH_BulkReceiveData (pdev,) B+ I+ T- I( A4 g5 o
                                                                 (unsigned char *)usbbuffer+3,
0 P6 d/ B9 J8 j: n1 \9 l' U                                                                 64,
; g3 g. H8 X" {$ v+ P4 P8 ~                                                                 myClass.hc_num_in);
, B  Q9 L( o- z; [( ]' f8 j3 I: i; ~9 s" S- z* U8 [3 c
                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:310 i' S* q$ w" t. p' u
您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...
4 s. D# \( c3 u; R% T
请问下 您的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
+ f7 x' l( G& ]5 I开发3G模块的项目要用到这个,不错
6 {) j+ T  J' w+ a, ~# 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 手机版