请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。
/ W3 F) G9 I' l. E# _! Yst官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。: \8 K+ \- X) W5 [6 ^
对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。5 w3 Q# Z. ]( t' T1 z; U
在st官方usb库中,usb类是这样定义的:
2 i/ S5 N5 x" m8 t" r
- `/ W! S8 w) \6 R4 Wtypedef struct _USBH_Class_cb* w. J( d9 U* c0 E* C  ?; d
{7 f. w" N  _( P6 z2 X
  USBH_Status  (*Init)\4 q! x" t' R7 c2 N9 k
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线
6 n9 L! V% U# F/ H) s9 i) i, ^7 @; b  void         (*DeInit)\8 _" b6 H- @  T# R0 ^
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源" Z0 U' [+ Y* E% C2 n7 d
  USBH_Status  (*Requests)\
* r: j$ e# K6 x. G3 W. f! }    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求+ z% R/ C: \4 @) U( {' p# r
  USBH_Status  (*Machine)\
1 O6 a+ d+ G% m' h3 h8 p$ n4 U    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程    % p) f' [: J0 M# c! R$ E' X6 O
  
; v7 y: O* a" w, d% F) E} USBH_Class_cb_TypeDef;; z* w2 Q& ?; {
那么,我们如果要实现一个USB类,就需要编写以上四个函数。+ q* y6 g2 I7 x# N* R9 v5 r# ^! p
下面就是我自己写的一个自定义类:7 Q, y5 Z( [6 {5 ]3 f3 \8 S' D

8 P* @% h) [$ stypedef struct
- {, P2 q& I5 |0 Q7 v2 h' b7 U4 _( A{0 u, n/ z4 B) A& L) c4 }' V" X
  uint8_t              hc_num_in; : a$ q  G) I+ y! `; W0 @# O
  uint8_t              hc_num_out;
( w6 Z7 Y& m7 @2 N1 L9 k6 @2 e  uint8_t              MSBulkOutEp;6 M) _  E# G( V+ ]
  uint8_t              MSBulkInEp;
5 b( w) d8 Y5 f$ ?  uint16_t             MSBulkInEpSize;
, Z  y  H2 \0 g9 [- a% c; ]7 O  uint16_t             MSBulkOutEpSize;
% h0 |0 {9 X% }/ E+ c8 D* h}myClassTypedef;
3 D- f4 \2 e- B9 P1 h9 smyClassTypedef myClass;- I+ }# u' T/ t6 |: r. B

( }7 \* `" q: X0 N! T3 g0 ]2 RUSBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)( R  g' M8 G9 v6 j& w) }
{3 e5 N' b: V) w" M, v
        USBH_HOST *pphost = phost;
/ D  {% T* {1 C3 g0 ^        short myi;
# s/ l' z5 @: s  ]/ E) J' _6 |7 U7 {        char Buffer[50]={0};2 Q; H; O6 ~/ S( N6 E4 M
        
/ T& W( V# ^5 w/ \        unsigned char status;) E) k; `( d. s
        
. R% i2 ]+ J2 ], _6 K" d        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);
' ]& u' m" Z7 R/ U( @        LHLFont_DebugString(Buffer);
  B- W- p  i6 W/ Y; }# X; ^        . q; Z& s, O' s1 g! A
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)
+ u+ t/ G1 q' @8 F        {  K4 n- t' T1 v' i5 X
                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80): ^( A" n1 F- z: o; C
                {
: ~. H0 P3 f, Q" a; @                        sprintf(Buffer,"接口%d的端点0为输入",myi);
0 B0 |4 A  E3 y& Z$ P                }
4 ]8 A+ w7 ]7 u                else& @+ J" e% ~. ?2 H5 o1 x
                {
* d: d+ l7 O1 D5 L9 s  _                        sprintf(Buffer,"接口%d的端点0为输出",myi);
/ b  K9 T9 m0 ?6 x# ^                }& s- |* o, G% H( k
                LHLFont_DebugString(Buffer);+ \+ P& i3 I8 X4 V) `! H1 O
               
6 z, |! B: y) m( U- a4 s                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,
% r) ^& Y4 b5 V+ z7 {# k- |- a' z                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);
8 Y3 j+ C# _2 A) }9 C2 I                LHLFont_DebugString(Buffer);' e) L/ o" ^! k0 r  E5 I# u; _
               
' K/ d  O4 l, w! \& a               
7 ]9 D( `  p  N) I/ y                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)
3 {& ]# m$ v* m: J                {
7 t! r. ?; N$ j- y                        sprintf(Buffer,"接口%d的端点1为输入",myi);
. d0 V, g" m3 V) {( @9 m6 O                }; u  |* \# G9 z8 |6 I- H/ Z
                else( ]" ]) m5 z, K
                {
& c" y  U# s* v2 A                        sprintf(Buffer,"接口%d的端点1为输出",myi);4 D1 j' J9 g7 y8 z9 o) F8 G
                }
+ ]7 ]* w1 ?0 `" t1 M                LHLFont_DebugString(Buffer);
; e- f" {2 O4 f% L   Y# o- Q3 A! s) Z
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,
, ^! u) M+ {, e: V( ?- _                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);, J' B# ]# O4 _
                LHLFont_DebugString(Buffer);        : ]+ m- X6 J5 ?# f$ m, F3 A6 @
  }* R' J+ l- N% L* ?$ _/ f
         
- a" z9 x& G' ~* a( E  Z/ A        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;. d) W. x" |8 V, g. f7 b4 e* _, T
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;! ^# [+ F4 A: }( K' S. f, j8 o
        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;
4 P; {; C: @* z6 b        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;
" Z- c- d0 t4 u' V/ w( l        : I, A6 k+ }, v$ V+ f! O$ ^
  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);
( g3 e, S# |3 d7 i+ M% d  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  
, e  F, Z6 h9 V9 y4 N  4 D( Y' F( q, V$ l* u% \& M
        status = USBH_Open_Channel  (pdev,1 f) [4 y- q8 {  ~- b
                                                                                        myClass.hc_num_out,) J) I$ O9 ^% _6 U
                                                                                        pphost->device_prop.address,0 n$ \) m3 K; H
                                                                                        pphost->device_prop.speed,
& b" c+ s' Z3 |% d: C6 e7 o                                                                                        EP_TYPE_BULK,
& E! r$ N: M; d, V' v. ~0 R                                                                                        myClass.MSBulkOutEpSize);  
( w- r# {$ N1 V( j! h  E0 C6 |        if(status == HC_OK)* G: i* ]; r$ \& n8 V2 U
        status = USBH_Open_Channel  (pdev,& Q& O0 _& ^- Y; Y, n# ^6 N
                                                                                        myClass.hc_num_in,) Y& ]! V& l# P& j
                                                                                        pphost->device_prop.address,, e; [4 o- x& ?) D5 k4 V/ s  U. F
                                                                                        pphost->device_prop.speed,
* Z/ E: r' j- H+ E. s                                                                                        EP_TYPE_BULK,; d  i) [5 @" E8 G% i( p" o6 A' S
                                                                                        myClass.MSBulkInEpSize);
; l1 t" h: y# g/ @0 C, V$ k, Q* f        if(status == HC_OK)
6 {0 q" Y4 w- s        LHLFont_DebugString("USBH Open Channel Ok");$ b% }: T- n! w$ k% o6 K
        
: `, }* z6 z$ e9 w! u: E) b* E$ _  R        Receive_Retry = 2;4 M& u4 w( \. _1 O6 X
        2 B0 r2 g; C- n7 M, o/ k& N" g
        return USBH_OK;                                 4 Q% K; R3 _9 _, [0 F0 U$ t
}
* H9 ?+ S6 k/ S$ S! c3 b' G! b& F            
8 i% `- D, d; B% gvoid DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)
6 {8 r! m6 x$ q  }( a{
" \2 f& p( M+ E! q  if ( MSC_Machine.hc_num_out)2 k7 \& T4 f0 `) d  F5 G1 x6 z
  {! G! c0 F8 I# @4 J7 [% e
    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);) E) m2 h; C, U" {/ V
    USBH_Free_Channel  (pdev, myClass.hc_num_out);
; h9 v' Y5 a6 b    myClass.hc_num_out = 0;     /* Reset the Channel as Free */
8 |- O! ~9 n+ ~1 o( i. H$ I  }# P* {  F  N* @1 J, T
   3 R4 @1 w3 M! d5 E
  if ( MSC_Machine.hc_num_in)
, C, v9 i6 |: T, L& O2 x  {
- D+ W( [8 r' ^6 V4 r: [/ m    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);& Z' r6 E& ~# @- m2 M% V
    USBH_Free_Channel  (pdev, myClass.hc_num_in);. l0 `  j5 P9 d0 A
    myClass.hc_num_in = 0;     /* Reset the Channel as Free */# L- s  A3 V$ p) U3 t
  } / v& i2 {5 ^" Y+ @7 j! s, A+ B
}
8 G$ e* `6 S# u4 Z# |+ _USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost): n' y7 c/ T- H
{
, U+ T) X5 C$ h: @4 L% {- C        return USBH_OK;. Y. C3 ^" r/ b  P4 s0 `* S
}
3 ~6 |" U& c7 Y; y7 P8 }unsigned char usbbuffer[70];9 |+ f4 l5 P% `) z% ?. C# Y$ L
unsigned short usbbufferlen=0;
. X. o, {- H1 j4 _9 w' Y4 G $ L2 T& i. K7 p" N3 P" T3 _+ J
unsigned char SendMechine = 2;
: p- ~, G: A/ R5 }: K# N  }int SendCount = 0;0 N0 H% v7 ?" l- X2 X4 j& e
6 A  l; d+ j- x) X  v0 j3 e
unsigned char ReceiveMechine = 0;( Y8 v; |# q% m0 e7 K* F: u
int ReceiveCount = 0;
- u, a! w4 C! t5 |! O0 xunsigned dataReceived = 0;) z8 y/ I9 ]3 ]' n: J- H
+ _. O) b& k! k- U+ n
void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)5 v' M% H- J: @1 i: k" M2 y) |
{$ c% X$ z6 O! D
        unsigned char *ptmp=usbbuffer;
0 o" \, W5 L( J( i' W        3 ~! H2 ?; l0 U
        usbbufferlen = len;
  y* c' ]0 N# o( ^        
, I: ^7 Z$ M: ^7 x9 S: \        while(len--)% R8 u  ?) o6 W$ F9 H: E
        {
& O# v* i! e3 C8 A                *ptmp++ = *pbuffer++;
3 d+ l' A! P. G" u. B- Z- H        }3 n1 t5 k/ W# t- L  e6 O3 _. [3 R
}
( ~3 Y  Y& p" I! [# O, B5 z  P3 NUSBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)
- M; _6 n" ]) D- G4 C  q: {{; Q& N1 U$ N7 s4 T% ?8 l
        if(SendMechine==1)" t* c8 j9 e& q- o+ y& W
        {
, y. x9 s% f  C! f% k4 h# [2 L                SendMechine=0;; `7 T- }% C# P  ?: Y. X) `# c
                USBH_BulkSendData (pdev,* R/ @6 r6 q' _2 ?
                                                                                                 (unsigned char *)usbbuffer,
, H% v& o7 a2 `) d8 E, X/ v                                                                                                 usbbufferlen ,
. q  u$ o+ R: U                                                                                                 myClass.hc_num_out);
1 }6 Z2 }7 Y1 p' V3 @7 v! d                SendCount=0;
# j" e# I5 t# ~6 H2 O) l2 h  Y                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)
( C$ m, J( ~) L  p        {; D6 P3 {8 c% g# }
                Receive_Retry--;* M" z1 V4 x3 P( Z5 e
                ReceiveCount=0;
: M5 o! F+ }/ E3 j5 M1 Z                USBH_BulkReceiveData (pdev,
2 ^( z. `( o" S3 G( j2 w: L5 @                                                                 (unsigned char *)usbbuffer+3, & G; a, {1 j4 T/ P( L2 [- ]- X
                                                                 64,
5 Z; ?# h/ f  W8 I3 G                                                                 myClass.hc_num_in);0 \* F" m& ]2 S. }' Y

+ J4 k  S0 X! A                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
4 M+ ]8 b9 t0 g  C! t' H; d您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...
7 X" y! t2 y# t: m2 J  v4 M
请问下 您的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:198 \# r5 G) ~  y7 }! ^: _& `; V
开发3G模块的项目要用到这个,不错

' _9 e% M3 d% E# ^# D0 t& i您好,请问您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 手机版