USB从机如何检测usb拔出。
A:没办法。usb协议没有规定从机对于usb拔出的检测。
最简单的方法就是判断USB的5V电源,连接到一个中断io口,使用中断方式,如果使用轮询的话比较占用CPU资源。
中断方式是,加2个电阻分压,使用一个外部中断口的下降沿产生中断,很容易实现。
用电阻分压有两个目的:
1)产生3.3V的电平;
2)更重要的是在USB 5V消失后外部中断口被下拉到地,不至于浮空,保证稳定的输入电平。
额外:
有一种方法也可以,那就是usb拔出时,会执行suspend中断。但这个方法有点问题,就是真正的suspend事件发生时,会误认为是usb拔出。
使用Suspend中断检测USB设备拔出的副作用是:
当主机进入休眠时,USB总线会进入Suspend状态,这时STM32将产生Suspend中断;如果你只用Suspend中断检测USB设备是否拔出,你的程序将不知道这个中断是因为设备拔出还是主机休眠,造成判断错误。
即使主机不进入休眠状态,有些USB Hub为了省电也可能进入休眠状态,此时与该Hub相连的STM32设备也将产生Suspend中断。。
何时进入suspend状态:
进入suspend的条件是,“总线上3ms没有数据传输”。但即使总线上没有客户之间的数据传输,总线每1ms(假设是全速设备)也会固定发送一个帧开始包,这可以防止设备进入suspend状态。
所以虽然拔出usb,会因为3ms没有接收到数据而进入suspend状态,