找回密码
 注册
关于网站域名变更的通知
查看: 65|回复: 0
打印 上一主题 下一主题

USB 的八个要点

[复制链接]
  • TA的每日心情
    开心
    2023-6-1 15:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2023-5-31 09:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    USB的重要关键字:
    " }* X5 Z3 ^2 R+ F( r
    1、端点:位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点)( ~% U( z6 b- I
    & h, C% u' ?! m4 {) M9 c6 s* G9 K3 \0 k9 u
    0 X5 b( g  l- u; d* {$ A0 l8 W, {6 r
    8 {1 r2 h* I$ u' K$ z3 T2、帧:时间概念,在USB中,一帧就是1MS,它是一个独立的单元,包含了一系列总线动作,USB将1帧分为好几份,每一份中是一个USB的传输动作。! i2 z# v3 ?% d) R5 v( G
    7 e& P0 h9 O- X# ]. c
    5 a$ k( d# ~: }' A* n  F4 F* o0 u4 I. p' n5 `5 d; L5 N
    3、上行、下行:设备到主机为上行,主机到设备为下行
    3 b+ t$ _; W4 D- C" n" @) l# |0 p+ i; y3 ?6 U3 P
    ! Z! S& N8 k  c) W* Z
    下面以一问一答的形式开始学习吧。
    ; B" A. S8 Q; g0 l问题一:USB的传输线结构是如何的呢?3 d# V* i3 X. S: H. v' ~
    $ @3 q! _. o1 _% b0 S  R" }答案一:一条USB的传输线分别由地线、电源线、D+、D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(注意哦,与CMOS的5V电平不同),而电源线和地线可向设备提供5V电压,最大电流为500MA(可以在编程中设置的,至于硬件的实现机制,就不要管它了)。- n0 a( B" m6 }' c* D( B, e5 O, y5 q; M: I9 s' ]) ^' h

    4 F2 m6 T7 l6 t/ U$ Z+ {7 G, e: A- Q
    * [% k! G5 x  v7 C: ~! U5 f, E$ f问题二:数据是如何在USB传输线里面传送的8 r0 V& t3 L& w2 s
    - u( i1 W/ A& K& Q/ l  ]答案二:数据在USB线里传送是由低位到高位发送的。  H5 S+ g$ {: C( j3 X7 I' G+ n* ]) {" m

    / e& v& {  y1 h6 h: {1 [  S+ M) m6 s, r- `. A. N
    # ^5 l% I2 J- ]9 v$ D" J' y2 i问题三:USB的编码方案?4 X7 [% s7 H; _8 |/ c5 j& \! ~2 S4 E+ @+ {( S
    答案三:USB采用不归零取反来传输数据,当传输线上的差分数据输入0时就取反,输入1时就保持原值,为了确保信号发送的准确性,当在USB总线上发送一个包时,传输设备就要进行位插入***作(即在数据流中每连续6个1后就插入一个0),从而强迫NRZI码发生变化。这个了解就行了,这些是由专门硬件处理的。7 h, w, x- O. E' w0 \
    ; z2 O2 ^! U1 o0 p: X# \! n) B. A) R& x
    / U5 d1 R# d) {0 K* E+ O. e+ M6 ?( F- ?
    问题四:USB的数据格式是怎么样的呢?. b% r/ ]( Y6 L0 _( X4 ^
    答案四:和其他的一样,USB数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。下面简单介绍一下域、包、事务、传输,请注意他们之间的关系。* U7 p5 [5 S  ^, V( G+ L/ }
    2 u  F( w9 z/ P) x4 F$ I
    # X( Y' a7 v% z2 e2 b3 n( l1 O$ ~4 @  W! o6 I" y. E2 ~
    (一)2 B4 [4 C+ k9 y
    ( Z) [$ p/ l$ Y% y7 u/ d域:是USB数据最小的单位,由若干位组成(至于是多少位由具体的域决定),域可分为七个类型:6 Y9 m8 w( w' e- @; E4 I$ Q6 A3 O; M# P1 p7 _, D) E& c6 a# Q& Q& k
    1、同步域(SYNC),八位,值固定为0000 0001,用于本地时钟与输入同步  e+ W/ R+ Z( Y/ o, S' D9 ]
    2 L/ A. M1 u) d! l1 m" v* v2 ?
    : s% k# J  d* _' I# r6 j2 b3 z, k) y# h7 Q$ @
    2、标识域(PID),由四位标识符+四位标识符反码构成,表明包的类型和格式,这是一个很重要的部分,这里可以计算出,USB的标识码有16种,具体分类请看问题五。/ h0 s3 n( m8 |; O  n
    9 r, ~1 ?, E9 I3 e( D! o5 a& B% W5 x% s

    . m( T! E  P% n. Q3 x& `3、地址域(ADDR):七位地址,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址,由此可以知道为什么一个USB主机只能接127个设备的原因。6 o8 V, M$ _. ]7 \) _% Q0 q2 J7 j) U
    # h5 P; ?- ]; r1 D' C

    , b1 W1 [( i3 E0 _  n4 c: T- r4、端点域(ENDP),四位,由此可知一个USB设备有的端点数量最大为16个。% K! i6 F2 N, Z# X! v3 R5 c3 v
    ' t% Q& d1 H. i% f3 F) p
    ' _" P  ^% G& P1 C4 }7 ]
    7 N$ Z* m, Q# q% N+ h5、帧号域(FRAM),11位,每一个帧都有一个特定的帧号,帧号域最大容量0x800,对于同步传输有重要意义(同步传输为四种传输类型之一,请看下面)。* ~" d  @6 B! e2 A9 k' @
    - @9 h" i. @$ u8 R- T$ e" t% {
    2 j+ G  @- R4 A+ b- U3 E8 w2 y: i) C6 _9 O3 Z. \% Z
    6、数据域(DATA):长度为0~1023字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度
    7 C" n" f9 w& ~) V4 g7 s+ Y3 E5 ^/ r
    , m' T  ?, u! ?  d- b6 F5 y2 M1 |% _, U+ P4 k' `4 ^2 u0 i2 q- m+ t* f+ u* A  x& i/ x
    7、校验域(CRC):对令牌包和数据包(对于包的分类请看下面)中非PID域进行校验的一种方法,CRC校验在通讯中应用很泛,是一种很好的校验方法,至于具体的校验方法这里就不多说,请查阅相关资料,只须注意CRC码的除法是模2运算,不同于10进制中的除法。
    8 ]* [% I; q! D3 o0 W# X' t- C) t) p1 O6 @: a1 O4 D) r" t
    * U/ d# P( K: m& R7 x5 |3 Q
    6 p& H: ^1 k2 y) q(二)2 f4 _6 G: {1 U$ {
    ; L- X1 l( C0 y# |% A包:由域构成的包有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同的包的域结构不同,介绍如下" Z+ p9 ^; F0 J1 p1 ?% R% d2 A
    ; T' k8 G2 ?6 M. r2 n* z$ }6 c7 j. W. H) w
    3 t; w7 j$ \: Z# h! I5 L5 n( ?0 D# {& \  \4 Z" Q5 K" @' h: ]" h% ^
    1、令牌包:可分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放据数的)/ D2 U. t/ C/ \6 f# D+ J  i0 E0 e3 E- B4 p. U) F* A
    其中输入包、输出包和设置包的格式都是一样的:- A8 j6 J/ u/ c4 r  C# V# E' d; }! K$ |3 s
    SYNC+PID+ADDR+ENDP+CRC5(五位的校验码)   % i$ L9 t6 o3 K, M* C! z; d& c: G
    5 @- @3 S2 {: L0 R! A- R(上面的缩写解释请看上面域的介绍,PID码的具体定义请看问题五)- g% d# o) N1 W" o
    帧起始包的格式:- T7 i# E6 g  H- J4 Z% ~2 B" }5 @
    SYNC+PID+11位FRAM+CRC5(五位的校验码)/ W% A# A" U8 \2 n
    ) V0 b2 \' k- q# M) g3 Z
    & g( j% e2 T* x7 [; `3 N1 i7 M
    & Y& e% s5 K' ?6 h8 ?- D0 h9 O/ p, v+ l2、数据包:分为DATA0包和DATA1包,当USB发送数据的时候,当一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0包和DATA1包交替发送,即如果第一个数据包是DATA0,那第二个数据包就是DATA1。但也有例外情况,在同步传输中(四类传输类型中之一),所有的数据包都是为DATA0,格式如下:* q; F5 X; E% g; ~1 ^# B- z6 f! o
    4 v+ n) A, [# W/ U9 e6 `7 A; ^1 xSYNC+PID+0~1023字节+CRC16; n. x6 f% C' k# w% O! a. w
    3 u, c' {3 \) I( o# m
    9 n9 o$ F$ Y/ o! `# d9 |" v, c5 ]! W2 \
    7 O- G$ u( _2 |5 E/ u3 }3、握手包:结构最为简单的包,格式如下0 Z# L9 ~- _  [: K' c) {  b% z" f& A
    SYNC+PID- v8 _- u$ X2 j/ D* a/ N) J2 I- X5 i, J7 W9 m9 C6 e( [
    (注上面每种包都有不同类型的,USB1.1共定义了十种包,具体请见问题五)" j) K! D$ p- C: V; w* I' Y+ n9 R% D' `9 z, |
    6 R% Q  `& a+ U% o2 t
    ! q, R$ y* Q6 e4 h1 Z5 J& Y7 U+ [" G' i
    (三)
    ) B3 e) U+ [  W" ^( o/ D事务:分别有IN事务、OUT事务和SETUP事务三大事务,每一种事务都由令牌包、数据包、握手包三个阶段构成,这里用阶段的意思是因为这些包的发送是有一定的时间先后顺序的,事务的三个阶段如下:1 s. M) \! N) {/ o( T6 Y

    ) m! h: E0 H/ Y8 B" V. ?5 ?4 Z
    1、令牌包阶段:启动一个输入、输出或设置的事务7 E' r- B! O; v! M- M0 O' R! r+ n
    2 V& F0 j  W8 I) t- V6 d: q3 j- z8 @( v9 e0 F1 J9 K0 t. G! K1 }. _( ?$ u
    6 q6 M- S' R; e7 S7 O  \+ M9 `- X+ j9 ?( X3 V
    2、数据包阶段:按输入、输出发送相应的数据3 ?% X$ H+ X- k) c3 X
    $ @7 {# U4 n, k( [! T
    / n. T$ U  s- A. y+ R- t* H& t; b( B2 X8 r+ C
    2 V* [2 K9 d' L8 i/ ]5 L6 N3、握手包阶段:返回数据接收情况,在同步传输的IN和OUT事务中没有这个阶段,这是比较特殊的。6 O5 R- U3 [/ p1 q$ d# F3 A) B7 d" U) _7 E2 j
    5 B# t/ _% z/ \4 n. h3 Q) j9 a+ x
    $ r! p) i5 G! G9 X0 k
    $ R+ `% f0 b) |: D  q事务的三种类型如下(以下按三个阶段来说明一个事务):2 K$ }+ i' J: L5 S& I
      P: H* b6 [6 `" H/ {& [/ i3 L$ L1 K2 K: N2 P2 C! M. D. `7 b- Q
    3 c( \. H: i! ~: x* h! [2 h) O2 `0 i- p6 A5 N1 Y
    1、 IN事务:' |. r- Q$ N. R) x5 f1 V: h) v
    令牌包阶段——主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据;" x" ~. X, q# M
    # S* T, W; d. i7 n0 ~1 w) G0 b# L0 \- X# }) _
    2 C4 r1 z0 y  C+ p" q: ~3 q
    : S' B9 s$ F2 f/ s$ W! d  e& c$ q) C数据包阶段——设备根据情况会作出三种反应(要注意:数据包阶段也不总是传送数据的,根据传输情况还会提前进入握手包阶段)3 [4 t1 d* y8 q. z
    4 u7 }) [# o  Y. y6 V9 P4 |) N$ R, ]5 Y% n. `4 [% v6 M1 l6 n. h5 Y
    3 V9 y. ?- ]! ]+ J* [+ z! ~3 w) ^; ^0 C0 V7 K! x
    . F: k8 u# n  t) p6 r3 A1) 设备端点正常,设备往入主机里面发出数据包(DATA0与DATA1交替);
    1 h$ h) E4 y+ Q* ^+ B1 k8 ~7 V- `  D  O( {
    6 ^& G# V* u; ~% n2 M! X* U$ ~+ k8 H
    & C: Z. p! Q! d6 P( A2) 设备正在忙,无法往主机发出数据包就发送NAK无效包,IN事务提前结束,到了下一个IN事务才继续;! C9 ^5 z% `4 T( b. B: }; P6 J. u' y& i) d; N
    2 W" {! L* c" ]
    $ T" \9 H3 l5 ~! `. @; V" }; {- e1 r1 X0 F6 q" z1 [% G
    3) 相应设备端点被禁止,发送错误包STALL包,事务也就提前结束了,总线进入空闲状态。( [5 M& }6 J* t2 B$ O& C
    2 o1 B$ F3 b) V. k% b& t( G) d1 E9 \0 w3 f' Q/ x' _4 w7 _. ]
    3 M% V5 J1 L! e- l' K2 X9 k. L. v* a, g. G
    握手包阶段——主机正确接收到数据之后就会向设备发送ACK包。! i( x2 k% X4 {' N2 ]0 K, A( {; ?6 p& k$ c! T* ?3 L$ V
    0 e4 U( {: B. T$ I( V, ~1 Q

    / S/ I4 e, M, \: [2、 OUT事务:+ u3 W  O" |# S) z) @! V
    令牌包阶段——主机发送一个PID为OUT的输出包给设备,通知设备要接收数据;" ^0 N/ u% j$ I+ m  \, S$ o9 ~, M( d( I9 o& {
    6 i) D+ _* p. u. _& b
    & r7 f" }; X/ l/ `! S
    数据包阶段——比较简单,就是主机会设备送数据,DATA0与DATA1交替/ d0 z5 ?, @5 X3 v, S
    8 S$ V* f7 S" c1 b2 w2 T+ u& _# r* h5 R
    + r7 c' _9 [0 K# ?- S
    . A5 L7 ]- e8 K7 O& S3 |' F握手包阶段——设备根据情况会作出三种反应
    0 g" V6 F: [) f1 u  [- t# N- A) a; m% a# G& w, d/ R
    2 z/ F9 m& F( x1 {1 s# Y# c. b' W! c+ F9 K, {
    1) 设备端点接收正确,设备往入主机返回ACK,通知主机可以发送新的数据,如果数据
    ) ~$ r3 U5 G8 W0 V, Y
    8 d, \1 C# `+ F0 T# }. f2 v0 r1 H. _0 a$ y: g0 @! k- Z0 W0 |- K4 I: [& z3 C- L2 L8 H
    2) 发生了CRC校验错误,将不返回任何握手信息;
    + j! a" ]8 ]- X: U) W, l2 N( Q1 `$ v* |  \- T1 Q; Q$ ^. g0 o$ u
    / N, `1 |4 z3 g$ Z) M& p* _8 b5 V( b! `% @& Q6 s
    2) 设备正在忙,无法往主机发出数据包就发送NAK无效包,通知主机再次发送数据;* X- \% T0 p, V, l2 X8 X* d/ _2 s* ^; `& c: L
    # A1 `5 U( W" Q% k: ]+ t$ c* Z8 S( p( P# V# `

    8 }  L. s  T! i- D. M3) 相应设备端点被禁止,发送错误包STALL包,事务提前结束,总线直接进入空闲状态。7 V' A! p$ ^# }0 N3 a

    * b* [  g8 c' F$ ^1 S' e( [# h4 v
    ( ]4 T9 X- k5 l! M- _. ]. `' Q# d3、SETUT事务:
    8 J+ V6 B( o& d- ~. j3 U! x  @9 j7 k7 j( r: \
    + }& M1 ]4 W, w& x& F2 ~. x  D! N& b. t' L% W$ [3 k0 `* B# l
    8 K8 q) v7 d6 J# a# \+ ]令牌包阶段——主机发送一个PID为SETUP的输出包给设备,通知设备要接收数据;% R+ ?/ t4 S* B9 ]+ h  c
    * a+ V7 E0 a1 g* _
    ) Q$ `: i" h* e3 K+ g
    ; ^1 o1 v$ R7 m; e1 o数据包阶段——比较简单,就是主机会设备送数据,注意,这里只有一个固定为8个字节的DATA0包,这8个字节的内容就是标准的USB设备请求命令(共有11条,具体请看问题七)9 G, i- ?/ d! ]8 Q
    8 {) {' a" w! U
    / f! {/ C- |: N2 N( x' i- t3 H& _$ U  }. l" w* g4 o, G3 `" g2 b) A2 W$ \5 s: U1 P0 r4 r: p
    握手包阶段——设备接收到主机的命令信息后,返回ACK,此后总线进入空闲状态,并准备下一个传输(在SETUP事务后通常是一个IN或OUT事务构成的传输)$ X# Z8 e# d8 W3 I3 m; z' v6 Y+ @+ E: n1 ?' c3 \& H
    4 U- n& v% V0 _5 a4 f  f  G2 L% @' m# I5 \1 e5 Z

      E! b; d; Q! x. W* K1 Q& @7 E(四)
    $ [9 r- O% r8 |2 L9 q传输:传输由OUT、IN、SETUP事务其中的事务构成,传输有四种类型,中断传输、批量传输、同步传输、控制传输,其中中断传输和批量转输的结构一样,同步传输有最简单的结构,而控制传输是最重要的也是最复杂的传输。  i1 ?7 ~: Z& E2 d- U/ I+ F0 x+ C' f1 |
    0 N7 {2 A0 y( X$ v* L
    1 l% k6 C+ X8 l. x5 S, E+ u
    1、中断传输:由OUT事务和IN事务构成,用于键盘、鼠标等HID设备的数据传输中
    ' M! L7 Z: W; F' M1 z* S5 L+ j8 e( w, X6 g  m. v9 ~/ K: _5 U% O: D+ a
    6 Q# z- u3 t, A& ]; R# ^: O% E3 p6 z
    # V. R7 x! t  c, n* V  t" U* |2、批量传输:由OUT事务和IN事务构成,用于大容量数据传输,没有固定的传输速率,也不占用带宽,当总线忙时,USB会优先进行其他类型的数据传输,而暂时停止批量转输。; d! E, S, k1 V+ O$ y
    0 M7 P0 H+ U2 \$ U, {
    3 |# q5 Y8 V: L5 `* ~3 A
    1 M! P5 s) N, |6 F6 O3、同步传输:由OUT事务和IN事务构成,有两个特殊地方,第一,在同步传输的IN和OUT事务中是没有返回包阶段的;第二,在数据包阶段所有的数据包都为DATA0$ y. q8 U$ b# M
    ' o) R5 M, S5 ~* ]- w2 t) P) X6 P2 d' V9 A
    : U' K5 }, [% u# x) n" m8 |9 u" U0 F3 @) x7 E( H
    & C/ H$ ?2 z: S! z/ Q, t% ^4、控制传输:最重要的也是最复杂的传输,控制传输由三个阶段构成(初始设置阶段、可选数据阶段、状态信息步骤),每一个阶段可以看成一个的传输,也就是说控制传输其实是由三个传输构成的,用来于USB设备初次加接到主机之后,主机通过控制传输来交换信息,设备地址和读取设备的描述符,使得主机识别设备,并安装相应的驱动程序,这是每一个USB开发者都要关心的问题。
    ; c) j' v3 p+ P7 y) [
    $ r# K( w7 j4 ^7 u1 C2 n$ b' {! h1 W% m; K
    1、初始设置步骤:就是一个由SET事务构成的传输
    . V2 M/ i2 [+ F1 j3 Z. y0 `5 R; e# X  g5 P+ A; D! P! ^0 c1 F& l+ |! f; d& E4 R
    ' w; Q) f1 _* b+ k) K8 p7 V4 a) W3 o
    2、可选数据步骤:就是一个由IN或OUT事务构成的传输,这个步骤是可选的,要看初始设置步骤有没有要求读/写数据(由SET事务的数据包阶段发送的标准请求命令决定)
    ( X  s7 Z' s* F8 \) J/ [3 N
    4 s% x8 M/ X6 A+ ~8 g$ a: X6 {8 l9 y) J+ x) I
    3、 状态信息步骤:顾名思义,这个步骤就是要获取状态信息,由IN或OUT事务构成构成的传输,但是要注意这里的IN和OUT事务和之前的INT和OUT事务有两点不同:) ]; e2 m$ j. F: \
    " [% `; J$ O; ]- _. E7 D. ~% v- ^: v0 ?7 d3 ?+ G. k6 }
    0 d& u5 u: b. k" H
    2 j; _' u& ]5 T0 U3 m1) 传输方向相反,通常IN表示设备往主机送数据,OUT表示主机往设备送数据;在这里,IN表示主机往设备送数据,而OUT表示设备往主机送数据,这是为了和可选数据步骤相结合;8 p& ?9 |3 O$ `4 T% f& U' V4 J+ p- h; A9 {; Q
    4 d1 p9 k  p( u" X3 n5 w
    : P% d% ?: w: V, B1 T0 c8 ^( Z% t2 F8 Z! ?) d; V' @
    2) 在这个步骤里,数据包阶段的数据包都是0长度的,即SYNC+PID+CRC16; ^: N" u* o: S- P. h# t) U$ D1 N5 j8 ]. _9 ]  S
    , m/ V8 L. G. m& y2 e7 F" F6 b+ _$ P! ?  q
    3 F' k" v# H6 C9 [
    除了以上两点有区别外,其他的一样,这里就不多说
    1 d4 Q, h0 z2 p- O* z(思考:这些传输模式在实际***作中应如何通过什么方式去设置?)
    / y/ t& U& B4 t$ f2 g7 w! B6 z
    # O" U+ J9 c( @( j, o, |7 `" w. ^0 K0 J1 v1 o
    问题五:标识码有哪些?) L1 Y+ B7 L. `' x% g
    答案五:如同前面所说的标识码由四位数据组成,因此可以表示十六种标识码,在USB1.1规范里面,只用了十种标识码,USB2.0使用了十六种标识码,标识码的作用是用来说明包的属性的,标识码是和包联系在一起的,首先简单介绍一下数据包的类型,数据包分为令牌包、数据、握手包和特殊包四种(具体分类请看问题七),标识码分别有以下十六种:& r# k" Q. t: m3 ]3 D& y  a5 G, {8 _0 Q0 ~2 \8 j

    - P3 w+ d3 ?4 N; N0 x
    . q0 X4 L% G* p# R  k3 }$ k令牌包 :8 x5 J/ J* k0 v2 V+ l
    % O6 d2 E; F: s  O& t# j" I9 F0x01  输出(OUT)启动一个方向为主机到设备的传输,并包含了设备地址和标号
    + c% v7 |0 E  y! ~  P1 ^0x09  输入 (IN) 启动一个方向为设备到主机的传输,并包含了设备地址和标号
    ) j- B0 P; \% R0 r* A3 L5 s6 _0x05  帧起始(SOF)表示一个帧的开始,并且包含了相应的帧号) Z- S0 O" H& ?9 }
    : L, Q/ v# ?$ l1 d8 ?9 w6 p$ C+ [0x0d  设置(SETUP)启动一个控制传输,用于主机对设备的初始化: J$ J: G5 m5 u3 Y& Y
    $ R' @2 k+ T$ N! P5 ^5 t: n) `3 w3 W+ F0 Q, R- l

    $ @, d+ x1 |9 B- {! u0 P' \2 ^数据包 :. e/ U) ^( q- H; G* c6 a7 G" \) C' s. k
    0x03  偶数据包(DATA0),
    , z) g. k' n) ?0x0b  奇数据包(DATA1)2 n$ y& _; X, G) h* v: b: X

      i. E% ]! \$ U8 ~' N' L6 l; s. C2 N5 M: i6 G! i2 E% B, e$ S* O) v8 I; Q* B: E
    握手包:: |1 U7 q5 e" J# d' d3 s
    ( m" A: x6 ~$ d& p1 o7 G0x02  确认接收到无误的数据包(ACK)
    7 i# J, v! C5 b/ L8 K+ d4 X0x0a  无效,接收(发送)端正在忙而无法接收(发送)信息
    ; o. i8 n, |7 _! D* A0x0e  错误,端点被禁止或不支持控制管道请求- Q+ q3 a) g+ V
    ! `% [' i  c+ R! ?特殊包 0x0C  前导,用于启动下行端口的低速设备的数据传输
    % e) a# {& t4 f+ E. d
    7 [5 r$ v2 X" l* v, w" [3 I问题六:USB主机是如何识别USB设备的?
    ( E, Z! P5 e' I) D- E. G$ D' ?" }& w答案六:当USB设备插上主机时,主机就通过一系列的动作来对设备进行枚举配置(配置是属于枚举的一个态,态表示暂时的状态),这这些态如下:6 u3 I( `4 k5 I4 d3 J$ k. Y& F2 Y  U# O6 \! W4 i- F+ Q0 v
        0 o& o' W0 h" H+ f3 O9 e
    - `; x% {8 ]6 j" l; c( |) l1、接入态(Attached):设备接入主机后,主机通过检测信号线上的电平变化来发现设备的接入;
    # i7 h4 H4 t" g8 A& s   
    ) V, C2 v' F9 N: i: n  [8 I2、供电态(Powered):就是给设备供电,分为设备接入时的默认供电值,配置阶段后的供电值(按数据中要求的最大值,可通过编程设置)4 s# F" j" z. I( k$ M' K0 j' y! {4 ~) [2 Q
        6 `: N) f% ~% Q# n7 n; }. U1 a
    4 t0 S+ F9 g9 y) n3、缺省态(Default):USB在被配置之前,通过缺省地址0与主机进行通信;
    # q1 G6 ^! u' _" t4 c/ S    + w" h6 v1 p& }; |
    7 o: w6 _- x* Q/ t) p6 e4、地址态(Address):经过了配置,USB设备被复位后,就可以按主机分配给它的唯一地址来与主机通信,这种状态就是地址态;, k0 A2 }- B0 s7 y' v8 c; D  ]/ y* G" B" G2 ]
    + ?1 M, P, f3 B% N$ \0 E- `
    7 o) Z6 b% C- E/ r) G$ z" K( u# ?7 l, m6 x5 B4 u$ Z$ t- M' @7 J4 {
    5、配置态(Configured):通过各种标准的USB请求命令来获取设备的各种信息,并对设备的某此信息进行改变或设置。+ |0 k1 Y) i: J4 ?3 e+ l5 f9 j/ r8 ?0 f4 b' S5 u% x# e" |) c6 n* }* }
    ' R2 O1 Z; ~' s' K. }$ ]" q
    " Y. m3 a/ |, x+ ~; t) H. X' A8 v' V- ^+ @4 g+ d4 p  ~8 B$ |& H
    . ]* E, K& l0 ]  ^6、挂起态(Suspended):总线供电设备在3ms内没有总线***作,即USB总线处于空闲状态的话,该设备就要自动进入挂起状态,在进入挂起状态后,总的电流功耗不超过280UA。
    : }; W9 g) v+ h* U9 e# W1 j
    7 j  `8 F6 U' b. M9 z; V+ x/ ?# a. l: ?5 w! H) o
    问题七:刚才在答案四提到的标准的USB设备请求命令究竟是什么?
    # B+ p( Z2 U3 p2 g" d5 w! O  U答案七:标准的USB设备请求命令是用在控制传输中的“初始设置步骤”里的数据包阶段(即DATA0,由八个字节构成),请看回问答四的内容。标准USB设备请求命令共有11个,    大小都是8个字节,具有相同的结构,由5个字段构成(字段是标准请求命令的数据部分),结构如下(括号中的数字表示字节数,首字母bm,b,w分别表示位图、字节,双字节):* m  }; r, ?  {2 o/ u1 p6 O, _
    $ p* r6 E. p0 W
      {8 r/ p# @1 t/ a! m8 w3 X2 Y9 H1 \( U1 h- Y; D7 t* {9 o
    bmRequestType(1)+bRequest(1)+wvalue(2)+wIndex(2)+wLength(2)+ u' Q! L7 }7 G, s% R+ @2 b& K8 F+ C! f# A$ F# b+ D' [4 _& n' C
    各字段的意义如下:
    ( Y* z4 o' r2 I! }( E, {1 _* |7 v' d. m) K% O0 O) i' x( i  Y& ^/ y
    3 c% x( ]) Q, P$ D# S6 D6 R# N8 A, p4 T4 R/ [3 H6 J6 ~5 S$ }
    1、bmRequestType:D7D6D5D4D3D2D1D0
    5 p9 Z, S* [3 e( i1 mD7=0主机到设备, G# ]" F- C- i$ M5 X6 b: G4 q  s. P# D! ]1 D2 V: r
    =1设备到主机;* a2 U' ]3 g. w% ~3 g* J0 b1 x
    ( R3 \7 o3 g* r' ~+ a/ O3 LD6D5=00标准请求命令- V: U, g3 ~6 Y5 I7 n; e7 z! v; C0 T% {# Y+ h% B2 q
         =01 类请求命令: |: Y: \* T/ O, ~% t6 c
    5 ]/ |, A# g& T- u; [  D     =10用户定义的命令     ! z: W) M6 H/ z1 |/ D
      y9 J- ~: b+ A  i; X=11保留值! s/ u* @, K' m/ K) u& a9 A; e9 C+ K2 k, Z+ T/ D
    D4D3D2D1D0=00000 接收者为设备0 {5 ^4 |# {1 J0 D6 H& d, M$ [3 F* t" i
                =00001 接收者为设备
    9 j. H% ?/ F* I+ g1 D            =00010 接收者为端点2 g* E4 q( M: v( [2 e4 K3 m$ b) @* h' @
                =00011 接收者为其他接收者3 k* P) o/ o1 P( v, t
                =其他  其他值保留2 {; S* I9 f# B7 Z: O$ O+ S' t
    6 P% f1 l8 `6 i# c2 B% j+ y' {7 @" I  F" q: B& j: h: s
    % z) x' v' T& ]: I- m# F0 ^
    4 q! \. v; F% n+ R' x. J2、bRequest:请求命令代码,在标准的USB命令中,每一个命令都定义了编号,编号的值就为字段的值,编号与命令名称如下(要注意这里的命令代码要与其他字段结合使用,可以说命令代码是标准请求命令代码的核心,正是因为这些命令代码而决定了11个USB标准请求命令):6 F% I8 J% `2 m8 C; g
    0) 0  GET_STATUS:用来返回特定接收者的状态1 }% N0 J! v; D
    1) 1  CLEAR_FEATURE:用来清除或禁止接收者的某些特性
    1 I3 W9 D; j& z. b# u2) 3  SET_FEATURE:用来启用或激活命令接收者的某些特性" r0 `. d5 O) s2 B+ L
    $ O6 a( ^. j3 p7 a# t; ^! B( q3) 5  SET_ADDRESS:用来给设备分配地址; {$ ]7 z/ e& R; L7 x3 u
    , V7 x& q1 e/ x. r4) 6  GET_DEscriptOR:用于主机获取设备的特定描述符, @4 H& m* E. G0 S4 r: q
    5) 7  SET_DEscriptOR:修改设备中有关的描述符,或者增加新的描述符( l8 l3 _7 _- I. E! ~
    6) 8  GET_CONFIGURATION:用于主机获取设备当前设备的配置值(注同上面的不同)  3 g. h2 T2 P! G" n' H9 {5 d: Q
    7) 9  SET_CONFIGURATION:用于主机指示设备采用的要求的配置6 ^' _/ R6 Z! O6 n) ^* N# a
    . o* L# f) T  z, l/ d) j) Z8) 10  GET_INTERFACE:用于获取当前某个接口描述符编号" r* c& @% @! ~0 F6 t0 {/ B# _+ i/ R( [( a3 ~
    9) 11  SET_INTERFACE:用于主机要求设备用某个描述符来描述接口
    9 O# e5 A/ V4 M2 `5 ^10) 12 SYNCH_FRAME:用于设备设置和报告一个端点的同步帧
    . f& t* s! A2 N0 |3 ?5 \以上的11个命令要说得明白真的有一匹布那么长,请各位去看书吧,这里就不多说了,控制传输是USB的重心,而这11个命令是控制传输的重心,所以这11个命令是重中之重,这个搞明白了,USB就算是入门了。
    4 E. h! D) ~+ m& b- w3 L- u1 D  V8 F; r$ [! U$ Z) a! ]1 T5 b4 y
    问题八:在标准的USB请求命令中,经常会看到Descriptor,这是什么来的呢?) x' T* j3 S& e; n0 u& d0 T

    # e. @2 f1 F7 A6 ?3 N回答八:Descriptor即描述符,是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB设备的所有属性,USB主机是通过一系列命令来要求设备发送这些信息的。它的作用就是通过如问答节中的命令***作来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作,所以描述符也是十分重要的部分,要好好掌握。标准的描述符有5种,USB为这些描述符定义了编号:% s2 H# Y$ g1 R4 |. l; Y, p" O
    1——设备描述符. I7 B$ N3 ~! W
    2——配置描述符/ u% j+ g( Y9 k2 @8 U5 ?' h5 m1 F, q8 |7 F( H
    3——字符描述符3 z. u9 j# F1 p9 {5 W* _
    , j; M5 {( T- q0 g/ }% f4——接口描述符2 v3 s1 ]7 G& z4 L% z9 @8 k! h% ^+ T9 {  }( m: y
    5——端点描述符% m" B$ S. L5 U/ Y) L1 y. m7 U4 n! Y) A( |% w. Q

    : }5 W" q5 i! _$ I+ Y
    2 M! X# O# ]& H6 x0 N, T3 v
    上面的描述符之间有一定的关系,一个设备只有一个设备描述符,而一个设备描述符可以包含多个配置描述符,而一个配置描述符可以包含多个接口描述符,一个接口使用了几个端点,就有几个端点描述符。这间描述符是用一定的字段构成的,分别如下说明:
    . `' u' U( A# g) s% J! Q
    4 @5 j3 N, U. i( T7 p  w+ A
    2 n1 F1 ?7 I, Q' F$ N; w  z# D* |+ w5 @# e1 P. g/ u: {
    1、设备描述符: {8 _  l# R$ `4 I# x7 p: }9 `  B, R/ Z
    struct _DEVICE_DEscriptOR_STRUCT% Q/ z- n) P6 O: w0 L+ L. v
    {
    ) L/ h) Y" e# Q5 n$ Q" hBYTE bLength;          //设备描述符的字节数大小,为0x127 V3 b% x9 m! _/ Y
      BYTE bDescriptorType;  //描述符类型编号,为0x018 h2 Q7 j1 r5 G, N) G5 }2 p& q: C/ V9 Q- \- H, `3 i
      WORD bcdUSB;           //USB版本号
    % Z% {8 f9 P! d  BYTE bDeviceClass;  //USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型, p( P1 |) Y& Q. I& ]) @9 \0 _8 ^- Q" v0 }  `: W2 V& M
                            //0x00不是在设备描述符中定义的,如HID# X  h6 F/ A' u% o' D" D( Q1 Q$ [9 G' G
         BYTE bDeviceSubClass;   //usb分配的子类代码,同上,值由USB规定和分配的7 u% d* F5 T6 T) m
    BYTE bDeviceProtocl;    //USB分配的设备协议代码,同上  S1 A5 J" x3 I1 t9 ?; @2 I# n' _7 i% d3 B, \! ?" b1 B4 L
         BYTE bMaxPacketSize0;   //端点0的最大包的大小" x; w6 l/ r7 L6 r  y
        WORD idVendor;          //厂商编号/ Q/ u2 ^! D1 d5 ]; A% O" r; T, s
        WORD idProduct;         //产品编号
    8 a( U' n. p( e( L* V    WORD bcdDevice;         //设备出厂编号% y) w2 V7 k/ ]2 G9 E5 ]9 o! X
    5 M$ A6 Y# ?; J5 i) \3 ~    BYTE iManufacturer;     //描述厂商字符串的索引
    # t& L) `' o5 h    BYTE iProduct;          //描述产品字符串的索引5 E# F* H% D9 Y; N) M
    7 |. b4 E# M$ _    BYTE iSerialNumber;     //描述设备序列号字符串的索引- Y- D' s( r) U- |, X8 T+ E# s8 t6 e- K4 ^+ S
        BYTE bNumConfiguration; //可能的配置数量
    8 W* ^6 H- K7 h/ F$ h3 l, q}$ D8 F& c. ~% w# Q$ w0 S( w$ c

    3 Q" m% I) Q; N( `7 V' l4 d  g
    : {3 _5 V) M5 q4 P% H  k- t. I5 |2 E; x* b7 Y( J
    2、配置描述符; r" D( g5 v4 Q) O1 u1 j1 A; b! k; s: o; o; l
    struct _CONFIGURATION_DEscriptOR_STRUCT1 H" r  }: s% Q) Z
    {. M9 N0 M, n$ G- E
    ( b1 i4 t. D) [BYTE bLength;          //设备描述符的字节数大小,为0x127 f0 P% `5 x5 d# J; W. P+ |$ Q
    BYTE bDescriptorType;  //描述符类型编号,为0x01, {" C6 Z4 _6 [" A/ g+ r0 B4 g2 M! ?0 Q
    WORD wTotalLength;     //配置所返回的所有数量的大小9 X5 t( Z8 ?$ ~+ {9 i- u0 O
    , V. B$ n% Q0 c: yBYTE bNumInterface;    //此配置所支持的接口数量! H+ b3 E0 ?8 Z6 ~# O
      Z/ I, B8 n. `) C: p+ \  BYTE bConfigurationVale;   //Set_Configuration命令需要的参数值
    7 S% J& Y$ e  F$ b0 W9 I# y  BYTE iConfiguration;       //描述该配置的字符串的索引值# r! K0 ~& @, R7 j% C) Y9 d
      BYTE bmAttribute;          //供电模式的选择. S0 H3 D+ q2 x# u7 `
    # u' h7 h$ W) b% O0 O+ k9 S0 WBYTE MaxPower;             //设备从总线提取的最大电流8 u; r, a) f4 V' U% u" T# ?+ D2 j3 I' N5 }
    }+ T. I+ X8 |2 @( i( f1 E/ x  R9 o/ N0 w5 @" |: R
    0 `9 Q2 x, m* @. v# Z2 `. f
    8 c9 Q( R; b3 v+ Y) x. O+ s! i( M* u: j5 r% O, V5 y9 q5 @
    3、字符描述符
    6 i: q; W3 |7 @' L% Y# G$ Lstruct _STRING_DEscriptOR_STRUCT
    & X/ s* l5 s5 p& s8 U- R{3 f0 R( J+ f, D8 I8 m# [0 c% q4 v: C0 H7 E
    BYTE bLength;          //设备描述符的字节数大小,为0x12
    # {, E8 V, I& A: X. y- GBYTE bDescriptorType;  //描述符类型编号,为0x01( f  G; U( O& o# M9 W# F0 K
    BYTE SomeDescriptor[36];          //UNICODE编码的字符串
    / H+ f3 @" C: k% y& K9 ^$ O}
    , A, D, X+ j8 C1 M3 E0 d# d# i* J1 d/ T0 M: P5 a: e

    # e5 V& b9 U# h' R; R4、接口描述符
    5 w7 G+ Y0 @9 L% l0 W' Z5 r6 R( m& @struct _INTERFACE_DEscriptOR_STRUCT* s' i. g6 E2 C" a, U
    , Z5 Q2 ~' a: q3 J{( c0 i6 Q, `% Z4 ^1 u' l
    BYTE bLength;          //设备描述符的字节数大小,为0x123 O- _% J' f) o6 ~
    BYTE bDescriptorType;  //描述符类型编号,为0x01% A+ c9 _' ?% Y" m' i- r* L, Z
    / _2 F) o% }" s1 L# Y8 i# aBYTE bInterfaceNunber; //接口的编号! g$ {4 }8 ~: k! K  j
    5 i! l% M0 g- sBYTE bAlternateSetting;//备用的接口描述符编号
    " h6 x& x, n6 C3 m$ i- {+ `+ H+ pBYTE bNumEndpoints;    //该接口使用端点数,不包括端点0) I( p- d1 S! S: ]& q" R- Y  t/ v  p* c# J* \% M! {
    BYTE bInterfaceClass;  //接口类型; R" ~" l3 `- R
    BYTE bInterfaceSubClass;//接口子类型
    ) a: r. h* z( i8 J, H- N6 a+ l% MBYTE bInterfaceProtocol;//接口所遵循的协议
    ; {/ ?9 R+ ]) `1 }" \% G7 HBYTE iInterface;        //描述该接口的字符串索引值- n- \- Y# s' i  u
    }* {* S4 D4 h8 m1 I# [4 \

    & M- @) T# I+ K5 N0 X" D/ {) |. o; [% K" \- ^% Z: b; q! d- F  ]+ E* _, J, ?
    5、端点描述符
    ' t, Y8 T# C, ^$ @struct _ENDPOIN_DEscriptOR_STRUCT
    5 p- H. g& P; ?/ Y6 ^7 }{
    ' P" F% K7 O, |' `BYTE bLength;          //设备描述符的字节数大小,为0x12; k/ O2 ~0 b+ m8 K) n2 k. z5 ]+ A/ m
    BYTE bDescriptorType;  //描述符类型编号,为0x01+ c9 v& i1 Z) V2 [' z- p- M0 ?
    BYTE bEndpointAddress; //端点地址及输入输出属性
    & z4 R6 S4 S7 U1 P: v( o$ F! oBYTE bmAttribute;      //端点的传输类型属性+ k) M/ g7 L) V# w. k0 m3 W) s1 a4 z1 I8 q; U0 R
    WORD wMaxPacketSize;   //端点收、发的最大包的大小4 Y1 l; i! y: q0 z5 |. k+ P
    " t1 D& K% u1 P; s) V; G- yBYTE bInterval;        //主机查询端点的时间间隔: X( \( A& O6 r; s" h; {8 A- a9 d& C. o2 R
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-23 08:10 , Processed in 0.125000 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表