我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1391|回复: 5

[技术文章] USB枚举过程详细分析

[复制链接]

该用户从未签到

151

主题

102

回帖

2

积分

PADS-180606高级班

积分
2

社区居民忠实会员社区劳模原创达人终身成就奖

QQ
发表于 2016-3-14 07:18:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

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

×
{1}
USB
枚举过程分析
1)
USB


                               
登录/注册后可看大图

的插入检测



12
脚短接,
Q1
截止,
Q2
导通,
D+
上拉,
windows
就会认为
USB
接口有一个全速
设备,马上复位总线,并开始枚举设备。
如果
23
脚短接,则
Q1
状态取决于
USB-DISCONNECT

PD2
)脚的状态。
CPU
复位
后,
GPIO
引脚处于浮空输入状态。所以此时,
Q1
导通,
Q2
截止,主机检测不到设备。
在程序初始化了
USB
相关部分后,
可以通过设置
PD2=0
低电平使
Q1
截止,
Q2
导通。

USB
检测到设备,开始枚举过程。


所以要控制开发板作为
USB
设备工作,必须
23
短接。
2
、枚举过程中,第一个来回的详细分析。
检测到设备,主机发总线复位。这个复位与
USB
上电复位和系统复位是不同的。这个

SIE
根据总线状态通知用户的一种复位。设备产生复位中断,如何处理由设备固件程序
决定。
主机发起第一个控制传输:

1
)主机
SETUP
包(发往地址
0
端点
0

、主机数据包(请求设备描述符)
、设备握手

ACK

设备产生端点
0
数据输出中断,固件程序要根据数据包中的主机要求做好准备,这里是
在端点
0
输入缓冲区准备好设备描述符。

2
)数据过程,主机先发一个
IN
令牌包、设备发一个数据包(这个数据已经准备好,
SIE
收到
IN
令牌后,直接送到总线上,用户此时不干预)
、主机发
ACK
包。







此时
SIE
产生端点
0
数据输入中断,
表明主机已经取走了设备所准备的数据,
用户也可
以在该中断处理程序中作自己的处理。(
SIE
指串行接口引擎
,
是所有
USB
控制器内部的“核
心”
.SIE
负责处理底层协议
,
如填充位
,CRC
生成和校验
,
并可发出错误报告
.SIE
的主要任务是将低级信
号转换成字节
,
以供控制器使用
)
此时,主机只接受一次数据,最少
8
个字节。如果用户数据没有发完,又在控制端点输
入缓冲区,准备了数据,主机也不理会。

3
)状态过程:主机发
OUT
包(通知设备要输出)
、主机发
0
字节状态数据包(这个

0
字节,表明自己收到设备描述符)
、设备发握手
ACK
包。
此时设备不会产生端点
0
数据输出中断,此时没有数据。
3
、枚举过程中,第二个来回:设置地址。
第一个来回成功以后,主机再次复位总线。进入地址设置控制传输阶段。

1
)主机
SETUP
包(发往地址
0
端点
0

、主机数据包(请求设置地址)
、设备握手包
ACK
。所以
SETUP
包后面都会跟一个表明主机
SETUP
目的的数据包,要么
GET
,要么
SET

设备产生端点
0
数据输出中断,固件程序要根据数据包中的主机要求做好准备,这里是
在根据主机发来的地址写入自己的地址控制寄存器。

2
)数据过程,本次传输没有数据。

3
)状态过程:主机发
IN
包(通知设备要返回数据)
、设备发
0
字节状态数据包(表
明地址设置已经成功)
、主机发握手
ACK
包(地址设置已经生效)

此时设备不会产生端点
0
数据输入中断,此时没有数据。
4
、枚举过程中,第三个来回:主机使用新地址获取完整的设备描述
符。
主机采用新地址发起第一个控制传输:

1
)主机
SETUP
包(发往新的地址端点
0

、主机数据包(请求设备描述符)
、设备
握手包
ACK

设备产生端点
0
数据输出中断,固件程序要根据数据包中的主机要求做好准备,这里是
在端点
0
输入缓冲区准备好设备描述符。

2
)数据过程,主机先发一个
IN
令牌包、设备发一个数据包(这个数据已经准备好,
SIE
收到
IN
令牌后,直接送到总线上,用户此时不干预)
、主机发
ACK
包。
此时
SIE
产生端点
0
数据输入中断,
表明主机已经取走了设备所准备的数据,
用户可以
该中断处理程序中要做如下处理:如果一次没有将描述符送完,要再次将剩下的内容填充
端点
0
输入缓冲区。
第二次数据传输:主机再发一个
IN
令牌包、设备发一个数据包、主机发
ACK
包。
此时
SIE
再次产生端点
0
数据输入中断,如果数据已经发完了。这里就不处理了。进入
状态过程。








3
)状态过程:主机发
OUT
包(通知设备要输出)
、主机发
0
字节状态数据包(表明
自己收到设备描述符)
、设备发握手
ACK
包。
接下来获取配置描述符、配置集合、字符串描述符、报告描述符的过程差不多,这里
就不再叙述了。
二、
USB
设备固件程序要做些什么?
1

USB
初始化
2
、使能
USB
连接(在
D+

D-
线提供上拉)
,被主机检测。
3
、接下来的工作
我觉得几乎都是在中断中完成的。接下来,我会根据书上的实例和网上的例程

JoyStickMouse
”先了解
USB
的工作过程,
ST
的“
USB
库”的使用方法。
然后将它移
植到智林
stm32
开发板上。
2}
另一篇博文
1
、检测到
USB
设备后,对
USB
设备复位,使设备地址变为
0x0
。发
80
06
01
00
00
40
00
命令,读取
设备描述符命令,由于不知道设备描述符的长度,暂时要求返回数据长度为
0x40

2
、给这个新接上的设备分配地址。
3
、设置地址成功后,对新地址发送获取设备描述符命令,此时已经知道了它的长度,直接按这个长度即
可。
4
、在得到设备描述符后,我们再发获取配置描述符命令。
5
、从上一步,我们可以得到设备支持的接口数及端点数,此时再发一次得到配置描述符命令,把数据长
度改大,数据长度我们可以从
wTotallLength
中读取,但我们一般在这里设为
0xFF

6
、如果有字符串描述符,
在这里可以发命令读取。
接下来再一次发命令完整读取设备描述符和配置描述

7
、在这里发送设置配置命令,到此,我们已经完整地得到了设备的信息。枚举过程结束。
1234567890ABCDEFGHIJKLMNabcdefghijklmn!@#$%^&&*()_+.一三五七九贰肆陆扒拾,。青玉案元夕东风夜放花千树更吹落星如雨宝马雕车香满路凤箫声动玉壶光转一夜鱼龙舞蛾儿雪柳黄金缕笑语盈盈暗香去众里寻他千百度暮然回首那人却在灯火阑珊处


回复

使用道具 举报

该用户从未签到

35

主题

7586

回帖

1212

积分

二级逆天

积分
1212

社区居民忠实会员社区劳模原创达人最爱沙发终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

QQ
发表于 2016-3-14 07:28:23 | 显示全部楼层
回复

使用道具 举报

我不是王 该用户已被删除
发表于 2016-3-14 08:56:38 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

13

主题

73

回帖

39

积分

二级逆天

积分
39

社区居民忠实会员终身成就奖

QQ
发表于 2016-3-14 08:57:45 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

196

主题

3559

回帖

2004

积分

二级逆天

积分
2004

终身成就奖特殊贡献奖原创先锋奖

发表于 2020-12-11 09:09:05 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

30

主题

1427

回帖

1854

积分

二级逆天

积分
1854

终身成就奖特殊贡献奖原创先锋奖

发表于 2023-3-9 08:18:49 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

每日签到,有金币领取。


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表