USB - CH643通过软件模拟设备插拔动作

我们知道,USB总线上的所有活动都是由主机发起的,也就是说设备挂在USB总线上有时候是身不由己的,
比如,某种极端情况下,键盘枚举失败了,需要主机对键盘重新枚举,但主机枚举失败后已经放弃了键盘,那这时只能将键盘重新物理插拔一下,这对于用户来说是极其影响体验的,但键盘如果自己能软件模拟出插拔动作,那在检测出通信异常的情况下,就可以主动决定让主机将自己重新枚举,相当于提升了键盘对于恶劣环境的适应性,多了一个保命被动技能,那要软件上如何来实现呢?

USB接入检测机制

首先我们要了解USB基础的接入检测逻辑;
在集线器下游每个端口的差分数据线D+和D-上,连接了15K欧的电阻到地,没有设备插入时,数据线被下拉至低电平;
在设备端的差分数据线D+或D-上,连接了1.5K欧的上拉电阻至3V3电源,上拉电阻连接在D+还是D-上,取决于设备的速度,低速设备上拉电阻连接在D-,全速和高速设备的上拉电阻连接在D+。
当设备插入到集线器,集线器数据线的电平将由下拉电阻与上拉电阻分压决定,结果是高电平;也就是说,当有设备接入集线器时,原本为低电平的D+和D-其中之一会被拉至高电平。集线器检测到这个状态后上报至主控制器,即视为有设备接入。

软件模拟USB插拔动作

简单来说,要软件模拟出插拔动作,实质上就是要先把设备D+或D-上的上拉去掉,骗主机原来的设备移除了;然后再重新上拉,主机就会认为是重新接入了一个设备;
作为 USB 设备所必要的 USB 总线上拉电阻可以由软件随时设置是否启用,这也是CH643能够软件模拟USB插拔动作的充分必要条件;
CH32系列的USBFS和USBHS控制器皆具备此特性,实现逻辑一致,具体方法视型号不同略有差异;
接下来以CH643为例,AFIO寄存器中可配置USB的DP/DM引脚的内部上拉;
image
直接展示函数,完成软件模拟USB插拔动作;

image

posted @ 2024-10-31 19:07  WCH_CH32  阅读(102)  评论(0编辑  收藏  举报