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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。* ~* F( e: t1 @; D& `: p; P
st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。
1 u3 M- `/ P& ~, T  I* s7 q# h: t对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。
' ?; `' o3 G0 q5 {. a' x在st官方usb库中,usb类是这样定义的:
. U$ H, b( ]5 _9 l2 O( d. R& z
+ y7 Z! w- z) ?1 Htypedef struct _USBH_Class_cb. ~! h+ ]. M( `1 S9 D: ~
{
( g& n1 S9 {% I: j* ^$ m  USBH_Status  (*Init)\. u* q( _$ E! ~
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线$ [5 L- E0 J/ v
  void         (*DeInit)\1 |  o$ q, O8 _
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源
! C! I; v4 G: p  USBH_Status  (*Requests)\6 B! w/ i% y9 b  U# H% J' J
    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求% g/ T' h1 B  T2 X8 g
  USBH_Status  (*Machine)\
4 T* {+ U, _6 J' N  [    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程    ' O. y+ G0 S! q7 P! T3 D: T
  
0 b( {# s% D" B5 m1 s* N} USBH_Class_cb_TypeDef;
5 y9 T( D( D6 N8 f那么,我们如果要实现一个USB类,就需要编写以上四个函数。- J; [- K1 F* V/ _! g1 X
下面就是我自己写的一个自定义类:" M0 z3 X: }) r5 x: p1 a" T

7 ^7 t. j& v( l# B  M- dtypedef struct9 u, N1 n* z, Z5 b9 r0 b% S4 m( z. p) T
{: G/ x: ^1 q7 D8 S8 k$ V) t
  uint8_t              hc_num_in; " `5 {# c" Q  Y5 U/ T4 ~7 P
  uint8_t              hc_num_out;
3 C- D: b- B# w: k( E0 M  uint8_t              MSBulkOutEp;1 n. w4 m# q9 E7 W* J! \2 H
  uint8_t              MSBulkInEp;
6 C1 S' o, y/ R; u8 K5 s  uint16_t             MSBulkInEpSize;6 u' c# S/ s1 l( P
  uint16_t             MSBulkOutEpSize;# ?/ C* E6 ]0 d$ X3 o4 r% ^; R
}myClassTypedef;
7 ~6 n  r) o* [myClassTypedef myClass;
0 f% s/ X2 e2 `- `: D
% q& w% n# ~8 q& RUSBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)5 W& M5 e- Q, u) ~9 r: z8 Y
{
% a) }) y2 T& b, R& R. z        USBH_HOST *pphost = phost;
1 K, k* C& e0 ?& e4 Z, j        short myi;
9 i' h$ r# p8 B, d8 q5 d: n        char Buffer[50]={0};
9 S( ^" H5 r" N- v/ q+ z        ' Q4 l7 j3 _' K% R( S
        unsigned char status;
, w+ |% j6 u/ ?( G9 P( x        
# e1 n7 `1 C; q4 M3 Z4 X; u        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);: v5 z" R- \  b& l8 V2 v
        LHLFont_DebugString(Buffer);
1 k1 a" [  g  v/ E, L6 i$ W        % i( A$ B7 r7 k* o# q3 x
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)7 s. Z, J; B: N& a0 @* e
        {
& e. _+ n! g; u; q" ?2 L9 v# S- h) b                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)! P& h0 J$ ?* ?! ~0 A; W  H8 k4 F
                {! p6 E; p* A1 f3 y" e, }
                        sprintf(Buffer,"接口%d的端点0为输入",myi);  @  E$ r9 E1 O9 m- y
                }
5 e5 `! l0 n& i/ K                else
- A3 y2 k6 M6 ^" |* c                {
! j0 V9 |: [, x+ c                        sprintf(Buffer,"接口%d的端点0为输出",myi);
2 W; I" U4 H, k7 W7 D4 N                }& S7 b+ {" h% `8 i1 E
                LHLFont_DebugString(Buffer);
$ b& L1 m+ {4 l0 F7 W$ P6 |) Q               
7 z6 _& [1 D4 Y! X- ^                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,, e) y7 P: b4 G! v! ~2 c
                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);& X8 n  R) K3 `7 P
                LHLFont_DebugString(Buffer);& M5 I& H: h% k, ~" Y+ a
               
- ]2 R7 |/ z7 ?$ L3 v               
  l6 e7 Z4 Q. U& H                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)' s7 z# T3 I& @5 a) a/ ?2 P$ d
                {" G- G) V! D% O: f9 u. o
                        sprintf(Buffer,"接口%d的端点1为输入",myi);
! W- d) f% ?, f9 o( R                }6 B; U% r2 ]+ `
                else
( g3 F5 E+ i' |8 {) q                {
2 _2 [% h. F. t5 k0 y/ V# r                        sprintf(Buffer,"接口%d的端点1为输出",myi);9 D; O! k8 v9 D; @, d1 a; q8 a' _
                }, h( x) y% g; l6 f2 C. C) ]
                LHLFont_DebugString(Buffer);. W: ?* @$ d" W
5 v1 e$ k5 N7 I7 j' M1 n
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,
2 @% t1 J, n3 p5 I- T, h                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);" G0 u! H' S. s$ K4 J2 p
                LHLFont_DebugString(Buffer);          h* g& u+ D9 f- O+ q' Z. W
  }
8 d4 A2 G3 D6 I/ q* J$ {          1 h" e1 e/ ^  a5 N0 ?8 v
        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;# s1 B! S. N% B$ W
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;# r& H7 t! G# r3 {
        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;
1 o# {. n+ P# V        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;: M* Q( w3 x# a5 w
        . ~- ?) Z1 k' ^2 C& A  {2 e
  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);
9 a7 F- W  P( ?% ^" Y, ?% q5 o  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  
. O7 ]) \$ U( s. m/ R  
3 Z' X( `6 a8 ?% @        status = USBH_Open_Channel  (pdev,7 h. Y6 M5 _- D  n2 \
                                                                                        myClass.hc_num_out,
( f. S0 X& U  Y9 Z                                                                                        pphost->device_prop.address,
5 {8 b! X/ z; e" r' V                                                                                        pphost->device_prop.speed,* ]2 q0 k4 y+ g9 I% J
                                                                                        EP_TYPE_BULK,
6 Z' q9 `0 c" M4 r3 H6 D                                                                                        myClass.MSBulkOutEpSize);  ! J" U/ T) i+ J& p  }3 A
        if(status == HC_OK)  N7 n0 M( H/ B  E# v% H. p
        status = USBH_Open_Channel  (pdev,
5 w8 U. Z6 q' L% \6 P                                                                                        myClass.hc_num_in,# ?- {# @( o- O
                                                                                        pphost->device_prop.address,( P  T6 N. {2 ~9 q+ O9 V, t, c1 _) b6 ?
                                                                                        pphost->device_prop.speed,1 N; S; C7 E  O5 R4 M/ R* w
                                                                                        EP_TYPE_BULK,$ n  U: J$ L# q3 x3 K
                                                                                        myClass.MSBulkInEpSize);
  s, m5 q: h5 E7 [        if(status == HC_OK)8 x- J( k! `* h, Z# P0 F2 p4 H
        LHLFont_DebugString("USBH Open Channel Ok");
+ w0 s3 z8 b2 k7 R9 X        
: r$ M& c9 G9 O1 K2 r2 {. l0 q        Receive_Retry = 2;
7 q& Z8 M$ R/ E: X        
- {! R( {$ D- I- ?4 V        return USBH_OK;                                 ! ^. V1 z( C$ J  l& [8 ~  r3 v
}0 m4 N" F0 R: d1 \
            $ O! B* O( L! J) F
void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)) z" w& o: X: a, [) i6 D# W, G" B
{
$ A8 L; k1 X: M" y! y  if ( MSC_Machine.hc_num_out)+ @2 y% g: c- R0 m
  {
9 ]- \2 \. l2 K( c    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);( K; x, A7 F, T  q* S
    USBH_Free_Channel  (pdev, myClass.hc_num_out);
7 ^% V2 P2 s  M  T6 w. t    myClass.hc_num_out = 0;     /* Reset the Channel as Free */
8 m' f4 D( ~  b5 Y: V  }
+ ~2 a. x" @6 V% d- F" W   
' ?- n* \/ k7 d" h# C  if ( MSC_Machine.hc_num_in)
* q6 q% E3 I1 e% S7 Y1 {# i1 w% I! y  {# F" M7 R# ^1 m
    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);2 t3 f9 d: c; H
    USBH_Free_Channel  (pdev, myClass.hc_num_in);
  g& x4 k) Z' f5 M" p    myClass.hc_num_in = 0;     /* Reset the Channel as Free */
9 ]4 w& Q& U2 O, G1 l& f1 S3 c7 F  } ! `' X; X' i- z4 m! J) f% J# p8 v
}
" o, Y% E8 C( p" g/ xUSBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)
& P3 o6 A9 N- ~% z5 _* L7 V{: h  _8 x# H8 a- _
        return USBH_OK;
$ U# E8 [2 n: @, I% p* N( i" H}/ `) J) t, |  A4 S" m5 U( |: f
unsigned char usbbuffer[70];
1 X( ~' M' L) x' g+ C  dunsigned short usbbufferlen=0;# \6 b* y! Z: V2 r
, y+ w  R5 h! _
unsigned char SendMechine = 2;
2 `7 @( |$ [8 M5 ?  c, Aint SendCount = 0;
  ?" Z$ y( T3 b9 I0 X3 k 9 n% F' R# i! B& w1 s4 [. [
unsigned char ReceiveMechine = 0;
& t7 @' G+ _4 ]' x, i5 P5 S2 O* {. M) jint ReceiveCount = 0;
1 d: C2 V6 q3 t, J) Punsigned dataReceived = 0;& M' `" a# v4 c# L4 P

# O  ]* }- ]0 p5 X* a) n6 N: ]void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)
# h- p* Q1 y* V' H8 Z{
8 e2 G% ~$ @% @$ Y# Q6 O        unsigned char *ptmp=usbbuffer;
8 i: {* [/ k6 O0 q5 [0 d& F* o1 a9 e        5 a( E( f6 o7 k, R2 G
        usbbufferlen = len;
: f! C( j: ]% q1 u3 t        " ^. i& S) X1 f! n7 b5 G% x
        while(len--)3 ~5 s3 q0 i6 R
        {/ O( }; [% Z$ {5 `: h$ V: d
                *ptmp++ = *pbuffer++;* w6 a8 V& x6 f
        }
. B- \/ z0 e) F6 |" D}
6 c# z0 d8 W2 bUSBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)
! G% e" B& L/ O) G" n5 s. K{* U. j: _  O+ q  u8 S
        if(SendMechine==1)
. n; G' `! j" t  m* G3 }' D4 Y        {
  N5 [% `. E. b3 a! |8 V                SendMechine=0;
7 V, M  z/ [7 ]% {- P/ P" r. {: h                USBH_BulkSendData (pdev,
  P/ W) T3 B& ]  C                                                                                                 (unsigned char *)usbbuffer,
) ]8 b: K  j+ B/ {" j                                                                                                 usbbufferlen , , |: z$ p3 z& u7 J4 b
                                                                                                 myClass.hc_num_out);
' J  F" }* |9 u& v* Y                SendCount=0;
4 j2 P3 L. p  O5 O- b/ |* h                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)
  y* R, Q7 E% v0 F; a5 s        {0 e% x2 ]8 h- s
                Receive_Retry--;
) H: z9 y, T* K# D: K                ReceiveCount=0;, q+ R  i' n* {5 B, {
                USBH_BulkReceiveData (pdev,& [9 |" ^4 `2 ~1 h: r+ H
                                                                 (unsigned char *)usbbuffer+3, 8 I7 H# l6 Y5 w7 o  V
                                                                 64,
: b4 T3 g" O" {8 |- b                                                                 myClass.hc_num_in);
8 a3 l( A0 `: e6 a8 _
" n4 ^8 p/ }+ G7 E( R                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
9 @* s7 x4 h" j' j4 ~, Q0 U您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...

% V3 T/ I2 x! }, N" a% n请问下 您的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! s, H6 n6 L4 r
开发3G模块的项目要用到这个,不错
# S. O& u& b# e/ D3 P. g. 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 手机版