圈圈教你玩USB学习总结

前言

最近想学习一下USB的相关知识,然后看大家都比较推荐《圈圈教你玩USB》这本书作为入门资料,看了一个礼拜看到了USB键盘实现章节。因为USB的内容比较多也比较复杂,特写下此文进行梳理和总结,记录了一些圈圈书中的关键点以便日后复习和查询。如果想具体了解USB可以去看原书籍和官方手册。

1.1:USB特点

低速:1.5Mb/s    全速:12Mb/s     高速:480Mb/s

1.2:拓扑结构

主机(Host)

一个或多个USB主控制器(host controller)和根集线器(root hub)

主控制器负责数据处理
根集线器

提供一个连接主控制器与设备之间的接口和通路

USB集线器(USB hub)对原有的USB口在数量上进行扩展
我电脑的主控制器和集线器

USB拓扑:塔顶为USB主控制器和根集线器,下面接USB集线器,USB集线器将一个USB口扩展为多个USB口,多个USB口又可以通过集线器扩展出更多的接口。

1.3:USB电器属性

USB连接线:VBus、D+、D-、GND,USB OTG在标准的基础上添加了一条ID线。低速和全速模式采用电压传输模式,在高速模式中则是采用电流传输模式。

USB使用的是NRZI编码,当数据为0时电平翻转;数据为1时电平不翻转。如果长时间电平不变化会经过位填充处理。

NRZI编码实例

1.4:USB的插头和插座

1.5:USB插入检测机制

USB集线器的D+和D-分别接了个15kΩ的下拉电阻到地,在USB的设备端D+或D-上接了一个1.5kΩ的上拉电阻到3.3V(全速和高速设备的上拉电阻是接D+上的,低速设备的上拉电阻是接在D-上的)。当设备插入到集线器时,接了上拉电阻的那条数据线的电压由1.5kΩ和15kΩ的下拉电阻分压决定,大概是3V左右。这对集线器的接收端来说是一个高电平信号,当集线器检测到这个信号之后就告诉USB主控制器检测到设备插入了,集线器根据检测到被拉高的数据线是D+还是D-来判断插入的是什么速度类型的设备。

1.6:USB中的描述符及其之间的关系

USB1.1中定义的标准描述符:设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)以及字符串描述符(String Descriptor)。USB描述符之间的关系是一层一层的,最上层是设备描述符,接下来是配置描述符,再接下来是接口描述符,最下面是端点描述符(这里不讨论其他的描述符像HID之类的)。

1.7:USB枚举过程

枚举过程就是从设备读取各种标准描述符,以便于主机加载合适驱动、识别插入的是什么类型的设备。

1:USB主机检测到有USB设备插入后会先对USB设备进行复位,USB设备在复位之后其地址是0。USB主机往地址为0的设备的端点0(控制端点)发送获取设备描述符的标准请求(控制传输的SetUp过程)。设备收到该请求之后会按照主机请求的参数,将对应的设备描述符(前8个字节)返回给主机。主机成功获取对应描述符且没有错误之后会返回一个长度为0确认数据包。】

2:主机对设备进行再一次复位,进入设置地址阶段。USB主机往地址为0的设备的端点0发出一个设置地址的请求,新的设备地址包含在建立过程(SetUp)的数据包中。

3:主机在次获取设备描述符(全部18个字节),这次主机不再使用地址0来访问设备,而是使用新地址。

4:主机获取配置描述符,主机在获取到配置描述符后,根据配置描述符中所描述的配置集合长度,获取配置集合。配置集合包括配置描述符、接口描述符、类特殊描述符(HID等)、端点描述符等。接口描述符、类特殊描述符、接口描述符、端点描述符是不能单独获取的,必须跟配置描述符以一个集合的方式一并返回。如果还有字符串描述符,还要获取字符串描述符。

1.8:USB包结构及包分类

包结构共同点:同步域+包标识符(PID)+包结束符(EOP)

同步域:告诉接口引擎数据要开始传输了,同步主机端(Host)和设备端(Device)的时钟。全速设备和低速设备同步域使用7个0后面跟个1;对于高速设备同步域使用的是31个0后面跟个1。

包标识符PID:它总共有8位,USB协议使用的只有4位(PID0-PID3),另外4位(PID4-PID7)是PID0-PID3取反用来校验PID。

USB中规定了4类包:令牌包、数据包、握手包、特殊包,每种包内又有细分

令牌包中OUT、IN、SETUP包结构:

SOF包结构:

数据包结构:

DATA0和DATA1等不同类型的数据包可以用在握手包出错时纠错。当数据包成功发送或者接收时,数据包会进行切换,如果对方下一次使用的数据包类型跟自己的一致,则说明对方没有切换数据包的类型,也就是说,刚刚的数据包没有发送成功。

握手包:用来表示一个传输是否被对方确认,是一种最简单的数据包。

1.9:四种传输类型 

USB中数据传输的基本单位是包,必须按照一定的关系将这些包组织成事务才能传输数据。事务通常由令牌包、数据包、握手包组成。

USB中的四种传输:批量传输、等时传输(音视频数据)、中断传输(HID设备)、控制传输(用于获取描述符),其中批量传输、中断传输、等时传输都是一个事务;控制传输包括三个过程(建立过程、状态过程分别是一个事务,数据过程可能包含多个事务)。

批量传输:

 中断传输:

 等时传输:

控制传输:

2:USB实例过程

USB定义了8字节标准设备请求,主要用在设备的枚举过程,这8字节数据是在控制传输的建立过程通过默认端点0发出的。

 USB设备请求数据结构:

 标准请求(bmRequestType中的D6-5为00)中又细分11中(bRequest)

各种标准请求的结构和8个字节每个部分的意义

重点介绍一下标准请求中的GET_DESCRIPTORSET_ADDRESSSET_CONFIGURATION

GET_DESCRIPTOR:主机通过发送获取描述符请求来读取USB设备的各种描述符。GET_DESCRIPTOR请求结构如下

 其中wValue的第二个字节表示描述符类型的编号

 SET_ADDRESS请求结构如下

 SET_CONFIGURATION请求结构如下

设备描述符的定义与实现

 

配置描述符、接口描述符、端点描述符、HID描述符( USB键盘)的定义与实现

 

 

 

 

HID中的报告描述符要参考具体的USB_HID协议

总结

以上就是本文的全部内容了,在这里也是很感谢圈圈帮我入门了USB。

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第一章 USB概述及协议基础 1 1.1 USB是什么 1 1.2 USB的特点 1 1.3 USB的拓扑结构 2 1.4 USB的电气特性 5 1.5 USB的线缆以及插头、插座 5 1.6 USB的插入检测机制 7 1.7 USB的描述符及其之间的关系 9 1.8 USB设备的枚举过程 10 1.9 USB的包结构及传输过程 11 1.9.1 USB包的结构及包的分类 11 1.9.2 令牌包 13 1.9.3 数据包 14 1.9.4 握手包 14 1.9.5 特殊包 15 1.9.6 如何处理数据包 15 1.10 USB的四种传输类型 16 1.10.1 USB事务 16 1.10.2 批量传输 16 1.10.3 中断传输 18 1.10.4 等时传输(同步传输) 19 1.10.5 控制传输 20 1.10.6 端点类型与传输类型的关系 21 1.10.7 传输类型与端点支持的最大包长 21 1.11 本章小结 21 第二章 硬件系统设计 1 2.1 方案以及芯片的选定 1 2.2 D12引脚功能说明 2 2.3 D12与89S52的连接 4 2.4 串口部分电路 6 2.5 按键部分 7 2.6 指示灯部分 7 2.7 IDE接口部分 8 2.8 单片机部分 8 2.9 元件安装 8 2.10 电路调试 11 2.11 测试程序的编写和调试 12 2.11.1 建立一个工程 12 2.11.2 为工程添加源文件 14 2.11.3 KEIL工具栏及仿真介绍 15 2.11.4 按键驱动的编写 18 2.11.5 串口驱动的编写 24 2.11.6 PDIUSBD12读写函数及读ID的实现 28 2.12 本章小结 33 第三章 USB鼠标的实现 1 3.1 USB鼠标工程的建立 1 3.2 USB的断开与连接 1 3.3 USB中断的处理 4 3.4 读取从主机发送到端点0的数据 6 3.5 USB标准请求 12 3.5.1 USB标准设备请求的结构 13 3.5.2 GET_DESCRIPTOR请求 15 3.5.3 SET_ADDRESS请求 16 3.5.6 SET_CONFIGURATION请求 16 3.6 设备描述符的实现 17 3.7 设备描述符的返回 20 3.8 设置地址请求的处理 30 3.9 配置描述符集合的结构 32 3.9.1 配置描述符的结构 32 3.9.2 接口描述符的结构 33 3.9.3 端点描述符的结构 33 3.9.4 HID描述符的结构 34 3.10 配置描述符集合的实现以及返回 35 3.11 字符串及语言ID请求的实现 39 3.12 设置配置请求的实现 45 3.13 报告描述符的结构及实现 48 3.14 报告的返回 54 3.15 Bus Hound工具的简介 57 3.16 本章小结 59 第四章 USB键盘的实现 1 4.1 USB键盘工程的建立 1 4.2 设备描述符的实现 1 4.4 配置描述符集合的实现 2 4.4.1 配置描述符 3 4.4.2 接口描述符 3 4.4.3 HID描述符 3 4.4.4 端点描述 3 4.5 字符串描述符 6 4.6 报告描述符 6 4.7 输入和输出报告的实现 10 4.8 USB键盘实例的测试 13 4.9 再谈USB HID的报告描述符 14 4.10 带鼠标功能的USB键盘(方法一) 16 4.11 带鼠标功能的键盘(方法二) 22 4.12 多媒体USB键盘 29 4.13 本章小结 34 第五章 用户自定义的USB HID设备 1 5.1 MyUsbHid工程的建立 1 5.2 描述符的修改 1 5.3 报告的实现 3 5.4 对用户自定义的USB HID设备的访问 5 5.5 访问HID设备时所用到的相关函数 5 5.5.1 获取HID设备的接口类GUID的函数 5 5.5.2 获取指定类的所有设备信息集合的函数 6 5.5.3 从设备信息集合中获取一个设备接口信息的函数 6 5.5.4 获取指定设备接口详细信息的函数 7 5.5.5 打开设备的函数 8 5.5.6 获取HID设备属性的函数 8 5.5.7 从设备读取数据的函数 9 5.5.8 往设备写数据的函数 9 5.5.9 通过控制端点0读取报告的函数 10 5.5.10 通过控制端点0发送报告的函数 10 5.5.11 关闭设备的函数 10 5.5.12 需要包含的库文件 11 5.6 访问USB HID设备的上位机软件的实现 11 5

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

门牙会稍息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值