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

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

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。7 Y9 B; q% V9 m. W* U  c% p2 z
st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。
. u6 o7 Y! y6 ]+ E: B对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。2 c! i& A) {2 w' m; I
在st官方usb库中,usb类是这样定义的:8 b& u! r) n+ L

( T& C9 J7 E. |4 T% ttypedef struct _USBH_Class_cb4 D/ v2 m. u; q+ R
{  \6 G8 j8 a: ?( `! l3 u% n$ d
  USBH_Status  (*Init)\" C+ x2 B) c# O9 U3 N# n2 H! [
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线
' n% ?3 H3 I6 y9 @/ ~$ _8 w2 X  void         (*DeInit)\& q6 x' r9 s+ t( {$ Z0 k- J2 X' [
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源
3 f! W7 X( P- x0 B  USBH_Status  (*Requests)\! x2 k$ M/ n" X" A; q( l  |
    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求) z  {/ h! Q( P1 x$ Z/ r0 V
  USBH_Status  (*Machine)\6 Q1 \+ ^1 f! |; K/ K1 j8 ~$ B
    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程   
/ @% T5 h. q4 Z  
/ @; a$ ?+ \( E% y3 F* N} USBH_Class_cb_TypeDef;/ Z: i/ L' J+ e8 d4 d- X
那么,我们如果要实现一个USB类,就需要编写以上四个函数。
1 \# ^2 |# R, X( A, s* }, \下面就是我自己写的一个自定义类:4 [" n' R0 V9 Y* F$ L6 _
& w& S; a$ B4 t$ o% ^% Q1 z+ P
typedef struct
: r) A1 r3 W$ h! G, Y{+ Z2 P# Q8 W/ T: K6 d  _5 s
  uint8_t              hc_num_in; $ v8 `! N. r/ ?, \/ e2 o
  uint8_t              hc_num_out; 2 G6 \( W4 {* u6 N" V
  uint8_t              MSBulkOutEp;
5 K8 ~. A: c6 R: o% M- i" N  uint8_t              MSBulkInEp;
- y3 ~2 ?0 U9 c$ L4 D: I7 v9 O1 u  uint16_t             MSBulkInEpSize;( c- X* f$ p7 f. v) `
  uint16_t             MSBulkOutEpSize;& X( b% x( o7 `, z
}myClassTypedef;/ d6 u" H2 U+ K
myClassTypedef myClass;
/ J% n+ @! U( H7 s, O  i. z
  E7 C- Q- u4 NUSBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)
3 q2 e# D7 {& d1 |5 ^% w' A. }{. v: W0 j3 i- e5 C8 g; v3 x
        USBH_HOST *pphost = phost;  w+ L/ t, K% s3 E
        short myi;4 m  |8 l6 i$ e. D. f0 t; U4 z5 n
        char Buffer[50]={0};" V* X' Q) ~# ^5 N+ K
        
# x% e# ~* e+ q/ w$ L* @/ q        unsigned char status;# l. L2 Z1 o+ A3 ~
        2 D) p( B- \" ?3 m2 a  q+ X! x
        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);
2 x+ d' D! x4 z# k: W5 M. h6 e        LHLFont_DebugString(Buffer);
" P. h9 o" P/ m) m9 ^        & ?6 G5 o& v/ z4 r2 V4 {& O2 C
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)+ L( }( x% z6 A. s8 x
        {
; n5 h6 ~7 Y% S                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)+ D) i+ O5 _1 F0 d" N' [
                {
. G. k( R% F# Y# w. R                        sprintf(Buffer,"接口%d的端点0为输入",myi);" K4 l9 z1 w0 {; w" W% |; y2 _
                }
5 Q  [& [7 E' ]# `2 e                else
" ]8 a( N! H, y                {
" J4 K; U" {% R1 ]* L0 e" Y                        sprintf(Buffer,"接口%d的端点0为输出",myi);% y' E- X( G8 W) v, _
                }9 i) u- M7 O. D
                LHLFont_DebugString(Buffer);
6 n/ \- g. d! y                7 E1 ~. b5 Q, s( G: d
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,
7 W; E! f0 o( v3 a5 E                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);
6 Y3 {4 [: a* v- t3 C                LHLFont_DebugString(Buffer);( o" _# P, o$ E4 L7 B2 z+ H! x
                . N2 u7 F( a  f) V
               
; L' i/ \2 @2 k" @: r) A$ K                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)
1 x$ K& ?4 w/ ^+ Q% l$ J9 k                {* I7 t  A3 l- E7 E& T
                        sprintf(Buffer,"接口%d的端点1为输入",myi);
0 w( w& |( p, y7 ?" ^5 K3 [4 [7 E                }
( a  z3 ^5 m% P$ T. h# K                else2 \/ I$ @) y0 P9 S
                {/ ]7 i$ r+ R1 P, _* D8 s
                        sprintf(Buffer,"接口%d的端点1为输出",myi);
# U# t0 @# X# c# ]0 ^                }
3 S- c# [0 L* P7 [                LHLFont_DebugString(Buffer);% }4 x  u+ f% y! y: i
# e4 R6 B$ c( G
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,
2 }, V. Z8 o$ f                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);1 c4 [' u: }, z8 a# Y- ?4 j" l- t: P2 P
                LHLFont_DebugString(Buffer);        2 @; `! G0 O" w5 A* A- x
  }: L: {) j$ m) F4 R% v7 W8 R. ~5 v' Q" x
          . ]; X( s1 u# U! m
        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;' O9 E4 p; c* n  P- p7 L6 r1 g! U7 t
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;
# x9 j" M# x  ?$ ^0 _/ j' Q        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;
1 r5 T) k3 Y' t5 R        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;3 D8 A( V0 G6 m" r
        
0 V- {6 H8 B1 V+ b% R  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);$ I# `! F: L# ?* A7 d
  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  
* k8 ]1 S& a4 O1 y& B0 b. {  $ g0 b* s( X/ _8 G/ D! p
        status = USBH_Open_Channel  (pdev,. G' l* m; z" L' I' e8 d( E" s. _
                                                                                        myClass.hc_num_out,. T0 T! v) J% |  F9 d3 p: L
                                                                                        pphost->device_prop.address,- R2 y) {2 ?+ K# d- [0 B) K
                                                                                        pphost->device_prop.speed,
3 {' [8 d5 n, I( C& y( Y  _* L                                                                                        EP_TYPE_BULK," Y/ o$ Y, Y# N2 j. U; F7 B
                                                                                        myClass.MSBulkOutEpSize);  # h/ q1 V# Z' ~' x7 m7 M$ `
        if(status == HC_OK)
' f  i5 ?& \9 A        status = USBH_Open_Channel  (pdev,
1 C) A4 {/ L; G+ j7 N+ A                                                                                        myClass.hc_num_in,1 }$ \+ z0 u8 a1 w
                                                                                        pphost->device_prop.address,3 r5 N& W# [2 u
                                                                                        pphost->device_prop.speed," t% q9 f# }& _
                                                                                        EP_TYPE_BULK,
$ a3 I/ A8 q  Z9 d2 i% j8 m1 I                                                                                        myClass.MSBulkInEpSize);$ K' B1 j' m& k
        if(status == HC_OK)' v/ H% g: b8 l0 |- }/ s; h4 [$ |
        LHLFont_DebugString("USBH Open Channel Ok");- V7 u# |7 M& o- j, b# o7 I$ N
        
" Z3 z4 }& I8 L& e; c6 e, K  _        Receive_Retry = 2;4 E+ ~& F2 ^6 d% G$ `
        
, A5 k% m5 e1 G/ M# D4 Y        return USBH_OK;                                 
: g( l" U' {9 P7 P}
/ J- Y1 ^. X# f            
% W- q# ]1 e5 \/ @7 \) i& svoid DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)
0 P/ k5 Q4 S, A{
) V2 m* r# x. v# s  if ( MSC_Machine.hc_num_out)! R4 h8 a- {( r- [& w; T0 H6 B
  {; w* v4 r/ L7 n. S% t$ E* {  L
    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);: C+ W; _" n3 U
    USBH_Free_Channel  (pdev, myClass.hc_num_out);1 t9 x( n% j% G: O& B6 S9 V
    myClass.hc_num_out = 0;     /* Reset the Channel as Free */
; p8 N! r: j" \2 ]  d; ~8 U: I" Z  }% y& b4 z% V" v
   
- l" e3 i2 c5 H* P/ o& D  if ( MSC_Machine.hc_num_in), z. Y( {& C, _8 q
  {
: \; T4 |5 O4 _! X  q9 {9 c    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);# K2 Y# \' K5 ]6 g; `) x( L) z
    USBH_Free_Channel  (pdev, myClass.hc_num_in);
/ a8 N! b" _5 G7 ?" P3 a/ `    myClass.hc_num_in = 0;     /* Reset the Channel as Free */; p; b0 u* f3 T) k7 d+ |3 a* S
  }
1 `5 r: {5 W3 Q* K: t- y! P$ o}
6 e# j& q, r, @5 w0 B6 ]! T4 A4 lUSBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)
7 L8 @; Y; T- w3 j. `8 M- `/ ~{& P" \+ m* J; @8 @
        return USBH_OK;; G4 _# ], A+ K, x
}4 ^4 J5 j1 p- M; g' Z, [! x
unsigned char usbbuffer[70];
7 W7 L) ?" G- t5 U' Z  s7 N, cunsigned short usbbufferlen=0;
9 X+ N% G/ x( w + e6 }- o% x: u: |) E
unsigned char SendMechine = 2;
" I( P' c; Z" ]5 yint SendCount = 0;
; T) [- |9 ?, J3 j7 v 1 e4 L, f5 D, y6 k) S! ~
unsigned char ReceiveMechine = 0;
+ f% \6 s( W3 h" fint ReceiveCount = 0;: e, I& A, p/ y  x* T
unsigned dataReceived = 0;
& R0 w1 i( Y. C7 k 4 M, i/ P7 D  P" Q9 c; |
void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)0 F9 a6 m6 a+ e7 b( n- E9 g
{4 R' w$ R5 A  [8 M6 H5 @
        unsigned char *ptmp=usbbuffer;
; b/ Z1 G& S0 y1 Q          W  x' Y1 A4 d8 G; d
        usbbufferlen = len;
0 m1 r% i. a0 H0 |+ c6 b        
) A) ]0 A; D1 t        while(len--)4 l0 y! i$ `0 b: P7 V
        {, z( U& m9 _! S  ?& Z
                *ptmp++ = *pbuffer++;& V: C6 D' B- v9 J; A
        }
. t1 m1 b' b: r7 k9 c}! Q* c# i" t& h- n5 M, l
USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)# E; W; ]& V) T% e8 ]
{
, W' [4 y, N, Z1 b        if(SendMechine==1)# x* }1 n3 c9 h# G$ u# o8 L
        {
3 i2 ]) f; f; y                SendMechine=0;
9 W6 T+ v, d8 A3 w/ m2 [+ \                USBH_BulkSendData (pdev,& f5 p+ `3 G- K+ L! q" c4 y
                                                                                                 (unsigned char *)usbbuffer,
: \) _' T  {, K, D                                                                                                 usbbufferlen ,   J1 \3 O' N' W% q
                                                                                                 myClass.hc_num_out);
  d4 i1 p! t$ N* v7 [                SendCount=0;
) N; L' b: h. U- l% x                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)
4 C. L4 Y1 _; v3 v        {- F$ V  i+ w* b3 {; a) _. D
                Receive_Retry--;
/ H8 \4 W6 w& i5 o                ReceiveCount=0;* A5 V3 }0 U8 x( q2 ^1 W4 l; R
                USBH_BulkReceiveData (pdev,5 P  O/ Z5 M( C- _. ?' H
                                                                 (unsigned char *)usbbuffer+3,
6 }4 _7 I/ w6 f& d7 V5 P                                                                 64, ; }+ Q( W: E6 z- Z( A2 D
                                                                 myClass.hc_num_in);5 h0 O1 ^' j* P# G' w, p- N
1 z6 e" I' ]8 U$ [8 ^) b! \
                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
- l* f5 @7 s" B8 ?) B$ h$ L您好,请问您3G模块驱动弄好了吗,可以发我参考吗,刚接触USB,很多不懂,QQ:695216755,方便的话发个程 ...

8 Y1 P9 g/ Y, c! ?8 r0 T2 T请问下 您的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' y8 I: {. ]2 N$ \, O; {4 [
开发3G模块的项目要用到这个,不错

- d( d$ |" `1 D# o) S3 K- r7 w1 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 手机版