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

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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。
$ k2 O; d( G* A' o/ `st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。/ M# `, p( m: S0 O2 e; d5 y- v2 H/ C
对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。
6 p7 ^3 Z- w# ?在st官方usb库中,usb类是这样定义的:
2 u" h5 y1 C9 j  z. a8 J $ t6 _  B. y7 p" g2 F$ d- U/ c
typedef struct _USBH_Class_cb" m: Q7 g: A2 m4 n
{
6 X, Q8 K+ C( P. \  USBH_Status  (*Init)\3 _. x3 E( ], A8 @6 D2 Y/ X" \' e& W
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线5 b3 E7 K5 r% Y
  void         (*DeInit)\
6 O' v1 L6 F( H    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源
; E& _  D/ L0 `- U! P  USBH_Status  (*Requests)\
  F# M- s4 h# v4 L' X4 X, ^    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求
4 b& @' r7 ~6 B$ V6 U  USBH_Status  (*Machine)\; ]- g- L8 D" S1 |& Q# @7 _
    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程    , W( w3 Z- H& q; |* V! C
  
- K" A& w1 y' U5 }8 I1 r8 D} USBH_Class_cb_TypeDef;
8 {; t  l/ E1 [, @$ I+ Y8 E6 t那么,我们如果要实现一个USB类,就需要编写以上四个函数。+ \' ]5 X1 u0 ^9 G, _8 ?
下面就是我自己写的一个自定义类:
) f% ~' V5 [9 \9 }/ C3 b/ w
# z  Y' W' d/ r0 k/ X' B+ Gtypedef struct
9 j' R0 M  @7 C) t1 C% l( g{3 p/ J# P2 }! v) L, f
  uint8_t              hc_num_in;   |0 d" V* M4 @- L' P
  uint8_t              hc_num_out;
; @! R) ^2 Y9 f* i2 I- y  uint8_t              MSBulkOutEp;2 V8 ^! R+ ~* u( c+ d$ o
  uint8_t              MSBulkInEp;8 e( B* r/ ~, l& @
  uint16_t             MSBulkInEpSize;& D0 w; M" G. N' ~/ ~2 @; L
  uint16_t             MSBulkOutEpSize;
+ K. F" W6 w( ~5 @. Z# P2 N}myClassTypedef;7 a5 B& K. ~# ]$ `) a9 p& |$ ^
myClassTypedef myClass;
# F3 v+ \9 C. l. |9 v! P
) L) W: d" ]0 V/ d" gUSBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)
2 B0 y# {1 f; h( J4 R& y/ G{2 [) ?2 {2 Z0 h3 E
        USBH_HOST *pphost = phost;) @: ?! h' j1 S5 `# A/ ~+ W7 @+ Q
        short myi;
: _6 i+ N7 U5 C        char Buffer[50]={0};
0 s. M2 ~  z; t% g        ) I; N9 n3 |* X' S
        unsigned char status;+ n( i: i6 C$ i, S
        ' ?, c) }- R5 J) `/ d
        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);! F3 k/ s, [' v) Z; |' ?( _0 [
        LHLFont_DebugString(Buffer);- N; {0 s2 p0 c& m' W9 b. y8 p
        
# G# y6 D. o" P        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)& k0 e6 B  H0 W. L' z
        {
: V6 A, x2 x( Q" F                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80). a! n/ ?  @8 b! a
                {1 ^6 A6 T( W) ~' ?  P2 b
                        sprintf(Buffer,"接口%d的端点0为输入",myi);
8 v! S) g/ ^& J" H9 Z7 `2 A                }
+ v) Q5 W- A' q                else- \( n6 o! z/ W# x: z9 T) C
                {! t; a& u& K  o
                        sprintf(Buffer,"接口%d的端点0为输出",myi);/ q2 z) V. `. Q# ~
                }
" u6 u6 I" L8 T; ^& V                LHLFont_DebugString(Buffer);
# n8 W6 w' n* u               
' d0 m9 U) L+ M                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,
/ m+ N+ u! t& a. z                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);
# l( o8 g0 X* m# M                LHLFont_DebugString(Buffer);
  W, p2 m" c) {5 n( ?6 |               
9 y; P5 V- g% [) `! a0 l2 i               
! T  ]3 Y* I" V" H: r* Q3 D                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)
6 P( H% x4 ?6 B8 H                {$ P  W1 r1 u+ l9 M8 H6 h/ u
                        sprintf(Buffer,"接口%d的端点1为输入",myi);
1 e! z6 I& s- E                }7 @  G$ j3 F1 p, \* U
                else
7 u+ K2 A  `: a7 W1 Y* ~                {4 [& u& ^. o5 L
                        sprintf(Buffer,"接口%d的端点1为输出",myi);
& ?. B  _1 t7 V                }
& M6 a4 v$ ?8 D- |+ x% l: S( P                LHLFont_DebugString(Buffer);
' ?! z5 a; U3 I . _* N, a& G% a
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,
0 T. O4 z: I0 e  m$ Z                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);
- J8 X1 n8 o% ^9 e# v: T  Z                LHLFont_DebugString(Buffer);        " P7 w- w! m4 |
  }& U5 }$ z" L+ L( n
          . o' A# y- e3 }# T( Y$ H
        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;* e6 j7 s' h) o/ w0 F8 c) a# |9 {
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;
, W' L7 C( S& I: _7 H9 n2 a3 W        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;
# B( k3 [1 e+ B6 Y) H        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;7 N) ^- Y6 a; ~( y8 i7 E/ y
        , T" ^* D+ [! m* }- y( J! l% ?9 r
  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);
( g8 H6 C7 B, {, R) _% s3 b  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  
) \5 G2 i5 Z3 c4 x9 w( X' a; @  # V; o2 R$ Q( C4 L+ v: n
        status = USBH_Open_Channel  (pdev,7 B/ J* H# m9 X+ U, j
                                                                                        myClass.hc_num_out,
1 r# n+ C9 L# G6 m) O* O                                                                                        pphost->device_prop.address,3 p" n; ?# O5 \; O; k' s* L
                                                                                        pphost->device_prop.speed,7 H; M& z& N& ^! L8 b+ _
                                                                                        EP_TYPE_BULK,# }4 |- G9 v" S# s; S' {
                                                                                        myClass.MSBulkOutEpSize);  . M8 R' Y! V) T/ S- T! }$ o8 i
        if(status == HC_OK)4 M; n3 P. ?: `6 n! X
        status = USBH_Open_Channel  (pdev,& P' G/ w* N, l/ `, v$ e
                                                                                        myClass.hc_num_in,
, F6 ]: `+ O8 O6 `9 n, F                                                                                        pphost->device_prop.address,
2 T" y5 D  M; \                                                                                        pphost->device_prop.speed,) a( q1 T; o5 y+ y6 _' X. M+ c% T
                                                                                        EP_TYPE_BULK,+ e- {% s! m$ ^% G5 p
                                                                                        myClass.MSBulkInEpSize);
/ S. u+ i) h! A" H/ t1 D        if(status == HC_OK)
1 g1 \% R1 q2 p6 i        LHLFont_DebugString("USBH Open Channel Ok");
( A5 _5 h0 {; h% ^/ a7 o$ [          K, O9 D& _' F% B
        Receive_Retry = 2;
3 \0 Y+ A8 J. i& |& O% }$ a        1 }) M/ \4 o% d) D8 \, h
        return USBH_OK;                                 4 V4 ?0 ]8 H/ M
}2 j- d! ~. o# v# q3 [
            : c2 H1 V: q; U# v
void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)
0 [5 w! f) i! R  b  q0 y3 v{
" F7 d! c7 _) R2 j' r  if ( MSC_Machine.hc_num_out)
6 O0 n+ @. k! ^  {
9 x8 e+ ^/ a& x! H, N+ b5 p9 M7 C  g    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);
* b- `% _3 I' G! }8 ~    USBH_Free_Channel  (pdev, myClass.hc_num_out);
" F5 n+ A' T0 @- J$ f( @% X7 l& g    myClass.hc_num_out = 0;     /* Reset the Channel as Free */
. h1 u0 b, W% m, L$ X9 d' C  }
3 c+ s: L' y% t8 z* v& L   
' o  G0 U) |8 B  if ( MSC_Machine.hc_num_in)( U; {) d9 g% F% u
  {
( N! o! ]3 B- A" r& a& v) P    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);
4 k  K8 O; h+ x& h    USBH_Free_Channel  (pdev, myClass.hc_num_in);8 |, z: \3 ?: @/ F4 V5 f; i; j
    myClass.hc_num_in = 0;     /* Reset the Channel as Free */
' `8 }" L  A5 N! b. T6 h  } : z9 a9 _8 g5 l1 K. P% S
}
8 x- v4 u6 T4 q1 RUSBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)
- |+ q2 V- o( e2 p* ~9 T9 m8 j{. |7 P. M+ P, Q+ ~
        return USBH_OK;
; W: t+ K* G. t}
$ y$ @2 K% Y+ b9 zunsigned char usbbuffer[70];
" d5 R* h1 E, Y1 R: I2 vunsigned short usbbufferlen=0;" F3 z. P& C0 [" W5 x' r& @
# G  O+ R  G: W4 U
unsigned char SendMechine = 2;; O1 }8 ^; {9 c9 B2 S) u) N1 P
int SendCount = 0;6 U, K# f8 X* H
9 l( A% A$ J' {$ T0 Z' G8 S3 G
unsigned char ReceiveMechine = 0;' |3 ?6 _1 o1 b, P, H
int ReceiveCount = 0;7 ~, Q! J4 }2 U0 w
unsigned dataReceived = 0;: T; Z+ c) d# F: q7 ?

: e( B9 X, R( L6 g1 t& Fvoid usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)
  g- ]& U: N' R. z% i. J{5 Y  n( N6 h) h9 b" T
        unsigned char *ptmp=usbbuffer;
8 T- ~+ w8 B9 f; x! D6 k        
) V/ [: i9 Y& ^, ]2 ?- \: T9 o        usbbufferlen = len;
1 {8 |+ r- ]! ]6 [8 C: b: E6 U) @        4 B) S( D+ d) H) ^" v% g3 s7 P8 [
        while(len--)! f; Q# F0 X" D9 |  U$ e6 ^
        {; q) ~! p/ s2 a' U8 ~: y9 m
                *ptmp++ = *pbuffer++;: C* c- _7 ^( ?# Z/ N$ M3 h
        }! L8 G. D: g( ^2 N0 V0 X
}
8 g- D3 r: E4 m. @+ zUSBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)6 X% u0 H+ }' ^  b; i6 E
{
3 Q# _( e! W- ]& _5 {        if(SendMechine==1)
! b; k% u! b7 k' {1 r& L& \: h  E        {
  J- X* U; |& Q- T                SendMechine=0;- D( O; O3 ?9 L" D/ a# }0 ]
                USBH_BulkSendData (pdev,; Y; \9 A5 R1 Y2 ^! ?  {3 H
                                                                                                 (unsigned char *)usbbuffer,
$ w" L3 E- o7 `' Z- @7 [/ N                                                                                                 usbbufferlen ,
  `/ X! V9 S# M4 L  }& ?4 k1 ^) ?( S                                                                                                 myClass.hc_num_out);
3 G) ?1 X6 y; y+ m" a) O                SendCount=0;$ p( X+ l1 l+ _$ e( I- ^; [- b
                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)$ m9 c; y( m) B* T' B4 U
        {/ C' R+ V& o1 C2 c
                Receive_Retry--;
# {, Z# n; E* c4 G. `                ReceiveCount=0;
: [% W/ |- O- o                USBH_BulkReceiveData (pdev,
3 _2 g* @1 G, @+ t1 R# @                                                                 (unsigned char *)usbbuffer+3,
# ]/ j5 L" _% N' w: m% o                                                                 64,   A& a' U2 |; p% @$ C5 D$ q6 Y
                                                                 myClass.hc_num_in);7 C  d3 d& m9 w6 t  V5 f! r5 F" {
( a0 l' K) F3 O8 J# P% n1 w
                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
. l7 s2 f2 ]: x  g您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...

1 B2 I' v! d6 ?4 ]0 v: o请问下 您的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. T8 D0 g4 L! o) j& L/ F% y
开发3G模块的项目要用到这个,不错
9 n6 Q2 U4 k2 T+ ]# t- t
您好,请问您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 手机版