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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。
4 a% i! E9 e9 X) _st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。
0 ]9 A& Y, g9 g% s. U0 _) S对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。* e% J9 b+ D" l1 @* M
在st官方usb库中,usb类是这样定义的:
) j5 w5 m* i3 e' ~( B7 u/ Z$ |
7 w  t6 I  G/ ]  U  [typedef struct _USBH_Class_cb' V; z- _& V7 v) r( G2 b( _
{1 t2 p- P5 f( r+ F3 P- \5 `
  USBH_Status  (*Init)\
8 Q8 t. P6 x' X; Z2 H8 Y3 D+ L6 R4 }    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线
7 S% u! Q$ n; `5 w( I( W! R  void         (*DeInit)\
2 _4 M% ^3 y5 _! u    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源2 S( ?, l4 j0 k. Q% ]  P
  USBH_Status  (*Requests)\- ?7 B$ b/ G" |! a! Z7 `5 _
    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求
  w: v; r2 d7 h) ]  USBH_Status  (*Machine)\
* J  i7 b: m( E7 e* n    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程   
+ F4 g( ?* k8 a. `  ) x+ i- J9 C' O
} USBH_Class_cb_TypeDef;
; d+ Z" w/ P0 h# j那么,我们如果要实现一个USB类,就需要编写以上四个函数。
" H+ E2 d" M  X4 B下面就是我自己写的一个自定义类:& {0 p0 x7 L4 q3 O3 d
6 V) O" K( z* g( D8 U
typedef struct$ M$ k: R) F/ A+ a  r
{2 b  i* w4 T# v# p2 [; i. c0 K  C* e4 y  V
  uint8_t              hc_num_in; 2 F) W' e& ^9 N" h' ~5 }$ {
  uint8_t              hc_num_out; 1 i% y' a4 `# |
  uint8_t              MSBulkOutEp;
5 i9 ?% c0 g/ R5 D) z& p2 \  uint8_t              MSBulkInEp;
1 n8 L: s# X8 B/ b  uint16_t             MSBulkInEpSize;
" z9 |% |( N* Z# S* P) A  uint16_t             MSBulkOutEpSize;; f- D  t# j' O
}myClassTypedef;
$ L& M; G' O9 k" H+ b. d5 E; |myClassTypedef myClass;2 ~- }. |# {5 \0 A: K2 m' R; \
* R+ w) p4 T% b# m
USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)+ G' U2 ^2 M- |
{8 q1 b# V4 k% S5 i
        USBH_HOST *pphost = phost;- ~) t) J, T- ~$ j0 x
        short myi;
9 u" g+ [2 A' ^+ t( {% D6 g1 O        char Buffer[50]={0};/ S; U% A4 ~4 C. C: i+ \
        
' S  D4 ?& j. C+ r0 }1 f0 m, y6 ~        unsigned char status;/ J+ Y+ u4 U4 J9 N8 N5 g! x
        3 S: x4 b7 ?/ U% a- [$ o
        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);1 X$ L7 ^. R, P
        LHLFont_DebugString(Buffer);; u. u9 o4 b% J/ Y+ N" O0 P8 K0 ]
        1 J' j# R. U2 v1 Q9 {" f
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)
% z0 A  _+ d! Z3 @) ~8 B. Y        {/ Z1 k! M: N0 i- _& s( |
                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)
5 t9 U* z) Z; ^                {
1 \# f9 K+ z' i6 M, B" }8 P                        sprintf(Buffer,"接口%d的端点0为输入",myi);
: l) ^. z* h* d& x                }
9 y% D  C! l! v3 ^$ M                else! r# `$ m) ?. u1 m' D/ _
                {/ T+ A& G0 I* z4 Q
                        sprintf(Buffer,"接口%d的端点0为输出",myi);: y' y3 i* A* o) \
                }5 N2 d( N; o' L" w$ p4 E6 r
                LHLFont_DebugString(Buffer);
0 T( e( ]( \) ]               
2 A5 y7 S5 V) y8 A0 ~3 h  O                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,
- f1 Y" ], G* e+ R! I: w                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);
. D6 t4 S0 C, Q& Y# M2 c6 ~                LHLFont_DebugString(Buffer);
0 m0 `0 ?* i# l) T% M               
0 N: ?2 Q" Q2 M                4 P7 A& d. l4 f) m
                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)
  b  T+ e! u, G& b, g0 u4 Y8 ~                {
2 O3 M( y2 m- b3 J5 q& G                        sprintf(Buffer,"接口%d的端点1为输入",myi);1 ]! o8 C7 w& t/ q; s3 ~6 E
                }* n  |% }$ r4 u. [. x
                else
& v8 B1 j4 S7 B- L8 l" }5 M                {4 j: ]) W9 N" D2 W, W/ N
                        sprintf(Buffer,"接口%d的端点1为输出",myi);
% l. E( q/ \' ?7 B                }6 |* q7 B( u- P
                LHLFont_DebugString(Buffer);8 |) Y) u0 U4 c* e3 ^* n

$ O8 N4 r8 B, ~# H- t                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,+ k8 A# D$ X2 e9 ^6 K4 j' R
                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);& o$ V+ {& h* h0 Q' `1 R8 e
                LHLFont_DebugString(Buffer);        ' S# ?2 Q0 e7 H* h* N' ?, m
  }6 ]$ z  f* F" J7 Y' m
          / A# y( `! B& c1 h% o0 @! w
        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;
1 f) ]2 [# ]- b" h        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;
2 V( `0 E4 l4 F* T+ G4 Y1 J        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;3 r' P2 h4 }' u0 I* ?9 v
        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;
& H/ \7 T% y  w% t: V        # f' t* Z6 L. W8 w6 [$ y
  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);/ h5 C0 n/ H! |( N. n
  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  
8 l& n. |/ s/ }  
3 q$ M( N2 C- E- N3 B) r3 ~8 r: }        status = USBH_Open_Channel  (pdev,
1 n/ @4 Y5 W8 \1 V# ^0 w0 f# i7 C                                                                                        myClass.hc_num_out,
% |6 H. h+ \' m( V                                                                                        pphost->device_prop.address,' S% j/ a+ f" U! a7 c( U9 w
                                                                                        pphost->device_prop.speed,6 h4 _& H) D: P7 {3 K; h& Z/ m9 U
                                                                                        EP_TYPE_BULK,
$ G  R; x# ~- f, C                                                                                        myClass.MSBulkOutEpSize);  
; @3 T3 h; k% x; o6 ~  A        if(status == HC_OK)5 f+ m0 X2 S& G4 Z) N2 Z  ^
        status = USBH_Open_Channel  (pdev,
* p' Q& T6 f+ Y6 ?                                                                                        myClass.hc_num_in,: ^4 ]' m) e, P( a8 C
                                                                                        pphost->device_prop.address,
0 B3 i/ ?3 L0 F                                                                                        pphost->device_prop.speed,
/ U5 z6 d" n% f! _                                                                                        EP_TYPE_BULK,
- {# l+ n2 {3 }  [1 j$ y5 n                                                                                        myClass.MSBulkInEpSize);$ x* ^) j# L: C4 R- S. X! d
        if(status == HC_OK)' f7 k6 K+ n7 ]! [
        LHLFont_DebugString("USBH Open Channel Ok");7 B4 \. j8 X" E. x
        
$ O; v9 c0 B5 w( A% N+ R        Receive_Retry = 2;
8 [0 l4 S; q; q' u) p        - z/ x* S& l9 Y
        return USBH_OK;                                 . C, S' X4 n9 f6 s! L: |' E' J
}$ X1 n  ?! M: k* O
            - c: t* W. y8 I! K& W7 F: @7 C
void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)
4 W* [  ?8 _- o{+ J( n. R% b* ~2 Q' K+ E
  if ( MSC_Machine.hc_num_out)
3 ]! b0 D8 ?# X# x5 ]. H. b6 G  {
, y$ }( m  w/ O# @6 U2 i- [    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);
6 F7 u+ \6 N! ]    USBH_Free_Channel  (pdev, myClass.hc_num_out);" C, N; [& R7 f
    myClass.hc_num_out = 0;     /* Reset the Channel as Free */* h/ g; s/ I2 u
  }- r0 @0 b( Z: Y, T6 ?
   " q. \6 `. t- U6 h8 l0 g
  if ( MSC_Machine.hc_num_in)
3 Y# Q* B5 X$ d# m  {; @2 q5 a$ [! x! L% t
    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);
" Q$ K2 _" O, P; P    USBH_Free_Channel  (pdev, myClass.hc_num_in);" F7 U& D1 h+ P
    myClass.hc_num_in = 0;     /* Reset the Channel as Free */) p/ f2 J3 F& _- V2 M! l) L& F8 ]! i
  } ( v# K7 N9 ^: |& J0 r
}) c7 L# u  i8 e6 z: d( s, f- i
USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)# c; v2 M+ f$ Y- q# `1 K
{
- f( d+ e( c$ {# e2 v0 p; ^        return USBH_OK;1 P6 D4 V/ V9 B* A% P, E
}
% j1 I0 r6 a3 p% e- W( Uunsigned char usbbuffer[70];% b/ T# j( ^$ I! k* f% I; q
unsigned short usbbufferlen=0;3 a: J, L9 p# [' Q4 q3 d4 {

1 M" A, Z! m, P& u5 J* munsigned char SendMechine = 2;
* x" q4 t( [5 t1 ]/ E1 ~8 N6 m2 bint SendCount = 0;
; w5 c9 z% X; ]& i
3 {6 L/ s9 e9 V5 s  U) Yunsigned char ReceiveMechine = 0;1 X5 s8 G6 X) j2 d. G
int ReceiveCount = 0;* v$ c9 v3 R+ M
unsigned dataReceived = 0;0 J1 }# h1 J& U+ C; ]
! @) D4 B9 O5 h; L) [
void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len), n1 x; I4 E# y2 V. n6 M$ {
{
) B& H- }  T5 T$ Y/ a' H: S# s/ ~! Z        unsigned char *ptmp=usbbuffer;, A1 c3 i: b( y  F9 P& y% V
        
  [  X; k+ s8 y$ `" G        usbbufferlen = len;6 N. @+ t: v4 K; q4 W' l
        
1 ?$ w6 p+ c- y( S5 [        while(len--)
, T( ^1 x" ?6 f7 _. V" E: J6 u        {5 E7 C7 V6 a, s! J- Z9 t, X
                *ptmp++ = *pbuffer++;, j9 Q7 F6 G9 ~4 y
        }
2 G8 {. |' X0 i: m0 x4 S3 U; x}
. g3 `, t6 W# m, T7 C6 bUSBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost). l. u- g/ R8 o  M: {1 N" W
{5 Y( ^9 t/ V' v8 S. i
        if(SendMechine==1)7 G: \6 ^) n& P5 p  c2 T' Z& v
        {# K9 o. U% O$ z/ m* l  L& a
                SendMechine=0;; g& J4 |- d9 [' ?" _+ R- p1 K* R
                USBH_BulkSendData (pdev,
+ t1 q- b* u& }                                                                                                 (unsigned char *)usbbuffer,
: M/ P1 a) @! l# T3 g: I                                                                                                 usbbufferlen , 7 U  B; {# Z* A
                                                                                                 myClass.hc_num_out);
% E" j6 n! C8 q  k9 v                SendCount=0;1 K" n5 g5 f4 y/ z
                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)
# M* O5 @) @3 D2 u7 X# @  M3 ~. @; @        {
( ?; l$ s( X2 b3 X% Y, X" q                Receive_Retry--;
' r2 S" `  M" p( F' C5 V                ReceiveCount=0;
/ H6 b* u: ]* K' F                USBH_BulkReceiveData (pdev,; J: u" t/ k7 H+ q& V" p" `& I
                                                                 (unsigned char *)usbbuffer+3,
+ c$ ^/ q: U7 D3 a2 U+ W                                                                 64, 7 n% d4 O- Q6 k3 }. p! V8 {
                                                                 myClass.hc_num_in);
! |# Y$ W& m. l, ^, {" ^2 V, d' G1 x( B' {. P8 I6 C
                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
+ Z; r$ E- {# x+ t) g! }您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...
- ^* c( [9 V" |. n+ D4 T, _4 B
请问下 您的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 [- B8 d4 ^8 u9 M4 J2 l
开发3G模块的项目要用到这个,不错
: I* A2 ]# j4 Z  J1 d; j
您好,请问您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 手机版