基于STM32的USB枚举过程学习笔记(一)

作者:qq236106303

转自:http://blog.csdn.net/qq236106303/article/details/8176994


    之前使用ST官方的库以及网络的资料,完成了使用USB HID类进行STM32和PC机的通讯。由于其他原因并没有深入的分析,虽然实现了功能,但是关于USB设备的枚举,以及具体的通讯方式都没有清晰的概念,所以现在回头重新学习USB相关知识。主要参考资料是《圈圈教你玩USB》、USB枚举过程图解,ST官方的USB HID例程。

一,USB数据包
    1.    USB数据包分类

     USB总线上的数据传输以包为基本的单位。USB协议规定了四种包:令牌包、数据包、握手包、特殊包。不同的包通过包中的8位PID域区分。

  • 令牌包

    令牌包用于启动 一次USB传输,USB的数据传输必须由主机发起。令牌包有四种:

      输出令牌包(OUT):用来通知设备将要输出一个数据包。 数据方向 主机-->设备

      输入令牌包(IN):用来通知设备将要返回一个数据包。  数据方向  设备-->主机

      建立令牌包(SETUP):通知设备将要输出一个数据包,类似OUT包。不过SETUP包只能往端点0发包,只用在控制传输中。

      帧起始包(SOF):用于帧计数,USB全速设备每毫秒产生一帧,USB高速设备每125μS产生一帧。

      OUT , IN, SETUP包的结构:同步域+8位PID+7位地址+4位端点号+5位CRC校验+包结束符EOP 

  • 数据包

     数据包用来传输数据,分成DATA0. DATA1 。数据格式如下

     同步域+8位PID+N个字节的数据+CRC16校验+包结束符EOP

  • 握手包

     握手包用来表示一个传输是否被对方确认,有ACK,NAK,STALL,NYET。

     ACK:表示正确的接收数据并且有足够的空间容纳数据。主机和设备都可以使用ACK来确认,NAK,STALL,NYET只能够用于设备返回,主机不能使用。

     NAK:表示没有数据需要返回,或者数据正确接收但是没有空间容纳。当主机收到NAK后,知道设备还未准备好,主机会在合适的时候重新进行数据传输。

     STALL:表示设备无法执行该请求,或者端点已经被挂起。

     NYET:USB高速设备中用。

     握手包的格式:同步域+8位PID+包结束符EOP

 

    2.     数据包的处理

    在传输过程中,具体的处理细节由USB接口的芯片处理完成。

    当USB接口芯片正确接收到数据时,如果有空间保存,则它将数据保存并返回ACK,同时,设置一个标志表示已经正确接收到数据;如果没有空间保存数据,则自动返回NAK。

     收到输入请求时,如果有数据需要发送,则发送数据,并等待接收ACK。只有到数据成功发送出去(即接收到ACK标志后),它才设置标志,表示数据已成功发送;如果无数据需要发送,则它自动返回NAK。

    通常只需根据芯片提供的一些标志,准备要发送的数据到端点,或者从端点读取接收到的数据即可。

 

二 ,USB事务

    虽然USB定义了数据在总线上传输的基本单位是包,为了传输数据,必须按照一定的关系把这些不同的包组织成事务才能传输数据。事务通常由两个或者三个包组成:令牌包、数据包和握手包。

    令牌包用来启动一个事务,总是由主机发送;数据包用来传送数据,可以从主机到设备,也可以由设备到主机,方向由令牌包来指定;握手包用来指定数据传输结果。 

 

三,USB传输类型    

    USB规定了4种传输类型:批量传输、等时传输、中断传输、控制传输。其中前三个传输一次数据都是一个事务;控制传输包括三个过程,建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值