个人学习USB坑中坑的学习知识总结,可能随时更新。(会记录很多断层后续慢慢补齐)
一.USB枚举:
USB枚举的过程为:
(type-c检测到有host/dev接入=》切换到对应模式【type-c链接可以确定host/dev】)=》当host检测到DP/DM被dev拉高则进行reset,并在第一次reset时调整通信速度(见1.1.章节)=》获取描述符,host配置address,并且发出第二次reset =》当reset完成后,在新的address上进行通信,并完成configured。
1.1 关于USB设备接入和速度确认:
本部分参考,这个博主有图有说明,写的很好:https://blog.csdn.net/u014135607/article/details/80411855
1)USB设备如何识别设备速度
1.判断DP/DM电阻: D-上面接电阻(上拉1.5K),说明是低速,D+上接电阻(上拉1.5K)说明是full/high speed。
2.若是D+上接电阻:这要通过JK信号判别USB速度。
具体流程如下:
1.当USB 设备read,且准备被枚举时,拉高对应DP/DM
2.当HOST检测到DP/DM被拉高时,发出set_port_feature信号,后再发出复位信号即将DP/DM拉低(0V),最少10ms
3.表明DEV的速度配置:K信号
高速的DEV,在接收到host的复位(DP/DM拉低)之后,内部会在D-上加上电流,因为host的hub的硬件关系,则会在DM上看到约800mv的电压(持续时间1~7ms),即K信号。反之,全速设备在复位期间,不会有这个操作。用这个即可区分H/F Speed。
4.是否是支持高速的HOST:
支持高速的host,在接收到K信号后,会主动驱动自己打出KJKJKJ序列(可看到波形高低变化)。表明自己支持USB20,则后续的通信将在high speed进行。否则都将在full speed进行。
补充:当dev K信号发车,host必须在100us内返回一连串的KJKJKJ信号(不能间断,每个K/J持续时间为40~60us)。并且dev要在3对KJ信号之后的500us内切换到高速模式,因为切换玩后还处于复位信号期间,所以此时还会处于一段时间的dp/dm为0。dev切换过程中:
1)端口1.5K上拉电阻(此时可以看到DM的电压掉落,即400mv)
2)连接高速终端电阻
3)自己切换到高速状态。至此握手完毕。
总结:从波形上来看,
1.DM被拉高(高于1.8V,看别人的图是3.3V),则为low speed
2.DP 被拉高,在复位期间(DP/DM先被拉到0):
1.没有K信号(DM 800mV):dev不支持高速,后续在full speed下运行
2.有K信号(DM 800mV):
1)没有KJKJ:dev支持高速,但是host不支持高速。最后在全速下运行
2)有KJKJKJ:dev 和host都支持高速。并且之后在高速模式下运行
3.速度确认处于复位信号中 ,即high speed的复位信号过程是:DP/DM 0V ->800MV ->800MV KJ信号 ->400mv KJ信号-> DP/DM 0v。
2)通信状态电平:
1.差分信号,幅值:一般为400mv和0v
2.空闲电平