购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第4章
USB设备硬件电路设计

本书要实现的USB设备是一个基于STM32F103C8T6单片机的最小系统,其相应的电路原理图如图4.1所示。

图4.1 电路原理图

为了让STM32F103C8T6单片机能够正常工作,首先必须给其供电引脚提供合适的电源电压。VDD与VSS分别为单片机内部数字逻辑电路的供电电源与公共地引脚,将它们分别连接起来一起供电即可。为保证电路工作的稳定性,还为每一对VDD与VSS引脚配置了一个100nF的旁路电容。VDDA与VSSA是单片机内部模拟电路(如模数转换器、RC振荡器、锁相环等)的供电引脚,我们将它们分别与VDD与VSS连接,并且配置了一个100nF的旁路电容。

那么STM32F103C8T6单片机的电源供电电压应该是多少呢?根据其数据手册中的说明,VDD供电范围为2~3.6V。如果对功耗有较高要求,则可以考虑使用低压供电(如2.4V)。此处我们并没有特殊要求,所以选择了更常用的3.3V,它由型号为LM1117的低压差线性调整器(Low Dropout Regulator,LDO)芯片从USB接口(J 3 )的VBUS(+5V)获得,LDO芯片输入与输出引脚并联的4.7μF的旁路电容可以进一步保证工作的稳定性。

我们还需要配置一个 振荡时钟源 作为系统工作时钟,这样单片机才能按一定的时钟频率执行程序代码。STM32F103C8T6单片机的系统工作时钟可以来源于内部RC振荡器或外部晶体。如果仅仅作为一般的应用(要求不高),则可以考虑选择RC内部振荡源,这样可以简化电路设计而降低硬件成本。由于USB的传输速率比较高,对时钟频率的稳定度要求更高,因此我们决定采用外挂晶体(频率范围为4~16MHz,本例为8MHz)的方案,它与两个匹配电容(典型的容值范围为5~25pF,本例为22pF)及一个反馈电阻(阻值为1MΩ)配合单片机的内部电路构成振荡源。

如果需要 复位功能 ,也可以如图4.1所示连接一个轻触按键,由于NRST引脚内部已经集成了约40kΩ的上拉电阻,因此并没有再额外连接上拉电阻。

大多数单片机经过电源、振荡时钟、复位相关引脚的处理后即可正常工作,但对于STM32F103FC8T6单片机仍然不够,还必须设置正确的启动模式(Boot Mode),相关的两个引脚为BOOT0与BOOT1,其功能如表4.1所示。

表4.1 引脚BOOT0和BOOT1的功能(启动模式)

主Flash存储器 (Main Flash Memory)是将固件下载到单片机后的目标存储区,其功能与前述用来存储固件的ROM相同,只不过Flash存储器是可读可写的,也是目前单片机固件的主流存储器,芯片正常工作时会从该区域启动程序执行过程,这也是产品出货时应该设置的启动模式。 系统存储器 (System Memory)是芯片内部一块特定的ROM区域,STM32单片机出厂时在该区域预置了一段启动代码(Boot Loader),也就是我们常说的在系统编程(In System Program, ISP)程序(出厂后无法修改),它提供了串口下载程序的固件,可以借此将固件下载到 主Flash存储器 中。 内置SRAM (Embedded SRAM)模式一般用于程序调试,大家了解一下即可。

总体上,如果使用JTAG或SWD接口下载固件,使用 主Flash存储器 启动模式即可。当然,这两种接口需要使用特殊的固件下载器。如果你手中只有串口,而你又不想花钱置办JTAG或SWD接口下载器,那么你可以先将单片机设置为 系统存储器 启动模式,这样即可将固件下载到 Flash存储器 ,但需要注意的是: 每次下载固件成功后,仍然需要重新切换到主Flash存储器启动模式,然后复位(或重启电源)才能正常运行

为了方便后续的硬件调试工作,我们使用两个10kΩ的电阻将引脚BOOT1与BOOT0下拉到地(而不是直接将它们与公共地相连),这意味着默认的启动模式为 主Flash存储器 ,这样在必要的情况下,我们仍然可以通过插座(J 1 与J 2 )调整BOOT1与BOOT0的电平状态而改变启动模式。

在完成 供电电源 振荡源 复位 启动模式 的电路设计后,STM32F103C8T6单片机就可以正常工作了(还有一些其他引脚,我们不必理会,有兴趣的可自行参考相关资料),接下来的工作就是将需要使用到的引脚与相应的外围器件进行连接即可。

STM32F10x系列的单片机(含STM32F103C8T6)将所有使用到的I/O引脚划分为PA~PG(共7组),每组最多有16个引脚(例如,PA组包含的引脚为PA0,PA1,PA2,…,PA14,PA15,其他以此类推),所以理论上最多支持112个IO引脚。当然,并不是所有STM32F10x系列的单片机都有这么多引脚。例如,STM32F103C8T6单片机为LQFP48封装,最多可用的IO引脚数量为32个。当然,有些I/O引脚与一些特殊功能引脚是复用的。例如,USB控制器的差分信号线D+、D-分别对应PA12、PA11,如果你要使用IO引脚控制LED(或读取按键)的状态,这两个引脚自然是不能使用的(除非你的应用中没有使用到USB控制器)。表4.2列出了图4.1所示USB设备硬件中的IO引脚资源规划。

表4.2 图4.1所示USB设备硬件中的IO引脚资源规划

将4个发光二极管(D 1 ~D 4 )以 低有效 的方式与单片机的引脚相连,7个轻触按键(K 1 ~K 7 )则以 高有效 的方式与单片机的引脚相连(K 8 为复位按键),同样也没有给这些引脚添加下拉电阻,因为我们可以在源代码中使能STM32单片机内部已经集成的下拉(或上拉)电阻。

最后,将USB控制器相关的D+、D-信号线与USB接口连接即可。需要注意的是,D+与D-属于差分信号对,在进行PCB布线时一般遵循“等长等距”的原则(等长优先),在要求较高的场合下,还需要进行线宽、线距的计算,并与PCB厂家联系进行阻抗控制。如图4.2所示为USB差分线PCB布线示例。

图4.2 USB差分线PCB布线示例

需要特别注意的是: 信号线D+与VDD之间连接了一个1.5kΩ的上拉电阻 ,为什么要这么做呢?它用来给“主机检测设备支持速率模式”提供判断依据!我们前面已经提过,USB 2.0支持低速、全速与高速三种模式,那么主机通过什么来判断USB设备支持哪种模式呢?主机就是根据D+或D-的引脚电平来判断USB设备是支持低速还是支持全速的。

USB 2.0规范已经明确指出,主机(或集线器)端的D+、D-引脚均连接了阻值约为15kΩ的下拉电阻,这也就意味着: 在没有USB设备与主机(或集线器)连接时,D+与D-信号线都是低电平 。如果你的设备支持低速模式,则应该在信号线D-连接约1.5kΩ的上拉电阻,如果你的设备支持全速模式,则应该在信号线D+连接约1.5kΩ的上拉电阻(上拉电平的范围为3.0~3.6V,典型值为3.3V),如图4.3所示。

图4.3 高速与全速设备的检测

在实际工作中,USB主机会不断地(每隔一般时间)查询根集线器,通过检查信号线D+与D-的电平变化来了解USB设备的连接状态。当集线器检测到电平发生变化时,就会报告给USB主机(或者通过上一层的集线器报告给USB主机),这样就能检测到USB设备的插入了。换句话说,即使你只是通过一个电阻单纯地将主机端的信号线D-或D+上拉到高电平,操作系统也会提示: 已经发现新硬件,但是无法识别该USB设备 。Windows 10操作系统的提示如图4.4所示。

图4.4 无法识别的USB设备

如果此时进入图4.5所示的“设备管理器”界面,就会发现“通用串行总线控制器”项下面增加了一项“未知USB设备(设备描述符请求失败)”,前面的USB图标上面挂了一个“带感叹号的黄色三角形”,这意味着该设备没有正确加载驱动程序。

图4.5 “设备管理器”界面 +9pszxX8TyXjPvQcrpUcmtOSV3bbyA3wP3hIEWDTAJ4v12AaajOFyU0918YxSlTh

点击中间区域
呼出菜单
上一章
目录
下一章
×