USB ,是英文 Universal Serial BUS(通用串行总线)的缩写,而其中文简称为“通串线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。USB 是在 1994 年底由英特尔、康柏、IBM、Microsoft 等多家公司联合提出的。
USB 发展到现在已经有 USB1.0/1.1/2.0/3.0 等多个版本。目前用的最多的就是 USB1.1 和USB2.0,USB3.0 已经开发出来了相信不久就可以在我们的电脑上见到。STM32F103 自带的 USB符合USB2.0 规范。
标准USB共四根线组成,除VCC/GND外,另外为D+,D-; 这两根数据线采用的是差分电压的方式进行数据传输的。在 USB 主机上,D-和 D+都是接了 15K的电阻到低的,所以在没有设备接入的时候,D+、D-均是低电平。而在USB设备(Device)中,如果是高速设备,则会在D+上接一个1.5K 的电阻到 VCC,而如果是低速设备,则会在 D-上接一个 1.5K 的电阻到 VCC。这样当设备接入主机的时候,主机(Host)就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。
Cannon的接法是正确的,不过其固定了 STM32F401RE USB-OTG-FS的模式为高速USB设备。如果以开发板角度看,就有一些美中不足。但一般单片机的USB大都用作 USB Device,都已经足够了。
是还是一定要1.5K?
答案是否定的。USB 是差分数据传输,NZRI编码方式。阈值是2.7~3.0V。
这样的接法还存在一个问题?
就是USB线接好后,复位后,电脑(Host)是并不一定能检索到Device。原因在于枚举过程的建立。
再来看一个资料, USB主机是如何检测到设备的插入的呢?
首先,在USB集线器的每个下游端口的D+和D-上, 分别接了一个15K欧姆的下拉电阻到地。这样,在集线器的端口悬空时,就被这两个下拉电阻拉到了低电平。而在USB设备端,在D+或者D-上接了1.5K欧姆上拉电阻。对于全速和高速设备, 上拉电阻是接在D+上;而低速设备则是上拉电阻接在D-上。这样,当设备插入到集线器时,由1.5K的上拉电阻和15K的下拉电阻分压,结果就将差分数据线中的一条拉高了。集线器检测到这个状态后,它就报告给USB主控制器(或者通过它上一层的集线器报告给USB主控制器),这样就检测到设备的插入了。USB高速设备先是被识别为全速设备,然后通过HOST和DEVICE两者之间的确认,再切换到高速模式的。在高速模式下,是电流传输模式,这时将D+上的上拉电阻断开。
一个简单的实验:只用一个上拉电阻接在USB的+5V和D+或者D-上,WINDOWS也会提示发现新硬件,但是无法找到驱动程序。这时去设备管理器里面看,有显示未知USB设备,并且其VID和PID为0。根据这个,我们可以简单的判断设备是否枚举成功。如下图所示,分别是枚举不成功和枚举成功的图。
解决方法?
热插拔
是不是只有热插拔这么复杂呢?
答案是否定的。上述的经验就是原自STM32F103系列的。如果你对比一下STM32F103与STM32F401 USB的结构,就发觉区别的
在于STM32F401 是有OTG 、Host 、Device三种模式、STM32F103只有Device模式
再看手册STM32F401 USB部分,是内嵌上拉与下拉电阻
STM32F103并没有找到相关资料,也是为什么要外接上拉电阻的原因。
但在我的感觉认为 Cannon的USB的接法有些不合适,应该通过三极管控制上拉的情况
解决方法,把上拉的电阻去掉,不去掉也没有问题,部分功能不能罢了,也没有问题
还有一个问题,一个潜在性的问题?就是ESD的问题
查一下 STM32F401RE的资料
这种接法暴露引脚的而没有做ESD保护,只能愿天保佑吧,希望不要那么运气低,那么手贱。
但也不必担心,不管怎么说那是极端的情况,接触前放一下静电即可。
STM32F401推荐电路
原地址 http://blog.sina.com.cn/s/blog_7e7fa4c80102waas.html