电子发烧友网

电脑版
提示:原网页已由神马搜索转码, 内容由www.elecfans.com提供.
会员中心
创作中心
发布

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

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

本文转自公众号欢迎关注

基于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了,而这也可能导致一些性能不达标的主机,高速握手失败,这个后面单独讲案例分析。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
  • 复位
  • USB驱动器
  • 复位信号
  • DWC2
1人收藏

    评论

    发布评论请先 登录

    相关推荐

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

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

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

    电子发烧友网站提供《TUSB1104 USBType-C 10Gbps USB3.2 x2线性转接驱动器数据表.pdf》资料免费下载
    06-22 09:41 0次下载

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

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

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

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

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

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

    详解USB4技术的主要优点

    自从USB4出来以后,我们就一直发布很多文章和链接来分享相关的资讯,但是实在热度太高,到哪里都是问USB4市场如何。从早期的USB1.0时代、数据传输1.5Mbps的接口开始,USB
    01-09 10:55 5598次阅读

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

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

    USB协议的历史演变

    USB3.2 Gen 1x2USB3.2 Gen 2x2分别是 USB3.2 Gen 1和
    12-06 11:12 601次阅读

    电脑USB3.0根集线器驱动无法使用的原因

    电脑USB3.0根集线器驱动无法使用的原因
    12-01 11:28 3803次阅读

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

    电子发烧友网站提供《基于ARM架构的嵌入式USB驱动的设计.pdf》资料免费下载
    10-12 10:17 1次下载

    STM32 USB虚拟串口驱动

    电子发烧友网站提供《STM32 USB虚拟串口驱动.rar》资料免费下载
    10-09 15:25 90次下载

    使用Cherryusb host加载u盘后shell就不能输入了是为什么?

    11:28:35.783]# RECV ASCII> [32m[I/USB] ========== dwc2hcd params ========== [0m[32m[I/USB
    09-03 10:52

    基于DWC_ether_qos的以太网驱动开发-软复位介绍与问题案例

    一般模块都会有软复位的功能,软复位驱动编写中很重要。一般初始化时执行软复位使得模块进入确定的初始状态以提高可靠性,异常时也可以重新初始化来恢复,所以软
    09-02 09:17 1184次阅读

    基于DWC_ether_qos的以太网驱动开发-描述符链表介绍

    of descriptors)。DMA根据描述符链表自动在FIFO和用户指定的缓存之间搬运数据。对于熟悉新思的IP的用户来说,这种套路会有似曾相识的感觉,没错新思的大部分高速IP的数据流都是这么处理的,比如在DWC2
    08-30 09:39 3650次阅读

    基于DWC_ether_qos的以太网驱动开发-MDIO驱动编写与测试

    本文转自公众号欢迎关注 基于DWC_ether_qos的以太网驱动开发-MDIO驱动编写与测试 一.前言 以太网驱动的编写与调试往往从MDI
    08-30 09:37 3092次阅读
    131文章50.8w阅读171粉丝15点赞

    推荐专栏

    更多