简介
图 1:USB Host Shield Mini
USB Host Shield Mini 是一块基于 MAX3421E 芯片
的模组。MAX3421E 芯片是带 SPI 接口既可以用作外设也可以用作主机的的 USB 2.0 控制器[1][2]。
不想每次都输入一大段名字,下面用缩写 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 0~7。对于一些不含 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)
参考
[1]: https://datasheets.maximintegrated.com/cn/ds/MAX3421E_cn.pdf (MAX3421E 数据表(第三版)——中文)
[2]: https://datasheets.maximintegrated.com/en/ds/MAX3421E.pdf (MAX3421E 数据表(第四版)——英文)
[3]: https://www.cnblogs.com/schaepher/p/14521055.html (设备间数据通信 —— 串行外设接口(SPI)协议)
[4]: https://www.arduino.cc/en/Main/ArduinoUSBHostShield&lang= (Arduino USB Host Shield)
[5]: https://chome.nerpa.tech/downloads/#Arduino_USB_Host_Shield_Documentation (
Circuits@Home)
[6]: https://www.cnblogs.com/schaepher/p/14492102.html (快速了解线路板(PCB)基础知识)
[7]: https://baike.baidu.com/item/%E9%80%BB%E8%BE%91%E7%94%B5%E5%B9%B3 (逻辑电平)
[8]: https://www.zhihu.com/question/22687846/answer/31508409 (为什么很多低功耗的芯片都采用3.3v的电源,这个电压有什么科学依据吗?)
其他:
https://www.pjrc.com/teensy/td_libs_USBHostShield.html