给模块添加 USB 支持的 USB Host Shield Mini
简介
图 1:USB Host Shield Mini
USB Host Shield Mini 是一块基于 MAX3421E 芯片
的模组。MAX3421E 芯片是带 SPI 接口既可以用作外设也可以用作主机的的 USB 2.0 控制器12。
不想每次都输入一大段名字,下面用缩写 UHS 表示 USB Host Shield Mini。
对于要扩展 USB 通信功能的模组来说,需要使用 SPI 协议3与 UHSM 通信。
UHSM 是 USB Host Shield 的简化版本,拥有更小的体积,避免成品体积过大。
图 2:USB Host Shield
体积小是优点,缺点是网络上比较难找到各个焊盘对应的引脚,只能自己标。
可以在 Arduino 上面找到这块板的资源4。在其他网站上面有 Mini 的资源5,不过 PCB 板的文件版本过老,打不开。
于是我决定先把这个缺点干掉。
引脚与焊盘的对应关系
板上大多数孔都直接连接到了中间的芯片,芯片上写着 MAX3421E 。
找到 MAX3421E 芯片的官方网站:
https://www.maximintegrated.com/cn/products/interface/controllers-expanders/MAX3421E.html
里面的【下载数据手册】可以查看芯片引脚信息。以下引脚图来自数据手册:
图 3:MAX3421E 芯片引脚图
现在需要把引脚的关系对应起来。注意到 Mini 板上背面有一个 RST,这是 Reset 的缩写。从图 3 中找到 RES(也是 Reset 的缩写),就是芯片右侧从下往上数第四根引脚。
回到板上找到连接 RST 焊盘的导线连接的引脚,会发现如果旋转到如图 4 的角度,就能和芯片图对上。
图 4:UHSM 模组焊盘与芯片引脚对应
把正背面的过孔6对应起来:
图 5:UHSM 正背面过孔对应
注意,图 5 中左边的那些 VBUS、INT、GPX、MAX_RST、SS 都是对焊盘的标记,跟它们所覆盖到的导线没有关系。
根据过孔的对应关系推出正背面导线的连接关系,把各个焊盘对应的引脚标注出来:
图 6:UHSM 焊盘对应引脚名称
取反的 SS
、MOSI、MISO、SCLK 用于 SPI 通信3。INT 是用于 SPI 的可选项,用于发送中断(INTerrupt)信号,告知主设备有 USB 事件发生。
VL 是逻辑电平7的参考电压,是 SPI 接口和所有其他数字输入及输出的参考电平。以 MAX3421E 用于 SPI 的输出引脚 MISO 为例子。在 VL ≥ 2.5V 且 VL 引脚电流为 +10mA 的时候,MISO 引脚的电压要高于
VL-0.4
才算输出高电平。从 USB Host Shield 的电路图来看(Mini 的看不了),MAX3421E 芯片的 Vcc 和 VL 用导线连接在一起,共同连接到 3.3V 的电源。
GPIN 0
7 以及 GPOUT 07。对于一些不含 SPI 硬件接口的 SPI 主设备,跟这块芯片通信时需要使用 I/O 引脚模拟,占用了宝贵的 I/O 引脚资源。不过这个芯片提供了 8 个通用输入(GPIN)和 8 个通用输出(GPOUT),让 SPI 主设备不仅不会因为接入该芯片而减少总体 I/O 引脚数量,反而增加了。可以说是非常贴心。取反的 RES
为低时,会把一些寄存器的状态设置为默认状态。GPX 能表示五种信号,根据一个寄存器的某两个位选择(其中两种信号互斥,由另一个寄存器的某一位决定)。
从设备还是主设备?
它作为 USB 端的接收者,是 USB 主设备。同时它作为 SPI 数据发送方,是 SPI 从设备。
SPI 通信
SPI 协议占用四个引脚,从设备选择(取反的 SS,Slave Select),时钟信号(SCLK),主设备输出(MOSI),从设备输出(MISO)。
关于 SPI 协议的介绍以及四个引脚的作用,可以看上一篇:
https://www.cnblogs.com/schaepher/p/14521055.html (设备间数据通信 —— 串行外设接口(SPI)协议)
文章中提到主设备在编程时,需要根据从设备的信息配置两个选项:
- SPI 模式
- First Bit
MAX3421E 在 SCLK 的下降沿改变其输出数据(MISO),在 SCLK 的上升沿采样输入数据(MOSI)
因此主设备选 (0,0) 或者 (1,1) 都行。
数据手册的应用信息一节里的 SPI 接口部分写着:
所有 SPI 传送都是 MSB 在前
所以设置 First Bit 时,应设置为 MSB。
另外 MAX3421E 对 SCLK 最高频率限制在 26MHz。
供电
MAX3421E 的工作电压范围为 3.0V ~ 3.6V,通常约定使用 3.3V 的电源8。
由于 USB 外设(如键盘)的工作电压通常为 5.0V,因此不能使用板上提供的电压。
图 7:USB 四条导线及供电焊盘
USB 的 Vcc 连接着一个焊盘,即图 7 中标号 1 的地方。这个是 PCB 板设计者预留的一个供电口。
如果只需要 3.3V 的电源,则不需要任何改造,使用默认的导线即可。但如果需要更高的电压,则需要使用这个预留的供电口。
如果要使用这个供电口,则应先把原先的供电导线切断。如图 7 中的黄色标记所示,用小刀或者其他工具按照指示将导线切断。这样需要把 5.0V 的电源接到标号 1 的焊盘上。
在这样操作后,总共需要引入两个电压不同的电源到这块板上。一个 5.0V 的电源引到图 7 标号 1 的焊盘,另一个 3.3V 的电源引到 VL 焊盘。
编程
UHSM 自身不支持写入程序,但接入 UHSM 的模块(例如 Arduino、ESP32)在编程时可以使用 Github 上开源的库通过 SPI 协议操作 MAX3421E 芯片里的寄存器。
https://github.com/felis/USB_Host_Shield_2.0 (USB_Host_Shield_2.0)
参考
其他:
https://www.pjrc.com/teensy/td_libs_USBHostShield.html
https://www.itead.cc/wiki/Arduino_USB_Host_Shield
https://chome.nerpa.tech/arduino_usb_host_shield_projects/
https://datasheets.maximintegrated.com/cn/ds/MAX3421E_cn.pdf (MAX3421E 数据表(第三版)——中文) ↩︎ ↩︎
https://datasheets.maximintegrated.com/en/ds/MAX3421E.pdf (MAX3421E 数据表(第四版)——英文) ↩︎ ↩︎
https://www.cnblogs.com/schaepher/p/14521055.html (设备间数据通信 —— 串行外设接口(SPI)协议) ↩︎ ↩︎
https://www.arduino.cc/en/Main/ArduinoUSBHostShield&lang= (Arduino USB Host Shield) ↩︎
https://chome.nerpa.tech/downloads/#Arduino_USB_Host_Shield_Documentation (Circuits@Home) ↩︎
https://www.cnblogs.com/schaepher/p/14492102.html (快速了解线路板(PCB)基础知识) ↩︎
https://baike.baidu.com/item/%E9%80%BB%E8%BE%91%E7%94%B5%E5%B9%B3 (逻辑电平) ↩︎
https://www.zhihu.com/question/22687846/answer/31508409 (为什么很多低功耗的芯片都采用3.3v的电源,这个电压有什么科学依据吗?) ↩︎