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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。6 L6 g/ S% I% r6 q. P' `: N+ Y
st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。' @9 s$ l* Z* Z/ d, Q4 y3 W1 a
对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。
6 I' ^8 [7 L6 H( I1 m# o在st官方usb库中,usb类是这样定义的:
, X; w/ N# `" \8 Z$ X : ]: P. G: h3 w# K$ N. T! [
typedef struct _USBH_Class_cb
/ o! t4 s# g! e1 O  U- g1 A! |! g{: z8 w6 s4 T: v* p4 o3 K, B
  USBH_Status  (*Init)\# n' }1 ?" X0 e* r+ t6 F
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线5 ?0 u: Y. B9 [) M2 u, x, Q3 c# g
  void         (*DeInit)\
- l3 x7 }: r. z- y0 u- Q    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源$ N$ l, ~+ U& O
  USBH_Status  (*Requests)\5 a, E$ c4 a2 x
    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求
. `3 @( ?' o* e# w# j( D& D  USBH_Status  (*Machine)\
  U( k' X% _4 b3 r# S7 S/ g/ Z    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程   
) w! ^8 E1 w7 j% r" t  0 l% R# L! H" s7 B
} USBH_Class_cb_TypeDef;
' l! M4 c) c" t2 }, Q. J那么,我们如果要实现一个USB类,就需要编写以上四个函数。, j8 t; S5 |) {+ l- R* Y
下面就是我自己写的一个自定义类:4 f0 C* J. ~$ t) O* j$ O2 H$ E  L
  C% u! U% _! y6 t1 L) U% {1 o* L
typedef struct% H, G. S( g( N0 s6 s
{
. d- E# p# [! u4 I% r  uint8_t              hc_num_in; / s5 k3 j" ~7 t. n2 y
  uint8_t              hc_num_out; / }: d2 k: @5 k  N- a: x( C
  uint8_t              MSBulkOutEp;
9 D- F1 I9 j" [/ _, Z  uint8_t              MSBulkInEp;
% U; W  D. F( R/ j9 ^6 g  ?  uint16_t             MSBulkInEpSize;
, u. s$ s$ d0 j1 c2 R# n; T: K9 Z  uint16_t             MSBulkOutEpSize;* b& B$ e+ P  L* ~+ b
}myClassTypedef;
1 O, a% y, C+ y, m! q1 LmyClassTypedef myClass;
% F/ Z2 e' O# A' a
" c3 }8 r3 m! zUSBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)
! ^2 B8 L6 B  r3 y- z{0 ^2 Y" k/ Q0 J+ |/ U
        USBH_HOST *pphost = phost;3 I4 _% K4 q' V. W; }
        short myi;  @( t* F- Z8 c$ @+ x) Q
        char Buffer[50]={0};5 U' W) H* b, i3 f% _2 J2 z8 w
        
4 R; V: x# g3 h- }/ x! V% y: f        unsigned char status;
- B  T$ G* A" F# W3 s3 _        
* u- k7 z8 p+ u$ Z; j/ I; c        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);
& Q. X) q# B7 F/ a: c1 O        LHLFont_DebugString(Buffer);
4 R9 t( P" k) B) K8 v        & N+ v* _8 l" L! m5 @
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)
' r0 Y% m3 U% ~2 m, |6 M        {) Q" I* {& F6 \3 n2 X% c
                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80): ]3 I) O/ ]/ B; g9 }; a. ~% V
                {- g1 T( x0 b; J, h! h% O
                        sprintf(Buffer,"接口%d的端点0为输入",myi);0 ]+ z" i" A1 G; O) a* J  k
                }/ B6 ?! d8 w' J& ~# }* J, g+ w/ o
                else8 U0 L( m; |. n8 K, w, I
                {
6 t8 ~4 y" ~& n# k5 f/ r4 ^                        sprintf(Buffer,"接口%d的端点0为输出",myi);
4 r! |1 B! F2 }1 i" v) s                }' v: a" o0 ~) P! f/ B
                LHLFont_DebugString(Buffer);
! k& A. ~5 ]& m! X) G- e, ~9 y4 N               
, U6 _# d$ |; E+ J                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,
- p; ]$ {0 n9 R4 |% c! y; q                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);  u- n9 o( \3 C9 K$ f9 n
                LHLFont_DebugString(Buffer);
- _7 y: o/ `7 j2 |& n3 Q               
5 @/ g3 D+ ~* ~  B8 O. Q7 f7 K                # ]; ]* P' O: a5 [! e- V& L1 D- Z
                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)
% g% y8 K. I! g8 I' H9 i                {& {! w+ z! S1 q* X! U
                        sprintf(Buffer,"接口%d的端点1为输入",myi);0 u$ }& V! Y6 Y" ^' i
                }$ x8 |3 @0 M* \- ~
                else6 b+ d4 k5 C# X
                {
9 C( j8 }+ f* h' y$ r                        sprintf(Buffer,"接口%d的端点1为输出",myi);, C/ m5 W( w; d
                }
, X) H. k9 X& g0 u                LHLFont_DebugString(Buffer);
7 e' F0 k8 w. G $ s0 c4 m) E8 D7 E9 ?
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,; G* J5 H. T# j2 F7 U
                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);  \4 \% H& t( U# e" x
                LHLFont_DebugString(Buffer);        
, |9 u. t$ `" T6 I  }. z" O5 @8 i9 Z' w3 M8 L
         
1 m- |; B9 K# A. O2 `+ m        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;- a1 h0 I4 W! m
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;& G8 m* W- J2 F2 v0 Z6 z: p7 y
        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;
4 C+ X/ c& A' k5 b2 e        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;9 [$ t- b/ w& y
        : E7 O1 L9 K" a0 D, G6 M, c: }
  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);
. H; B8 f3 ^( j/ v2 [+ M) q  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  
: a" d4 a0 F4 J, ~1 O, b4 Z  
4 q5 Q8 w& F- C; q        status = USBH_Open_Channel  (pdev,5 Y6 ~1 J; s0 W% h0 T0 N; f
                                                                                        myClass.hc_num_out," ?* ^7 u5 R" Q) b
                                                                                        pphost->device_prop.address,& [& T9 l; ]6 Q9 V) X' Q" D, ~
                                                                                        pphost->device_prop.speed,
' A1 T5 C( b( F, g' F                                                                                        EP_TYPE_BULK,: D1 Y- i5 B+ C. u; z$ O! G0 Y
                                                                                        myClass.MSBulkOutEpSize);  6 f2 ~! X: v- q7 I8 v$ S
        if(status == HC_OK). K) N" s7 c6 x# d, J: P
        status = USBH_Open_Channel  (pdev,1 b; L9 }7 T1 ~  f' [) i* v% P
                                                                                        myClass.hc_num_in,3 z  I% k% C/ J1 D& c2 c3 A
                                                                                        pphost->device_prop.address,# d8 N- H' o+ D9 \
                                                                                        pphost->device_prop.speed,  w8 o$ W7 i- w) A% p' b
                                                                                        EP_TYPE_BULK,
/ Z$ @. i. `) [. O2 a7 f                                                                                        myClass.MSBulkInEpSize);& K/ y& H. y* x* a! G
        if(status == HC_OK)
. I' b" E, ^, p1 ?9 p" F$ Y        LHLFont_DebugString("USBH Open Channel Ok");: a3 |0 P; q/ D, A( r, X* Y1 k. \& [
        
  i) y$ f/ P! G. ?, N4 F! P) [; a        Receive_Retry = 2;! D+ L+ t5 m$ e3 ^$ q& y% P
        5 i+ a1 I/ E7 z5 S7 @; m
        return USBH_OK;                                 
# D4 |) Y. ^+ Y+ c, z}' ]0 x' D1 m5 X% R- g9 ~: [- y
              ^& D0 d! v. R9 {+ F) z2 o
void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)
1 p, C- w/ D( Q{9 B2 s8 P, Q* r+ h% d2 j
  if ( MSC_Machine.hc_num_out), u4 v  {; L, r
  {( Q+ J4 T) n% A$ `5 Z! k
    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);
$ F9 {! \. S8 \, ^3 X* P    USBH_Free_Channel  (pdev, myClass.hc_num_out);8 B/ P7 z6 I. t" y( d, e2 k+ X
    myClass.hc_num_out = 0;     /* Reset the Channel as Free */
: Q7 f* B8 F% e. V) \  }3 H, \9 m- y- ]! c$ I
   8 X  J: u& v7 N* \# G
  if ( MSC_Machine.hc_num_in)
( Z* H( Q- ?. \" l  {
) z0 t# R( T9 f6 o0 x    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);
; W8 @4 a& V  G0 v* G" y    USBH_Free_Channel  (pdev, myClass.hc_num_in);
% P$ c" A; ^/ U* r0 V6 \: `    myClass.hc_num_in = 0;     /* Reset the Channel as Free */3 y# b) ~1 c2 ~3 [
  } 6 F, i8 n# D1 |7 {8 K  U1 E
}3 L% j4 s) K& g0 g- S4 T( e
USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)
" L$ F! d3 T8 |7 A, @{0 r! f9 e0 L( T; y
        return USBH_OK;
8 s$ w. d9 O! p1 a2 I9 P}
, [& @; i2 D1 v6 aunsigned char usbbuffer[70];
" v) n& k; ^. D6 E% Sunsigned short usbbufferlen=0;
" R8 |" s4 ]/ \! L# a$ {( @ & i2 D) t) a6 r/ m8 L* b! Q
unsigned char SendMechine = 2;
5 r$ d% {$ L( l! @8 `3 gint SendCount = 0;
, h( e( c7 E" M2 V; t8 [ % U' c8 I+ L) F6 w" K
unsigned char ReceiveMechine = 0;  ~: ]' _; J# b$ z. v; f
int ReceiveCount = 0;: n$ b$ h* z1 ^0 G0 J' f5 i
unsigned dataReceived = 0;
8 L2 _9 A: x+ n$ e
9 _4 a- H* T) Y7 X3 H* `) Zvoid usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)$ J) F! g3 `/ i
{. {* L2 \$ A2 O2 I( R1 k
        unsigned char *ptmp=usbbuffer;
1 {! @  k+ {4 Q; r4 V6 L        / b/ V1 u+ ~' G" J5 E2 L
        usbbufferlen = len;5 l( X) m: s0 l% f
        
2 z" q5 s  T" V6 n7 r, ]+ o, S        while(len--)
* t. i9 u/ D+ W% C5 g        {
/ r4 A4 J3 `+ W7 W                *ptmp++ = *pbuffer++;3 F5 N" i1 j4 b; L" z8 Y; t6 F& e* @, S
        }
% r, K7 c" E* B+ R7 o( b}
' U# Y' ]7 ^2 W# s* y7 b& YUSBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)
$ u4 s6 A* g# s3 R( C6 f# p{
* ?; l( g* K6 s' o' w% Z        if(SendMechine==1), [( f9 N2 D+ Q$ k% s0 D
        {
! f6 Q& w% H( H- W  M; w2 w5 h, }                SendMechine=0;
' ~  n' C) N' M8 ?* B7 G3 c5 P: `                USBH_BulkSendData (pdev,. h% f6 q5 N$ V0 Z
                                                                                                 (unsigned char *)usbbuffer,
+ h0 I1 n2 Q( M" u# F" B                                                                                                 usbbufferlen , : F/ t" u8 J* X: o7 ^/ ]$ |% N
                                                                                                 myClass.hc_num_out);1 u8 n9 Y& d* a; r7 p
                SendCount=0;/ R, d7 I& B$ W# T! C. o! h; U
                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)
) `# p; Q; ?2 ^3 W% O        {+ ?# H' C7 P2 G( ]6 F
                Receive_Retry--;0 C/ W( ~+ z( M
                ReceiveCount=0;
" Y  c' C9 [: S4 w$ {, W                USBH_BulkReceiveData (pdev,  R# u: n* s5 F. t0 ~- ^4 o
                                                                 (unsigned char *)usbbuffer+3,
1 z2 y" X  W! Z# {2 t, H$ y* N                                                                 64,
' a* x5 l: j; y. B: C  T                                                                 myClass.hc_num_in);6 G0 q1 J9 y; q+ O9 m

! y! J/ K) u. |. Z* g; n5 p- @' M                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:315 A" {. e6 c& X: C# Z8 j- @' w! Z- o
您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...

  Y% A- Q, ^( W. j3 J请问下 您的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:192 p: u6 u$ C( j; Q5 U+ z/ q
开发3G模块的项目要用到这个,不错

& t- Y* K* A) B: [$ u  V& N- F您好,请问您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 手机版