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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。; m; U' ^9 E( U8 p2 P
st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。- p( _3 |% c8 L3 s3 i0 f  _( t) W
对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。" P' Z0 y- f- n' k- q6 x
在st官方usb库中,usb类是这样定义的:/ }. o. X+ k- y
: P7 H# Q7 j- t0 L4 C
typedef struct _USBH_Class_cb' p; s0 \5 T  a! D1 A
{* c7 v8 j, m9 P* O+ E
  USBH_Status  (*Init)\0 Y2 H- o' |* H$ D, u
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线3 Z6 u. C3 d7 v2 L/ T- _) d
  void         (*DeInit)\9 \, l9 b" C, E
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源
2 R! U: d* \% T; X  USBH_Status  (*Requests)\
9 f/ p5 E2 s% `9 x: O! H8 G    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求$ [( n" E  ^, z
  USBH_Status  (*Machine)\
, s- A1 X; ~3 s2 S, A. l9 G    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程   
( X8 G5 g% }/ b- X1 i+ g  # k& [3 T  [0 n& A% Q
} USBH_Class_cb_TypeDef;
5 K! ]! Z; m2 c1 v. [7 x% F2 c那么,我们如果要实现一个USB类,就需要编写以上四个函数。
! F; U+ H" p) B% k下面就是我自己写的一个自定义类:
/ |7 m! t' X* `  H+ j" J" z6 d   _; ^$ T: X  b- w. f/ ]
typedef struct
2 h" k+ J+ g/ c2 }: }2 u{" Z, F# h) r1 {/ B/ Y
  uint8_t              hc_num_in; ' i) {5 V3 y8 u; V( W
  uint8_t              hc_num_out;
; G" `: k" s7 b8 w  uint8_t              MSBulkOutEp;, b/ D) i) ?- H0 t# q
  uint8_t              MSBulkInEp;* N8 r4 B7 Q7 [+ h6 F" {
  uint16_t             MSBulkInEpSize;" C# p: Z9 D8 _
  uint16_t             MSBulkOutEpSize;
% @* T* p2 y( ^- X' d}myClassTypedef;0 x6 r0 h9 K0 m4 M' S
myClassTypedef myClass;; C1 ?- L% h& B4 f  f) E

, }" q0 N2 n5 |# F9 xUSBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)
$ ]8 c9 A, u! F{
, J* [) a3 H" D2 w        USBH_HOST *pphost = phost;
" a7 `% x0 M2 A' a6 X- r. w        short myi;
- v: m# [* n) i1 W0 Z. k        char Buffer[50]={0};
5 O& S3 b* ^0 V        
. q& w, m0 ^' W1 ?8 E        unsigned char status;( S$ T4 O6 U% p5 C/ `, [7 i& i
        4 h, x- G: h! X( @: {
        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);+ q9 L& K* Z$ [* J( u  e
        LHLFont_DebugString(Buffer);2 N! E" H; @% `* T! z9 _6 q
          h4 @9 |* i- T3 v% i1 M4 a# E
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)
% _6 F: F; L9 ?4 d        {
$ O5 i& m/ z: o+ w1 M/ k                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)
1 G5 P" ~0 P3 f  j) M; N                {
0 @6 l6 t2 x) f5 r! |( f                        sprintf(Buffer,"接口%d的端点0为输入",myi);  D4 y- g7 Z, k. J9 I
                }% z+ [: Q& m+ p9 H# ]# a
                else, z' K  T; J' i! \/ w
                {
2 r% `& U5 o0 L% |# s" c                        sprintf(Buffer,"接口%d的端点0为输出",myi);
$ |7 o4 F$ B$ v9 w) R* h0 E; h                }
# b1 k9 J( `% b* H( P                LHLFont_DebugString(Buffer);
! N) k$ H- B* ]' i& j                5 {7 m) \% Y+ W( Z/ }: m
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,2 S  x8 h* E) y5 p  C" z9 E7 s" `& n! `
                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);
, r2 C1 M+ a9 v; M5 I% r                LHLFont_DebugString(Buffer);
1 J3 Z# \$ q  X" `3 X$ [) x                  A8 z9 p6 _2 b& ]$ ~, O
                7 l3 D1 r- A. O/ A
                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)* @1 J3 E! t5 m1 R
                {
! ]' E! m; d6 O) j                        sprintf(Buffer,"接口%d的端点1为输入",myi);
% |9 g* p: q9 |9 Q' K                }$ s) R1 |# K, F* M+ W
                else2 a1 G4 x" b/ _0 C
                {' P3 {& z2 L. E& E1 O* r9 B; X- M
                        sprintf(Buffer,"接口%d的端点1为输出",myi);
$ u& B* R9 Z+ @0 E( T# c& C8 _                }
2 O  [( P9 G. ?: I4 M+ C                LHLFont_DebugString(Buffer);
1 V% N6 f, V& m4 G
7 D6 k! f$ Q) |1 q                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,' I. `6 H% B7 W+ H  i
                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);8 f, x" K0 s0 ^2 m( _* ^
                LHLFont_DebugString(Buffer);        " V1 h& }" J* _, W8 ?% a8 T
  }
! `2 A1 @( D% H2 m9 M8 W: c2 T$ g3 ]  x          , \8 g& r; Q( o; s$ r) q+ C
        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;
5 H( b- _( M+ V) Z+ C& ~, {  T7 Z        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;( P3 F0 ?' c8 ]9 ~
        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;/ q/ I& B2 M) p8 L" v4 Q5 Q
        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;
! O1 O8 X) s) }  F; U1 y        
$ a0 W- g$ M4 K  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);5 ]: v6 w9 |2 O0 x) |1 \
  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  , i& z/ A8 _% U1 V: _  S/ Y
  
$ G2 U) h" }( C* W! z% b        status = USBH_Open_Channel  (pdev,/ }) i1 J  m: C6 \+ S! _
                                                                                        myClass.hc_num_out,5 M+ g0 Q1 C1 @; m* n; K' g
                                                                                        pphost->device_prop.address,
% w+ I# F! x8 W1 l7 l( P( s                                                                                        pphost->device_prop.speed,
( l8 x& r1 A  Z& J                                                                                        EP_TYPE_BULK,3 R% B8 k; \  [; Y/ ]
                                                                                        myClass.MSBulkOutEpSize);  # p3 W' E& r- ~/ J
        if(status == HC_OK)$ ]' n' \$ e2 w+ F  ^
        status = USBH_Open_Channel  (pdev," J. f+ I$ G. S5 K
                                                                                        myClass.hc_num_in,  V3 f4 d3 O' Z- H* U1 `2 l) q7 P
                                                                                        pphost->device_prop.address,
) p  J3 w/ Q5 b4 X! f                                                                                        pphost->device_prop.speed,
# g  m# S. D( z6 T4 D                                                                                        EP_TYPE_BULK,/ ]+ U& ], P, x- \! u& D: E, T
                                                                                        myClass.MSBulkInEpSize);- b  k8 `  J) p1 a# x1 j
        if(status == HC_OK)4 m  q. q  M' `# R7 N" O( W
        LHLFont_DebugString("USBH Open Channel Ok");7 U2 q/ z2 ?& {- D# `1 e
        
3 T- t/ _- ]4 \7 `        Receive_Retry = 2;) Z+ N0 O0 s' g
        
5 l+ F, B# z8 ]        return USBH_OK;                                 
0 \. m& v5 d) \}  O7 |( h) M5 H5 Q3 E
            
: O) P6 P; J' I; U, i& xvoid DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost). z. M* b0 E* c8 i3 h. b( V5 D0 s
{4 R  n+ u/ E; N6 x) n, [* o
  if ( MSC_Machine.hc_num_out)/ z; \$ }6 U' \  v  \
  {
6 K9 {& P" U2 l, k2 ~9 j3 Q" l    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);0 f: L! u* r* Z
    USBH_Free_Channel  (pdev, myClass.hc_num_out);" W/ d2 d4 H0 H
    myClass.hc_num_out = 0;     /* Reset the Channel as Free */
* Z4 B  J( n- O* ^3 h' _) H) H, G  }
  K, a, X4 A7 P. X/ i* V   
3 |; w9 _5 m: i  if ( MSC_Machine.hc_num_in)* n( U5 U# B, U4 L3 K3 T0 h
  {
' H: F: k' W& Z1 g0 A2 E$ |# K    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);
- x. b7 E& s1 m/ H    USBH_Free_Channel  (pdev, myClass.hc_num_in);8 P* S) r# G2 ~, {# L' M
    myClass.hc_num_in = 0;     /* Reset the Channel as Free */
+ d7 G5 j2 D% G# V4 V  } & g8 t7 d- ^* B! y$ u( G
}
- `6 S- v  W: O3 K, v$ |USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)' ]# \/ ]6 F' N/ G( {
{- M4 T$ O5 P& Y8 m$ a
        return USBH_OK;
- O- w) i$ O# k" R( S. [}& F5 B% b5 q) ?8 ~" ]
unsigned char usbbuffer[70];2 K5 x% _, ^% a9 l. h. G1 s, C/ J
unsigned short usbbufferlen=0;8 G6 x" a* _6 F2 b

) j% t- m  d7 S, t$ u) ?unsigned char SendMechine = 2;) V- `3 {% `7 H
int SendCount = 0;" F- g% f& n0 ?( l: p' N1 k

% `- T$ \" }; x$ F; p. {& lunsigned char ReceiveMechine = 0;8 _; q1 T, [! M! i4 d- B' f7 U
int ReceiveCount = 0;
, J* r; Y5 }$ [3 a2 Wunsigned dataReceived = 0;
- s% }+ o2 t6 b3 E
8 u3 |4 Q! Q( jvoid usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)0 ]4 X, l$ r4 F6 P5 x$ W
{. S, ^# K+ ?+ Z" {: k
        unsigned char *ptmp=usbbuffer;
! W0 b% M- {8 T" s+ [4 b. G4 `) u        
9 N' h7 b' T$ F3 K        usbbufferlen = len;
! L. C4 }; G+ H9 [# ]- w        
) C$ H1 Y, @$ ~        while(len--)
  y" ^# o3 @, {6 _& r0 I        {
) }4 S, V1 g: I1 c6 `4 r% ]                *ptmp++ = *pbuffer++;
3 n, a, }5 E5 B: }/ p* t        }, D( W* h4 g: N# L$ L3 Q
}* O3 A" s4 b9 L1 O- k& T8 i
USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)- N/ u5 m, U0 r) E: @3 k+ j) f
{
2 u$ G) b8 }$ k4 h6 u        if(SendMechine==1)
( m9 ^4 |! g1 G6 Z# A0 }$ U+ {        {  A( m  c9 o( P8 o+ N
                SendMechine=0;1 a$ y# |8 @( Y, C* v( z
                USBH_BulkSendData (pdev,* b  `( z4 J9 x  d
                                                                                                 (unsigned char *)usbbuffer, , }% y. |! Z% c' ]
                                                                                                 usbbufferlen ,
9 |+ ^% o; f! _. x0 N2 _( Z- [% z                                                                                                 myClass.hc_num_out);5 S/ V6 s  |. z) v4 T/ e$ o* O! z
                SendCount=0;$ Z  |1 @' S  z8 N$ C- I
                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)3 j6 g5 I0 l& j' N
        {
$ z: v$ U# D2 a2 I) [- V) N+ L  Y                Receive_Retry--;: K* `- Q$ X. d. W7 [
                ReceiveCount=0;/ S8 P) m9 K5 O# B- A* v, O' x- c
                USBH_BulkReceiveData (pdev,
  n9 t3 [& ^0 E0 ]8 y. z; _# P                                                                 (unsigned char *)usbbuffer+3,
- a! j  S1 M, _% `                                                                 64, 4 {  i& v+ X$ g& g3 D4 G( I+ z; S# |9 o
                                                                 myClass.hc_num_in);  X; ]4 ~7 E' v( N' a9 I
. @. N- Y$ X" e, h! w; x- N
                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:318 J  Y( @+ h! z, r; i- f% r
您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...

5 f5 E9 w; H% q/ K% T- n: f请问下 您的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- e2 L8 z* K, ~! }, k5 J. @0 Y
开发3G模块的项目要用到这个,不错
" V' ?4 |: L2 V5 a, V! D
您好,请问您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 手机版