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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。2 y/ r; ~# [* P/ k
st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。
8 G! `6 r+ t0 d) I/ h对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。
! x3 V& Q2 m, q" A1 v在st官方usb库中,usb类是这样定义的:
! }' a5 Q* ]! F" |' A% v) ? 0 @) s; H* p* X
typedef struct _USBH_Class_cb
, N; x, ^5 c/ E8 p% B{
  o. Y. t8 x* G+ q  USBH_Status  (*Init)\
* Z$ P! J' _  o    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线
# l. C" U. l- X% {3 _6 r3 f  void         (*DeInit)\
; h- |/ ^3 s" c. ]" O( `7 u  `    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源& t0 ~$ n. u2 v7 F" o
  USBH_Status  (*Requests)\- D/ |  I) F, d/ K+ T% y: y
    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求# P  m/ K* W" ]" ]! A
  USBH_Status  (*Machine)\
) C  {( b; V( U    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程   
+ ?% v0 }5 R! N8 X- |1 S  , O: t' u/ b3 G1 z9 K
} USBH_Class_cb_TypeDef;
# W- D3 I& y  n; u; ^那么,我们如果要实现一个USB类,就需要编写以上四个函数。9 _$ N% b) X5 F
下面就是我自己写的一个自定义类:$ d: t- t4 z1 T. g' z! K
( S9 v$ x1 q2 x* t
typedef struct, b5 w" f6 a3 X# E8 L
{- x0 q' X' r- z* z7 i
  uint8_t              hc_num_in; % ^- \& q5 f" t7 w* q% k4 A6 v, }
  uint8_t              hc_num_out;
0 [0 q. f. M1 f$ n8 S. \  uint8_t              MSBulkOutEp;+ u6 j3 o9 b; ^; a3 V
  uint8_t              MSBulkInEp;
) [8 X' `+ y2 J/ I% K1 U  uint16_t             MSBulkInEpSize;" e2 g* C+ R# c5 a& \6 K  M
  uint16_t             MSBulkOutEpSize;
, T5 f/ ~4 v- `: e# p) `2 P}myClassTypedef;- u' N4 R' S& [% x7 J6 ?1 I
myClassTypedef myClass;
0 a: g* r. \( ?! ^/ C% [
4 S( S2 y& D# _' o: R+ E  C5 OUSBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost), N4 ~! o1 }" d8 s
{
! t+ p5 K  h: L+ s0 q        USBH_HOST *pphost = phost;
' Q6 j3 ^6 i0 [# Z# [" x1 Z        short myi;
( M, p' X+ o( A' V7 F        char Buffer[50]={0};
' f4 m2 o( J& M9 ]: q/ U% P        
( G  P" Z& d% b  i( Y& D, x% @5 Z        unsigned char status;
+ D* j+ Z" D4 T& j- G7 J+ a        
8 }% u: `! }% @7 k% l/ j5 r        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);
& E$ q; ?  c0 H1 p        LHLFont_DebugString(Buffer);, F: z8 ?5 R- Q
        
$ N' ~2 w/ v" m4 d0 h; W        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)
( v# N' V- d, L! Z        {
+ h; U9 B/ y! Q2 A/ @                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)- Z1 ]) _* C; o  ^" ?6 e
                {
: B' G5 i5 |- N' m: j" P3 r" N                        sprintf(Buffer,"接口%d的端点0为输入",myi);: |7 p5 E. ~2 q- ~
                }
1 i3 w, H; e* o# G9 t                else
0 q2 s4 p9 G# q/ ~, N                {
# I' q0 h3 I- T5 Y- V7 F7 M                        sprintf(Buffer,"接口%d的端点0为输出",myi);2 x- ?, i5 w) `2 b
                }
+ Q" Q4 H! P. K& @/ @                LHLFont_DebugString(Buffer);
+ r$ L: `4 X. t, W               
) v; B$ ~4 [; U- B8 \9 A/ m                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,0 s- @, e8 i( w- J; X# B
                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);
9 i) Y) }4 \/ ]                LHLFont_DebugString(Buffer);  n, p3 ]3 X7 M- c' d
               
. h! a: F. U8 @6 T2 e' B3 P  V0 h. n                6 S0 D1 N- ~# v, ~1 J4 @; a' q
                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)
3 L, h5 I6 U6 p, d0 d! ?1 b3 e$ L% n                {! q9 u4 N% r% b: \1 K6 @
                        sprintf(Buffer,"接口%d的端点1为输入",myi);9 U* e$ f6 ^8 V  [
                }
- w( Y. B; t4 ?                else' `! Z5 m* |: m6 n  F( G
                {! ^1 w% {; U% L
                        sprintf(Buffer,"接口%d的端点1为输出",myi);# w7 I  R! o  h6 y) j
                }
8 e! a9 e5 w* W9 d                LHLFont_DebugString(Buffer);- a) y: g% s3 m9 D: ~- ~

! E% v) H9 |; X7 f& Q                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,
# h0 ^! c) p4 j6 O                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);/ A/ J, {/ W" }
                LHLFont_DebugString(Buffer);        ' G5 S  Z, Y7 ?; j) s3 x" ]% j
  }9 L7 R3 m( l2 M+ x* B3 i+ n
          / z( a/ O7 E) o, t9 E
        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;! [# f- f- u2 t
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;9 k! D0 q3 z" x+ f; e  |8 k5 E
        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;6 T" i4 e1 N, f: U! ~, {4 Z
        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;
( u" n9 ~! ^* i, n0 A7 I1 `( Z        1 _( z- G5 G0 R( r. {4 O
  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);
- _7 M: W% n( T# U) e# s, y  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  $ @/ j, X9 ?3 i& k0 A. [# h) ~
  2 W9 X; p  }* ~# A
        status = USBH_Open_Channel  (pdev,; Y, e3 s! e; S4 ]: p$ F
                                                                                        myClass.hc_num_out,2 ?; N% Y5 i' x5 @* a  ^* O
                                                                                        pphost->device_prop.address,; u* z5 v. d4 m, N% s/ `3 u) B. I0 [, f
                                                                                        pphost->device_prop.speed,
! k: h$ a- ?# R/ W4 o                                                                                        EP_TYPE_BULK,; {8 N" o1 A5 V4 x, E4 o# R0 Y
                                                                                        myClass.MSBulkOutEpSize);    u* \; E2 `' s4 ~
        if(status == HC_OK)
* o: o! m; _$ L$ [% n4 k        status = USBH_Open_Channel  (pdev,7 K$ [' n4 D$ |1 L$ ]
                                                                                        myClass.hc_num_in,
! A0 r0 `  R8 _  W                                                                                        pphost->device_prop.address,) K; E8 D& R; w4 @/ T' S
                                                                                        pphost->device_prop.speed,8 L& }* b  m1 U/ Q5 L4 h. x
                                                                                        EP_TYPE_BULK,
" g) w# Z& J9 E0 v, `                                                                                        myClass.MSBulkInEpSize);
+ h$ I, N+ m' \" J7 [        if(status == HC_OK)
4 M+ ]# i3 j/ z6 t7 [8 Y        LHLFont_DebugString("USBH Open Channel Ok");
% f# ?8 L- D( l3 o) [: x8 C" Y        
& t& |! N! r, u5 }" \" N6 J  `        Receive_Retry = 2;2 J% ~; t% S4 y/ z  c- i1 `
        
( _3 X5 ?- i2 d        return USBH_OK;                                 
! k. `& r- w5 t  V6 s}
, L" f' y7 M) T1 N( ^6 C) `% R            & a% O4 M6 s& `) X' q! c
void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)
9 l& q0 F" o( S{
* [* |" l8 v% ^( d# k# h& b  if ( MSC_Machine.hc_num_out)
2 g9 R- e. [% B! p1 C. d& p% H  {
* G. @* O8 ^: M    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);* v. ]) {! f8 T, S% w$ }; F
    USBH_Free_Channel  (pdev, myClass.hc_num_out);* O0 u& H6 W/ }/ k. a8 T  e
    myClass.hc_num_out = 0;     /* Reset the Channel as Free */) ?+ a6 l7 F: N: S, v! b* U$ w& p0 q
  }
2 t. z5 |# B' w2 Y2 K& Q* Q! r   
# b3 b! Q2 I: D0 y  if ( MSC_Machine.hc_num_in)
+ Y. g) P2 d0 L  {. e& J3 \4 J% V) g# _- ]7 L
    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);% Y2 M, w2 d* J' ]4 C
    USBH_Free_Channel  (pdev, myClass.hc_num_in);+ M2 O5 M4 L3 b- K9 U* t- _
    myClass.hc_num_in = 0;     /* Reset the Channel as Free */
# b# p5 W  n2 ?7 n' e5 |' B  } ' E! `7 K% U+ a# H5 T' p3 ^! H! f9 n9 j
}; T) X' O1 A2 z8 l2 z* f
USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)
/ m% p! i+ ]+ M0 R{( K  n$ R- C$ [' s- t9 G* Y
        return USBH_OK;
  B6 Q) V) [; G) D}
& N+ q% s* j  Q1 Yunsigned char usbbuffer[70];
) }/ V+ r' u  p7 @+ Vunsigned short usbbufferlen=0;; Z! a! i* j8 T" u2 M8 o  d

: t0 m' }) g8 ]# P! Nunsigned char SendMechine = 2;/ i, D' f% P/ b/ ]2 Q: w- u
int SendCount = 0;
% S6 \& l7 y+ G6 }. `7 h. J; i
5 L7 l/ @0 C. d. P0 u/ {% iunsigned char ReceiveMechine = 0;
0 J, w5 i9 Y' @int ReceiveCount = 0;
3 V- e$ u. a9 G5 ^6 ?; runsigned dataReceived = 0;
  r$ |2 _3 |3 `2 v, p7 u# T4 ?5 R
( F! E% k' {5 s" I% s) T4 Qvoid usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)$ j% q! Y7 y5 g9 P; N( e" v' l
{# U9 o# L7 W4 i: @9 j
        unsigned char *ptmp=usbbuffer;4 i: L: m/ L! v2 ~' x# X, F
        
5 x; y$ y0 ]" l3 M  W4 L- b        usbbufferlen = len;, ?3 P! D* e) W) t2 _
        
: U4 N+ c: Q$ _- X        while(len--)# B3 K* |$ P" R0 u2 k( M
        {, R5 i5 O7 |7 _" a& V% C) X1 \
                *ptmp++ = *pbuffer++;5 U! n0 y! W: y/ c8 o3 g
        }
% F8 H/ L. T  A}$ c3 F* s5 J( c- k; r
USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)  o% d1 h3 z; l' A  g: G) A7 r
{
9 O7 g( k3 i+ f: y        if(SendMechine==1)/ n. G2 b! @! y: h' E
        {
5 x6 I1 f2 x% J9 i1 m( ]                SendMechine=0;1 x( N% |: U/ j. Y
                USBH_BulkSendData (pdev,' e9 M/ y/ t. J
                                                                                                 (unsigned char *)usbbuffer,
! y8 K$ W* e0 W                                                                                                 usbbufferlen ,
0 v% T$ ]  _+ D+ {1 z7 B: P                                                                                                 myClass.hc_num_out);1 Z6 y( q# ]; Z* g3 V6 r
                SendCount=0;, a. @# b' J$ A3 J( l3 S
                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)
: K8 m. x: J+ E! x" O  F; M! x        {4 z# w5 }( l0 j
                Receive_Retry--;1 }% F/ B- q5 B- u; w7 B) L
                ReceiveCount=0;
, s) v0 D6 f. r2 R                USBH_BulkReceiveData (pdev,3 b1 u; n) t! C# l  i9 S
                                                                 (unsigned char *)usbbuffer+3,
! q2 p/ r5 D  g& R7 a: \4 s( v9 y                                                                 64, . S, Q! {& @9 ?' ~% h
                                                                 myClass.hc_num_in);1 R8 {/ e& V5 _
9 p/ s! g. `' x- t6 p
                while(HCD_GetURB_State(pdev, myClass.hc_num_in) != URB_DONE &&ReceiveCount

自定义usb类.zip

下载

2.03 KB, 下载次数: 1205

1 收藏 11 评论53 发布时间:2014-4-1 12:30

举报

53个回答
bwsz 回答时间:2016-12-21 16:49:24
heiheiaizfx 发表于 2015-4-24 21:31- ^4 X7 z% O& F( E1 R
您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...

+ b6 {; I7 b! \9 R! s请问下 您的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
# n# t2 Y1 p, E4 L8 z+ ?开发3G模块的项目要用到这个,不错

4 I( `  _% h( K2 ^- F1 B/ O; P( B  Y您好,请问您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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版