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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。
& q$ d% I+ J6 \. f$ qst官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。9 \9 e# r2 f6 w
对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。
. H% s7 o  k& a* R( F在st官方usb库中,usb类是这样定义的:
% l/ ^. _8 ]3 N) I  k' T
$ ?+ ]. b9 M4 ^# ftypedef struct _USBH_Class_cb' v. e3 `2 A' @* X
{7 h( W  J/ O0 g1 j# E2 i
  USBH_Status  (*Init)\
, V' z& D% W) }9 d    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线& {' t) ]: {! T) \5 {& A
  void         (*DeInit)\) B) x& b$ j5 Z# W
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源
) Z  U2 F) q. `  USBH_Status  (*Requests)\9 m* |/ M" @) e: G
    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求
- E; i0 K% U4 ^: X3 E  USBH_Status  (*Machine)\
, h- v' A& V* X1 B  b& B% D( C    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程    6 }3 ^  x1 [+ }& F4 m+ l* d
  
4 G# R& i9 l8 Y/ t# ~} USBH_Class_cb_TypeDef;3 }" R% i3 ^: R) z6 R7 _
那么,我们如果要实现一个USB类,就需要编写以上四个函数。& W! V% T, \! H4 X
下面就是我自己写的一个自定义类:
. |) D2 I0 Z; x7 [ 5 F4 ?5 H# j# m) `- W( H" H; U% B
typedef struct
( L6 q! T3 V/ i5 P{
$ H& n' `% [3 p, a" v7 s/ c% m& J8 m  uint8_t              hc_num_in;
6 ^7 }, c) R/ `4 T# h  uint8_t              hc_num_out;
8 r4 e6 O- Q( [: f6 |  i4 n" z  uint8_t              MSBulkOutEp;
! E8 G' @+ o/ B" T8 w9 l# O  uint8_t              MSBulkInEp;
2 E$ _- U5 h: H0 |. [) D  uint16_t             MSBulkInEpSize;% t& r1 L1 Z# k6 D4 E# P
  uint16_t             MSBulkOutEpSize;' u8 q5 w) P- S% u
}myClassTypedef;3 W* u! b9 x0 q' s5 L) ^3 r
myClassTypedef myClass;+ ]- m$ F5 N, ^% E& _
* d8 ]3 f+ }8 S/ O$ ^
USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)
( W0 k" a5 x2 A: L! K{/ b% y3 g3 V* [
        USBH_HOST *pphost = phost;
& o3 c5 q+ j" ?! V2 D        short myi;4 l  T/ T( H9 `% T! `* L
        char Buffer[50]={0};
0 U0 p3 [# s+ s* _2 d) H        
5 {- u! _3 j4 d( ?/ {        unsigned char status;
9 n+ A9 ]9 E6 ]3 P0 Z( ~7 D        
6 p/ S0 @! M0 V/ V. w8 a3 F        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);
4 i+ L( U1 G5 r) s5 ~- }9 I        LHLFont_DebugString(Buffer);: n- y7 z# o8 P4 Z$ p1 p! E
        
1 B- N; v4 F; s9 d9 g. t        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)) Y2 r5 C0 Z- V% H: ]- {, K- i
        {
! I* `1 p% y5 y" g" W1 ^- Y                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)7 ~  T- x' L& x8 ~3 P
                {
0 W) m) ]7 G% F                        sprintf(Buffer,"接口%d的端点0为输入",myi);
2 J0 U$ |9 n, o                }" \1 a+ z4 a2 c) D8 M9 F
                else$ V* J: @  K9 `9 C7 ]  U$ [, ]
                {
3 `0 m- _0 Q4 |: N) l+ D$ h7 }8 |                        sprintf(Buffer,"接口%d的端点0为输出",myi);2 y+ B3 J: h$ o% s
                }4 O8 B. v1 D: @- g( m# _" e& [
                LHLFont_DebugString(Buffer);
1 k8 s: p6 c7 }3 {: f7 |5 C8 ~                0 F6 ?3 ~3 r' R. Z+ x
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,* @- Z; i/ V# Q; P
                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);/ y; j' ?2 W3 {. Q" F1 ^
                LHLFont_DebugString(Buffer);, H! i) y; p: J5 T& W
                % c3 ~, U5 u( H, Z8 R: v, r0 r* p
                / q/ N5 k" y& J8 _. |% O
                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)
1 ]  c6 w& |6 f; ]                {! H# P5 M7 b2 z
                        sprintf(Buffer,"接口%d的端点1为输入",myi);
8 R$ S: `' a  f. Q                }
! n; {$ I, `$ Y8 t6 Q8 w                else; b7 O0 P# `5 m- ^  r1 l
                {
' M% X; x4 V, x, @$ @: f8 T! E                        sprintf(Buffer,"接口%d的端点1为输出",myi);
  X5 e5 l( Q" f6 s: P9 U, p                }
. z4 @! x1 k) j( s                LHLFont_DebugString(Buffer);" j: t/ y3 d8 z
5 F% V7 ]4 \6 ~3 E' W) v
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,& q  u2 A% d0 v" J+ r, U5 l
                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);. K7 S1 d) V! K+ P
                LHLFont_DebugString(Buffer);        , }- E& u; l" U; B" g
  }
$ R" ~8 F: y! K. u1 B         
% t% j' ?2 z1 S% [8 H        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;
- [( Y0 v6 [4 @        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;
2 I, ~6 ~1 l! P7 D  W# I        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;# H! ~" r: n; n8 G
        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;, p- S; ?8 z. X8 u$ g
        3 T$ K7 P  m) @3 O! n+ P& Y# r9 _
  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);
3 k" y. \7 \- y# S$ x  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  " q' R6 D1 _) W1 G0 }
  
5 \% E7 n' g, p8 Y; r& k        status = USBH_Open_Channel  (pdev,% `9 B5 f" W# Y. t2 D. F' J
                                                                                        myClass.hc_num_out,; R; g6 Z8 E2 @% f/ C
                                                                                        pphost->device_prop.address,
+ ~* u0 I# H" c& H( {4 J                                                                                        pphost->device_prop.speed,
- a3 h# S8 v; O( @+ Q" p1 t                                                                                        EP_TYPE_BULK,
1 E2 `" r* O4 B                                                                                        myClass.MSBulkOutEpSize);  * s8 I$ \! n4 S) |
        if(status == HC_OK)$ k. j0 _1 W3 c& ~/ F/ p( v
        status = USBH_Open_Channel  (pdev,
! M7 b  g3 A+ n- {' O  O& v) y7 u# i                                                                                        myClass.hc_num_in,
$ }1 ~2 o: ?0 Q! [/ _                                                                                        pphost->device_prop.address,
. r' s9 r/ b( Q+ A/ I6 }, F                                                                                        pphost->device_prop.speed,! f* _; i$ }' z6 j+ r( w
                                                                                        EP_TYPE_BULK,
! b; A7 ]- B# l, @' H0 g                                                                                        myClass.MSBulkInEpSize);
" j* c! c$ \6 v* Y6 |        if(status == HC_OK)
7 C( l7 s; C( c7 P9 L        LHLFont_DebugString("USBH Open Channel Ok");
- F9 J& A- w; v+ O        5 y8 @3 I1 b2 R( {/ x1 L
        Receive_Retry = 2;
- b+ K. s3 Z' g! O4 o! S0 A) M        5 _6 w/ d" s; X7 L$ g2 R- b
        return USBH_OK;                                 
. K" K$ r  Z: f- D! _4 E( L9 u}9 `, H' X/ T- H
            
* k3 |6 E' x+ W* b3 M8 Pvoid DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)
; V8 G" `! u, s+ L* Q/ \{9 D+ H. l$ ^: c0 g% S4 a
  if ( MSC_Machine.hc_num_out)
, G% k9 ?/ J3 V3 j( l4 J  {
3 f- M, S9 N  Z7 Z8 D: }0 c    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);$ c! O, U4 T, J
    USBH_Free_Channel  (pdev, myClass.hc_num_out);
" u7 T- f3 ]4 i+ p- u    myClass.hc_num_out = 0;     /* Reset the Channel as Free */) @' c& ?- `8 s
  }  p( a! z. ]) r3 ^7 E9 Y: S
   # X. ?  I$ t$ @# }  Q4 T
  if ( MSC_Machine.hc_num_in): ?; J9 |  [# l/ Y8 s7 L
  {5 N/ j/ d' N/ r2 T; e* {
    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);
2 m+ X! a3 [7 G    USBH_Free_Channel  (pdev, myClass.hc_num_in);
0 n' _, l8 Q# m4 M' m2 G1 Y# |    myClass.hc_num_in = 0;     /* Reset the Channel as Free */  e( x" l/ J; }
  } 0 |6 t' h3 R) C% a3 k
}6 O! H; C! y+ J+ z, j
USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)
: B* N/ y3 o  z, V{! f6 a9 P& ~/ J6 c8 |3 J7 [! e2 r
        return USBH_OK;" K6 v9 a2 ~& S
}7 A4 m, [7 F) v8 G# g4 k- O
unsigned char usbbuffer[70];
) K% B" R  g. j0 N# I1 g8 z! f5 B- l' Qunsigned short usbbufferlen=0;) ?( i6 R2 N: Z" u5 p  _1 N
; d7 e$ q: z9 y1 \8 g5 }
unsigned char SendMechine = 2;
9 C3 V) F% p: \1 gint SendCount = 0;* A+ h$ U6 b: o8 H4 P: e
' W; H+ x) B# I, M' |2 I! w
unsigned char ReceiveMechine = 0;8 c$ l5 H, a% R3 I. E6 Q& `
int ReceiveCount = 0;
6 k& T4 G( c2 Eunsigned dataReceived = 0;
/ H; k. b' j2 q) v: S; o9 f
2 B: K: q/ t+ a  m) ^; uvoid usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)/ Q; i# O" \0 i! v% _1 y4 n
{
8 J8 e/ x! Z) S6 _. f& f        unsigned char *ptmp=usbbuffer;, t2 m& p- \$ |3 b8 {8 Q9 E
        
4 s8 U( t& @# o7 A& D: c; P        usbbufferlen = len;- I- n, W* z! \: e( C- j% I
        
3 Z' v7 S% y- @        while(len--)
3 A; [* x/ Z/ {" ~* J2 q- ~4 C        {
" j0 i5 p" Y4 |. u7 r                *ptmp++ = *pbuffer++;
) ~4 g4 A6 q! o$ T! V0 k: n        }6 k9 j$ x( g5 t% t* q4 Q
}
% j9 H8 g7 I+ K5 Z. yUSBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)8 M( u; }7 ?& }- a* F
{
0 K; t$ \  D. U        if(SendMechine==1)
- W4 U# ~- z) W* m3 M        {  K, T7 U% L9 D8 w
                SendMechine=0;% z0 j5 l! ~, r/ j
                USBH_BulkSendData (pdev,9 U' f/ q3 N0 n. G
                                                                                                 (unsigned char *)usbbuffer,
  Z' X" q* r2 N  _9 O                                                                                                 usbbufferlen , " K+ F; F& c9 l
                                                                                                 myClass.hc_num_out);
" L! Z4 N9 c* V' J  E2 K: `                SendCount=0;
& t+ i, w: p9 x                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)9 a% o( h1 b" A5 N- h2 u6 t  O, ^
        {
5 k1 F# a1 A- ~/ E" d' E4 T: v: U$ c                Receive_Retry--;
2 B% q  A! m$ P+ \3 u                ReceiveCount=0;
0 Z5 c  {" n0 [6 ^9 `2 w4 x3 G                USBH_BulkReceiveData (pdev," c3 H7 y! T1 c5 r  m+ \$ e7 t4 ]. T
                                                                 (unsigned char *)usbbuffer+3, , W3 D% p+ X8 x- D+ x
                                                                 64,
! y' m9 W, l, ~- ]6 E, c: `                                                                 myClass.hc_num_in);
% b; ~, F6 ^( O2 [" C& e9 g' [, ~4 B4 u
                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:319 _1 ^% N# G% @8 ]& Q" F" w
您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...
# J$ i5 n+ i% Y! z, j5 {
请问下 您的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" y* R0 |7 M2 d3 c. H* _
开发3G模块的项目要用到这个,不错

& u* s/ n% c+ c3 ]您好,请问您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 手机版