0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于DWC2的USB驱动开发-USB复位详解

嵌入式USB开发 来源:嵌入式Lee 作者:嵌入式Lee 2023-07-07 11:18 次阅读

本文转自公众号欢迎关注

基于DWC2的USB驱动开发-USB复位详解 (qq.com)

一.前言

上一篇我们详细介绍了USB枚举的第一步,连接检测。那么第二步是干什么呢? 相信做过嵌入式开发尤其做过驱动开发的都会想到-复位,基本上所有的外设模块在开始都需要进行复位操作,以达到一个默认的状态,USB也不例外。一方面初始化时复位以达到默认状态,一方面在异常时复位以恢复。话说复位可以解决99%的问题就是这么来的,如果还不能解决那就断电复位,相信这是很多人解决问题的第一板斧,且不说是不是最优选择,至少这样一般都有效,当然可靠性考虑是否能直接复位一般都需要评估不能这么直接简单粗暴。

这一篇我们就来详细讲讲USB的复位,老规矩理论结合实践,先看规格书的说明再写驱动实测。

二.USB的复位

2.1复位信号

首先,复位信号到底是什么样的呢?调试外设时序的时候一般都会关注,复位一般用一组特殊的状态时序来表示,USB也一样。

我们看到USB2.0规格书中对复位信号的描述如下

b18e5432-1c5f-11ee-9c1d-dac502259ad0.png

对于发送端要求D+和D-小于VOL(max)持续10mS以上,VOL(max)的值为0.3V,如下

b1bacbd4-1c5f-11ee-9c1d-dac502259ad0.png

而对于接收端要求D+和D-小于VIL(max)持续10mS以上,VIL(max)值为0.8V

b1cca16a-1c5f-11ee-9c1d-dac502259ad0.png

可以看到VIL(max)比VOL(max)是要大的,这是对发送要求严格一些,因为要考虑信号传输的噪声干扰等因素,预留一些裕度。

上述10ms的参数实际有个名字叫(TDRST),规格书中要求如下

b1e05246-1c5f-11ee-9c1d-dac502259ad0.png

而一般要求接收端在D+和D-小于VIL(max)持续2.5uS以上就应该检测到复位,这个时间记住,我们可能会遇到临界情况在这个值附近可能出现不稳定的情况,调试时留个心眼,一旦出现这种很可能就是疑难杂症,但是现在留个心眼以后就可能想起来确认这里。

对于根集线器这里还有个要求就是非连续的复位要有3mS以上的间隔(TRHRSI),复位持续周期50mS(TDRSTR)以上(因为USB拓扑最大有5个集线器)

b1fc778c-1c5f-11ee-9c1d-dac502259ad0.png

2.2复位过程

参考USB2.0的规格书《7.1.7.5 Reset Signaling》

在低速/全速模式下运行的设备,如果其面向上游的端口上出现SE0超过2.5µs(TDETRST),则可以将该信号视为复位信号。复位须在复位信号结束之前生效。注意这里是复位信号结束之前就生效。(实际这里还可能导致隐蔽的BUG,我这里有一个精彩的案例分析,高速设备总是枚举为全速设备的问题,神奇的是在复位中段服务函数中加个打印就好了,后面会分享)

b20fb68a-1c5f-11ee-9c1d-dac502259ad0.png

1.主机(HUB)检测到设备连接,通过DP还是DM拉高区分是低速还是全速/高速。

2.主机(HUB驱动信号SE0以产生复位信号。

3.设备检测到SE0持续2.5uS(TFILTSE0)以上检测到复位,产生复位中断。

对于低速设备完成复位,对于全速和高速设备后面继续进行高速设备的检测。

速度的检测后面会单独再讲。

如果是从non-suspended全速状态复位则必须在SE0

开始后的2.5uS(TFILTSE0)~3.0 ms(TWTRSTFS)时间内进行后续的高速速度检测握手。

如果是从suspend状态复位,则必须在SE0开始后的2.5uS(TFILTSE0)以上时间后进行高速速度检测握手,为什么这里没有最长时间3.0 ms(TWTRSTFS)的限制了呢,因为挂起时时钟是停止的重启时钟需要时间,所以这里不限制上限时间。

如果是从non-suspended高速状态复位,则设备在恢复到全速之前必须等待不少于3.0ms且不多于3.125ms(TWTREV)。通过移除高速端接电阻并重新连接D+上拉电阻器,可实现全速恢复。该设备对总线状态进行采样,并在开始恢复至全速后检查SE0(复位而非挂起)、不小于100µs且不大于875µs(TWTRSTHS)。如果检测到SE0(复位),则设备开始高速检测握手。

注意

设备必须能够在复位恢复时间10 ms(TRSTRCY)后接受SetAddress()请求,这个时间也是一个调试经验,如果不能枚举可以检查设备的响应时间是否过长。

由于面向下游的端口在复位期间不会处于传输状态,因此高速Chirp信号不会引发断开连接检测。

如下图是DWC2驱动的复位波形,黄色为DP,高速模式。

b22b27f8-1c5f-11ee-9c1d-dac502259ad0.png

通过仿真器GDB load程序重新运行,而不是直接上电运行,如果是后者则没有(1)这个状态此时默认是没有拉高的。

DWC2控制器的软件复位不会影响SftDiscon位的状态,所以load程序后SftDiscon保持之前的拉高状态,DWC2控制器复位也不会影响

直到相关UTMI时钟复位,如下代码执行对应到(2)前面的DP拉低,此时UTMI等复位应该是导致了PHY的相关状态复位。

b24e5bd8-1c5f-11ee-9c1d-dac502259ad0.png

然后是软件设置SftDiscon位为0,拉高DP,如下代码处,对应(2)处的拉高

b283e24e-1c5f-11ee-9c1d-dac502259ad0.png

然后DP拉高100mS之后(3),主机发送复位(4),这里看到复位时间非常短,这是因为设备2.5uS以上,实际是8uS就检测到了复位(如下图所示,图中标尺部分,后面的蓝色的高DM的高是设备发出的Chirp K高速握手信号),进行了后续的高速握手,所以覆盖了主机发送的复位信号,所以看不到复位10mS的持续时间。

b2ad1344-1c5f-11ee-9c1d-dac502259ad0.png

三.总结

复位的信号很简单,但是承接的是连接检测到后续的高速速度握手,时序非常重要,尤其是有个参数2.5uS,检测到复位信号持续2.5uS即检测到复位,而不需要等复位信号移除即不需要等10mS,所以会出现主机在驱动复位,设备已经检测到复位开始后续的高速握手,从波形上看就看不到复位信号持续10mS了,而这也可能导致一些性能不达标的主机,高速握手失败,这个后面单独讲案例分析。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    60

    文章

    7758

    浏览量

    262085
  • 复位
    +关注

    关注

    0

    文章

    164

    浏览量

    24118
  • USB驱动器
    +关注

    关注

    0

    文章

    8

    浏览量

    5238
  • 复位信号
    +关注

    关注

    0

    文章

    52

    浏览量

    6262
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    109
收藏 人收藏

    评论

    相关推荐

    在STM32L4R5ZIT6中移植cherryUSB,显示不支持DMA模式为什么?

    initialized 1! [I/wiz] RT-Thread WIZnet package (V2.1.0) initialize success. [I/USB] ========== dwc2
    发表于 07-25 08:32

    鸿蒙开发设备管理:ohos.usb USB管理

    本模块主要提供管理USB设备的相关功能,包括查询USB设备列表、批量数据传输、控制命令传输、权限控制等。
    的头像 发表于 07-05 17:34 386次阅读
    鸿蒙<b class='flag-5'>开发</b>设备管理:ohos.<b class='flag-5'>usb</b> <b class='flag-5'>USB</b>管理

    TUSB1104 USB Type-C 10Gbps USB3.2 x2线性转接驱动器数据表

    德赢Vwin官网 网站提供《TUSB1104 USB Type-C 10Gbps USB3.2 x2线性转接驱动器数据表.pdf》资料免费下载
    发表于 06-22 09:41 0次下载
    TUSB1104 <b class='flag-5'>USB</b> Type-C 10Gbps <b class='flag-5'>USB</b>3.2 x<b class='flag-5'>2</b>线性转接<b class='flag-5'>驱动</b>器数据表

    ESP32-S2重复插拔USB,会导致USB驱动崩溃怎么处理?

    :https://github.com/leeebo/esp32s2_usb 仅保留USB MSC以及VFS部分,以实现类似U盘的功能,测试中发现重复插拔USB有几率导致USB
    发表于 06-21 11:53

    USB Control Center通过I2C EEPROM 、SPI FLASH下载固件均失败的原因?

    : 步骤二: 步骤三: 这会在设备管理器中看到的设备如下图: 按一下开发复位键设备状态如下: 试着重新安装驱动:PMODE J4断开时电脑端检测不到设备连接;J4短接上后更新
    发表于 02-29 06:23

    【外设移植】USB键盘+M61开发

    这篇开始使用 M62 板子来实现 USB 的设备开发,首先从最简单的 USB HID 键盘开始。固件的 SDK 使用的是 CherryUSB 开源 USB 固件。CherryUSB 是
    的头像 发表于 02-26 11:31 1453次阅读
    【外设移植】<b class='flag-5'>USB</b>键盘+M61<b class='flag-5'>开发</b>板

    英飞凌推出CYUSBS236 USB转串行通信(双通道)开发套件

    英飞凌科技(Infineon Technologies)近日宣布推出全新的CYUSBS236 USB 转串行通信(双通道)开发套件。该开发套件基于英飞凌的CY7C65215 USB
    的头像 发表于 01-24 17:12 675次阅读

    usb转串口线怎么使用 usb转串口和串口转usb的区别

    )进行通信。因此,通过使用USB转串口线,可以将现代计算机与串口设备连接起来,实现数据传输和通信。 在使用USB转串口线之前,需要先安装适当的驱动程序。这些驱动程序可以在供应商的官方网
    的头像 发表于 01-22 14:56 3080次阅读

    详解USB4技术的主要优点

    自从USB4出来以后,我们就一直发布很多文章和链接来分享相关的资讯,但是实在热度太高,到哪里都是问USB4市场如何。从早期的USB 1.0时代、数据传输1.5Mbps的接口开始,USB
    的头像 发表于 01-09 10:55 5726次阅读
    <b class='flag-5'>详解</b><b class='flag-5'>USB</b>4技术的主要优点

    USB调试模式是什么意思?USB调试模式有什么用?

    USB调试模式是什么意思?USB调试模式有什么用? USB调试模式是一种在Android设备上进行开发、测试和调试的模式。当设备处于USB
    的头像 发表于 12-11 11:06 8512次阅读

    USB协议的历史演变

    USB3.2 Gen 1x2USB3.2 Gen 2x2 分别是 USB3.2 Gen 1和
    发表于 12-06 11:12 654次阅读
    <b class='flag-5'>USB</b>协议的历史演变

    电脑USB 3.0根集线器驱动无法使用的原因

    电脑USB 3.0根集线器驱动无法使用的原因
    的头像 发表于 12-01 11:28 4168次阅读
    电脑<b class='flag-5'>USB</b> 3.0根集线器<b class='flag-5'>驱动</b>无法使用的原因

    基于ARM架构的嵌入式USB驱动的设计

    德赢Vwin官网 网站提供《基于ARM架构的嵌入式USB驱动的设计.pdf》资料免费下载
    发表于 10-12 10:17 1次下载
    基于ARM架构的嵌入式<b class='flag-5'>USB</b><b class='flag-5'>驱动</b>的设计

    STM32 USB虚拟串口驱动

    德赢Vwin官网 网站提供《STM32 USB虚拟串口驱动.rar》资料免费下载
    发表于 10-09 15:25 92次下载
    STM32 <b class='flag-5'>USB</b>虚拟串口<b class='flag-5'>驱动</b>

    如何设置usb的传输方式?

    如何设置usb的传输方式?  USB(Universal Serial Bus)是一种常见的计算机数据传输接口,它可以连接各种外部设备,例如闪存驱动器、手机、摄影机、打印机等等。使用USB
    的头像 发表于 09-12 10:34 5209次阅读