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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。
1 v  I' m( J7 h: u8 j- ?st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。
1 M- G% A, \3 {0 n对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。; i; |8 H8 k8 p6 t4 S0 T& ?
在st官方usb库中,usb类是这样定义的:, V5 v% K2 @3 d8 j8 H& H( g
! V5 O" B) ^5 s/ W9 I% h0 _5 A/ B: _
typedef struct _USBH_Class_cb
& k: P1 n. L  q5 K! X# Q3 T. a{6 w$ o$ n+ P- y/ P
  USBH_Status  (*Init)\
( S3 R, v& f# Z- s    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线
3 o4 m+ u  C6 ?  void         (*DeInit)\) O$ A9 O( K$ y
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源
5 Z$ W+ L! m6 ^  USBH_Status  (*Requests)\
9 n2 W! T+ Q, A# ^  F% H7 c7 G/ v    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求% r% y0 t- N0 i: w/ L/ U
  USBH_Status  (*Machine)\
2 w+ n* ^$ i$ v7 L. w    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程    ; ~% ?" a+ o8 T8 ^6 ^6 k
  
) H6 q( I* X' G} USBH_Class_cb_TypeDef;5 g6 ]( O, c+ S* j, M
那么,我们如果要实现一个USB类,就需要编写以上四个函数。
" |6 n3 H- s3 ]下面就是我自己写的一个自定义类:1 n, ^; C1 m' E' a5 s/ A
3 T- [4 D! N. m# u; B
typedef struct: U. ~/ X! x5 L6 H* `: |
{! r) r  h" ~. Q' u* l3 D
  uint8_t              hc_num_in; ; ^. Y5 F4 k7 p
  uint8_t              hc_num_out; 6 P* G* T& {. O4 u+ S
  uint8_t              MSBulkOutEp;
6 v( X, i( D/ {/ Y' ?* q. _  uint8_t              MSBulkInEp;! @% i0 o* s0 w- u' H
  uint16_t             MSBulkInEpSize;, B6 b" K4 B$ A# t! L& F
  uint16_t             MSBulkOutEpSize;* k) ?2 z) B1 s" G
}myClassTypedef;
" |# p/ D5 V* S" LmyClassTypedef myClass;
2 b+ c6 M& ]1 @7 X 8 g3 A) E( A. _) x5 M- M
USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)
, w, m; a% Z" `! o+ }1 I& A0 M, ]{
" n' R0 H$ g% \/ @5 ]. a7 S' }        USBH_HOST *pphost = phost;! t, y1 a/ i( U. P/ o
        short myi;6 D% i) `4 |. Y" J
        char Buffer[50]={0};
7 A  p3 g+ d! G4 r$ r, b, g: \- ?        - c2 m* }+ Y- g0 L: M7 K  a
        unsigned char status;
3 e6 j0 L. x! L* T; E. H. t        2 U) n6 R/ k' M' T  ~2 h6 J
        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);6 x6 o/ s* N- @4 K. h1 R
        LHLFont_DebugString(Buffer);
/ w8 w% ?7 p$ Q/ M        $ ]2 ]. U3 P4 w( m
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)
( ^6 q: Y9 f2 w        {* d, ]9 _! C9 W" I9 g, b
                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)
, b& n! O1 u0 D; k7 E( Z' t, y4 D* R                {0 {- ~5 [- v4 v/ v
                        sprintf(Buffer,"接口%d的端点0为输入",myi);1 {, S. G6 |& g/ y7 X# s) d. f2 P0 {
                }
" Q8 B7 B% b: T' s) k                else1 t/ D& o4 t/ Y3 e
                {; d  Q8 G) G4 c6 R
                        sprintf(Buffer,"接口%d的端点0为输出",myi);
7 b; D1 [" @" Z" Q! d                }! H2 H+ d8 R3 o7 g2 S7 |( \, `" y
                LHLFont_DebugString(Buffer);$ F; h0 D: @3 Z# a3 s% a
               
  p8 G6 k" k+ z" H; x                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,
. S  Y; j1 a: Q* T% P1 s3 }% O                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);
8 u/ u/ g& y  R6 m. y3 r& F* s: O                LHLFont_DebugString(Buffer);
1 _" Q8 M/ d0 f+ y% y               
) ~# k% G- c5 T1 ?' R                $ J. m* J6 a9 k# q2 |7 v
                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80); m! e( l& E+ o& n8 ~& ~
                {, `, i5 o+ b* {- O& Y, {8 e0 h
                        sprintf(Buffer,"接口%d的端点1为输入",myi);
# ?2 p0 [$ u& T, C                }) ~' F( q  U) z7 z! i1 @. ^3 Q
                else
7 x/ w* E4 d5 {6 A1 ~8 n                {
5 J+ W. h% n& p                        sprintf(Buffer,"接口%d的端点1为输出",myi);
! y& y. m; m- r1 _9 O- C                }
  D0 p) H6 n) L  L+ f                LHLFont_DebugString(Buffer);) `9 ^) C' {) M% J& h+ Z
/ d: e0 r  b3 a. a. p) c, w. q
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,
1 ]7 C9 ^" U3 A0 V/ M. n! m! Z                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);
+ {/ N6 @9 b. r4 o) |% a' J                LHLFont_DebugString(Buffer);        . ]( q3 x. T0 J" v
  }+ z& Q- z# }) j3 y$ u: R
         
+ }- f% \: E! v9 r0 S7 q        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;: y: e$ a4 v# i! i
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;
8 d. d& N3 e8 P: ?9 w/ ]        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;# i" K* O- S6 ]* n
        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;
7 K4 ~' q9 _2 ^7 Z+ F' g! S* X        
1 n" g  _6 K' q* S- j  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);
5 l% e; K8 y! I  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  7 M7 T, n- ]" j
  
. _! M3 G% \  {* y! `/ w9 d        status = USBH_Open_Channel  (pdev,
  {$ X6 l! K5 K# ~% R: y                                                                                        myClass.hc_num_out,
0 A5 Q, P( f) [# t' B7 q! S0 h                                                                                        pphost->device_prop.address,$ s5 s3 A( J& M/ R* B# R
                                                                                        pphost->device_prop.speed,
  Y6 ~1 ^- U0 n4 f1 N5 Z                                                                                        EP_TYPE_BULK,5 z) o' Q* F" v* Y3 P, Z5 V3 `0 e
                                                                                        myClass.MSBulkOutEpSize);  / V  J4 W4 m. v$ i
        if(status == HC_OK)
: ]3 U* \% k* s+ h# [0 X        status = USBH_Open_Channel  (pdev,
; k# X8 b. W4 E$ F$ }9 T! j" d, [3 H                                                                                        myClass.hc_num_in,
0 R3 Q# t( Z& Z9 n7 S7 h                                                                                        pphost->device_prop.address,7 Z/ Q! U% F/ ]) w, A; }
                                                                                        pphost->device_prop.speed,* V4 q. G, X) Q5 A! {) G4 A
                                                                                        EP_TYPE_BULK,0 y* o1 S+ o* V; q' K9 x3 u
                                                                                        myClass.MSBulkInEpSize);8 a- {" J  ]' b- Z: d6 ]
        if(status == HC_OK)9 ]; F' x* h) ?
        LHLFont_DebugString("USBH Open Channel Ok");
; o0 U8 f( W* Q3 l        
! o9 K# q( f& Z3 B6 q0 H* T1 O        Receive_Retry = 2;
' T; d, f0 ?2 l) a        : Y+ U/ |' v! j7 d% t
        return USBH_OK;                                 
  N1 ]2 H& Q' @7 v}
6 y+ U9 x- l! T) E            ; G8 I) k' @2 h3 Q7 j2 j3 t
void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)
' q6 c# I( `" S$ k' S6 R{4 C& O! A# J7 f+ j" M) K4 p$ F  U
  if ( MSC_Machine.hc_num_out)" W: F1 H* |: m: J6 [# t" w/ M5 W# d
  {4 f4 G9 K( T5 e- {: f  G, w
    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);. T+ g6 E/ x- x: l& X9 n
    USBH_Free_Channel  (pdev, myClass.hc_num_out);
7 G+ Q4 V" s4 x* I    myClass.hc_num_out = 0;     /* Reset the Channel as Free */- J1 b% Q3 n  M! [
  }
$ J" D9 @9 R1 d   % H* t' R9 ]& @& W+ q# h
  if ( MSC_Machine.hc_num_in)! R% g$ G3 X3 s/ B0 ~. y
  {! O9 N- W0 R: V$ \
    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);8 i1 u( M$ ?; N5 I+ I: U, p
    USBH_Free_Channel  (pdev, myClass.hc_num_in);
( T. L- [4 ]6 v, f( D+ [, y+ p    myClass.hc_num_in = 0;     /* Reset the Channel as Free */
  x: M3 H  e4 C9 m  } : l- f1 `/ @/ M) [' ~
}1 d( W; H' _; s5 Y% K7 g; E
USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost); |9 M' J2 `( w! K
{
% X; ?6 `. @1 G        return USBH_OK;% f  r. P8 y2 i  s. C" I( K( a
}+ F8 R4 O+ C% S. m2 T. c- ?
unsigned char usbbuffer[70];
: X, w! l. ~, o7 ], H/ cunsigned short usbbufferlen=0;
8 i+ m5 k2 }! J  w/ W3 @ * Z; S( q% b/ [2 e1 N
unsigned char SendMechine = 2;
2 O2 _7 g  M$ a# I) K# Yint SendCount = 0;
6 o9 L, E% `, A- T* C9 c * L+ A' h) F/ ]
unsigned char ReceiveMechine = 0;
4 ?% s  `. H+ P3 Cint ReceiveCount = 0;
+ `9 C3 u$ H- j/ e1 I1 D" e, _9 sunsigned dataReceived = 0;3 Y% v" d9 ^( C: {+ L2 C3 x
$ g& n4 m- m! E! o% c
void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)
2 z0 ^. g7 g* H, T7 e3 y, m6 j{
" ]0 n. g& }; v        unsigned char *ptmp=usbbuffer;
5 P6 u* }- N* {3 j        
8 s( u( |: h9 X# `; @9 E+ B        usbbufferlen = len;9 y) n' y4 `! x3 L
        2 q6 p% {3 T8 ~
        while(len--)* u5 f2 d5 R- {, I
        {
6 f* O3 ]3 |* G% T, p# b                *ptmp++ = *pbuffer++;
0 _; q8 X/ \$ v' c5 L; l        }
4 k7 r( W; x* M+ p' l4 {* v+ ]6 S0 m- O: A}
# H" W3 @0 P+ z8 V/ FUSBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)
) P! o2 Y4 l( y& _/ K{
. v- ^% x0 r1 y# S5 i+ ^        if(SendMechine==1)+ N' U, J1 {8 d. G; \, z$ A- ]
        {6 _& W" \% Q7 e) X0 W6 t
                SendMechine=0;
# ~8 z+ p7 B5 d  r                USBH_BulkSendData (pdev,
/ {# y; [2 g5 u% |0 w- |                                                                                                 (unsigned char *)usbbuffer,
3 x; `) d% N  o! ]                                                                                                 usbbufferlen ,
+ z6 [% @8 ^2 H0 g/ p3 g                                                                                                 myClass.hc_num_out);
2 F6 H& U$ U" w, T& v' R                SendCount=0;
6 ?% K8 S6 P3 |6 k+ ^7 C( |, ?' q. P                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)$ _1 D. I# ]; v6 l
        {
- M# |/ |! C2 I) z, a" M( y                Receive_Retry--;7 q, j# w1 s! E  C) C3 i
                ReceiveCount=0;
! Z& J7 [# [7 V; x2 c                USBH_BulkReceiveData (pdev," x8 I: j: w" Y( E9 |% P
                                                                 (unsigned char *)usbbuffer+3, ' t: T) E" P, p
                                                                 64,
& {: V  t/ [& |2 x0 C                                                                 myClass.hc_num_in);
1 D! P1 E( K/ k% s2 B" e& G* z0 ~4 j* O4 {% [  ^# @1 p* p6 v
                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- T) U8 W, ?7 w
您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...

+ k# E) N# E/ e! U) f; j. ?/ M4 k) u请问下 您的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:190 P4 j  N8 V" K) x. ]' V
开发3G模块的项目要用到这个,不错
# h* b" F2 a# L# M
您好,请问您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 手机版