本文转自公众号,欢迎关注 基于dwc2的usb驱动开发-高速设备速度握手详解 (qq.com)
前言 前面我们分析了usb连接和复位的过程, 也知道低速和全速/高速的usb设备分别是上拉dm和dp,主机通过不同的上拉区分接的是低速还是全速/高速设备的。但是怎么区分全速和高速呢? 这就需要额外的一些握手过程,本篇就来详细介绍该过程。
高速握手过程
usb连接检测过程见如下
https://mp.weixin.qq.com/s/t6pblp83iiejdvm_6ogqda
usb复位过程见
https://mp.weixin.qq.com/s/8xkca-xpjzxaio6moqvgaq
对于低速设备上拉dm,主机检测到该上拉,然后发送复位就完了
对于全速和高速设备上拉dp,主机检测到该上拉,然后发送复位,接下来是速度握手过程。
老规矩我们从规格书入手,usb2.0规格书p154中《high-speed detection handshake (not performed if low-speed device detected by hub):》有描述整个过程,但是这都是文字描述,不是很直观,所以我们理论结合实践,直接根据真实的波形和规格书的描述对照进行分析。
在速度握手中,主机(集线器)和设备都需要检测拥有最小持续时间的chirp j和k, 涉及到两个关键信号chirp j和k(参见规格书7.1 signaling或者本系列文章)。
整个过程如下
(1)设备使能dp上拉1.5k,如下图的(1)处,此时dp大概3v左右
(2)主机检测到dp拉高,检测到设备连接,发送se0进行复位
如上图的(2),因为时间很短,下面是细节图,可以看到下图se0状态只维持了8us,后面就是蓝色线(dm)高于黄色线即chirp k信号,对应上图的(3)部分。
回顾一下复位分析那一篇文章,发送放复位会持续50ms,但是接收方在最低2.5us就可以识别到复位,这里实测是8us设备就识别到复位然后开始发送chirp k信号了。
保持d+上的1.5k上拉电阻使能,设备发送chirp k信号是通过,禁用高速终端电阻,并将高速信号电流驱动到d-线完成的。
这里有点不理解禁用了终端电阻,电流驱动到d-线,电流环路是什么?
并且如下可以看到dm有1.2v左右,这个电压是如何来的?
该chirp k信号必须持续不少于1.0 ms(tuch),并且在高速复位时间t0点(即主机发出的se0开始)后不超过7.0 ms(tuchend)结束。
chirp k持续时间如下所示,这里是2ms,满足上述要求
参数tuch和tuchend的值在手册中的描述如下
上述可以看到chirp k的信号,dm大概是1.1v左右,比后面的kj序列高一点。
(3)主机(集线器)必须在看到chirp k信号持续2.5µs(tfilt)时间以上,后认为检测到设备发出的chirpk,这里的2.5us的要是实际是相当于滤波避免干扰。如果主机(集线器)未检测到设备发出的chirp k信号,则必须继续发送se0,直到复位结束(持续50ms)。
tfilt参数见规格书如下处说明
在chirp k状态结束后不超过100µs(twtdch),主机(集线器)必须开始发送chirp k和chirp j的交替序列,j和k之间不得存在空闲状态。此序列必须持续到复位结束前不超过500µs且不少于100µs的时间(tdchse0)(这样的目的是保证总线保持活动状态,防止设备进入高速挂起状态。)。每个单独的chirp k和chirp j必须持续不少于40µs且不超过60µs(tdchbit)。
twtdch,tdchse0,tdchbit的参数上图。
如下图(4)处
细节图如下
如下可以看到要求chirp k结束100µs(twtdch)以内开始后面的kj序列,实际10us左右就开始了,满足要求。
如下图所示,主机发送的kj序列持续了约50ms,即约复位的时间,实际要求是发送到复位结束前的100µs~500us,这里示波器能力有限就不展示下图右边红色圈处的细节了。
在k-j序列之后,主机(集线器)发送se0,直到复位结束,即上面说的kj序列之后100~500us复位结束。复位结束时,主机(集线器)必须转换到高速启用状态,而不会在数据线上引起任何转换。
(4)设备这端发送完chirp k之后监控主机发送的k-j序列。设备端需要至少看到3对k-j序列,即序列chirp k-j-k-j-k-j才认为是有效的kj序列。每个单独的chirp k和chirp j必须检测不少于2.5µs(tfilt)。
我们这里看到有持续50us满足要求
如果设备检测到序列chirp k-j-k-j-k-j,则检测后不超过500µs(twths),设备需要断开d+上拉电阻器,启用高速终端,并进入高速默认状态。
如下图所示,这里刚好约500us左右进行了上述切换,上述切换也导致了dp和dm的电平的变化,原来kj序列大概是0.8v左右,即主机发送kj是通过电流17.78ma驱动45欧终端电阻实现的,17.78ma*45即0.8v。而我们又看到后面箭头处的电压下降,是因为正好是上述的设备切换到了高速模式,使能了45ω终端电阻,所以设备的终端电阻和主机的终端电阻并联只有一般电阻,所以电压就只有一般0.4v左右了。
如果设备在完成其自己的chirp k之后,在不小于1.0ms且不大于2.5ms(twtfs)的时间内未检测到有效kj序列,则设备需要恢复到全速默认状态并等待复位结束。
以上就是整个速度握手的过程,比较细节,我们再做一些总结
关于整体电压的变化,如下图,有4个等级,图中(1)和(2)之间还有个复位的se0电平这里就略掉了。
(1)即设备通过dp上拉,即15k和1.5k的分压,3.3x15/(1.5+15) dp大概3v.
(2)设备发送chirp k,dp 1.5k上拉还在,设备终端电阻禁用,实测d-上的电压是大概1.2v,这里的电流路径是什么? 待确定。
(3)主机发送kj序列,主机通过驱动17.78ma电流到对应45欧终端电阻,发送kj,所以dp dm是0.8v
(4)设备也进入了高速模式,1.5k上拉断开,设备使能了45欧终端电阻,和主机的终端电阻并联,主机继续在发kj序列,此时主机的17.78ma电流驱动只能产生0.4v的电压。
驱动编写
手册p522 5.4.47 dcfg的bit[1:0]devspd用于配置设备期望工作过的速度,注意这里是期望,而不是一定,因为还需要速度握手过程,比如这里配置为高速,则还需要看主机是否支持高速。
所以我们需要在初始化时配置该位,告诉控制器后面以该速度去进行速度握手。那么握手结束之后实际是什么速度呢,手册p539的5.4.49 dsts寄存器的位[2:1]enumspd可以看到
在速度握手完成之后还会产生中断,
手册p369寄存器5.4.7 gintmsk的位13 enumdonemsk设置为1使能,速度握手完成中断。
相应的手册p357寄存器5.4.6 gintsts的位13enumdone为中断标志,写1清除标志
所以驱动的基本过程是
1.初始化配置devspd设置期望的工作速度
2.配置enumdonemsk使能中断,清除标志enumdone
3.等待中断,查询实际握手的速度enumspd,根据该速度再次重新配置devspd设置工作过速度。并清除标志enumdone。
以上就完成了整个速度握手过程。
实际以上逻辑如果是非标主机,可能会存在bug,后面会有一个实际案例进行分享,先卖个关子以后再单独写一篇文章分享该案例。
如下图两个箭头处分别对应的是复位中断,和速度握手完成中断
我们通过中断服务函数中打印时间戳(注意要用非阻塞方式),看到reset_intr和high speed之间的时间刚好是50ms(打印的是us单位),和图中对应
而我们在usb_dev_crtl_sft_discon(0);使能dp上拉时也加一个打印,即上面connect后打印的时间戳和reset_intr之间是50ms,如下图
总结
以上介绍了整个速度握手过程,以及设备驱动的编写。重点是结合手册的描述对照波形去看和分析,要了解没以一个实践段,每一个信号,每一个电平的含义和原理,知道那个信号是谁驱动的,为什么是这个波形,一定要自己亲自用示波器去抓波形,而不要使用别人的波形,因为不同的设备可能略有差异,如何去触发,如何去抓波形,也会加深自己的理解。
苹果市值破兆美元看似疯狂,却无泡沫化隐忧
物联网平台目前都面临哪些困境
浅析静态功耗和静态时序分析
太阳辐照度设备的制作教程
性价比最高的5款移动电源对比评测 我应该买哪款
基于DWC2的USB驱动开发-高速设备速度握手详解
绮境森林重塑设计之美,华为nova5不止有人像超级夜景自拍
科锐公司推出两项新型GaN工艺技术
身份网络可以依靠区块链来拯救吗
华为进军智能电视之路该怎么走?
2019年第三季度中国平板电脑市场出货量情况分析
基于角色的松耦合式权限控制设计
合泰丰购买三星显示器Gen-8 LCD生产线设备
GaN半导体技术及其在电子领域的前景
苹果Mac自研M1芯片 CPU花费将降到6.97亿美元
创通联达发布TurboX EB5边缘智能站
科创板瀚川智能董事穆振洲介绍、履历信息
电池容量多少需要更换_电池容量低于多少要换
B2C网站后台订单处理实验
Silicon Labs具备最佳ZigBee和Thread连接的 互联家庭解决方案首度亮相