4. 接口协议基础:UART、I2C、SPI、GPIO 在售货机中的应用场景

做售货机主控选型,说白了就是选「怎么跟外面那些零件说话」。你想想看,一个售货机里,有硬币器、有电机、有显示屏、有温度传感器……它们各自说着不同的「方言」。主控芯片要是不会这些方言,那机器就是个摆设。

我个人习惯,在定方案之前,先把要用到的接口协议捋一遍。这步走对了,后面画原理图、调驱动,能省一半的功夫。今天咱们就聊聊 UART、I2C、SPI、GPIO 这四位「老熟人」,在售货机里到底怎么用。

4.1 UART:老当益壮的串口通信

UART,全称通用异步收发器。说白了就是一根线发、一根线收,地线共地,三根线搞定。它最大的优点就是简单,几乎所有的单片机都有 UART 外设。

在售货机里,UART 最常见的场景就是和「钱箱」打交道。

  • 硬币器 / 纸币器:这些设备几乎清一色用 UART 通信。我记得有一次调试一个硬币器,协议里规定波特率是 9600,8 位数据,无校验。结果死活收不到数据。后来拿示波器一看,原来是硬币器那边把 TX 和 RX 接反了。嗯,这种低级错误,犯过一次就记住了。
  • 串口打印机:小票打印,也是 UART。波特率通常 115200,数据量不大,但要求稳定。
  • 蓝牙 / WiFi 模块:比如 ESP8266 或者 HC-05,跟主控通信也是走 UART。主控发 AT 指令,模块返回结果。
我的小技巧: 选主控时,尽量选带 2 个以上独立 UART 的。一个给钱箱,一个给打印机,再留一个给调试口。别问我为什么,等你发现调试口和钱箱口冲突的时候,就懂了。

UART 的缺点也很明显:只能点对点。一个 UART 口只能接一个设备。要是接多个,得用软件模拟或者加多路复用器,麻烦。

4.2 I2C:两线制,挂一堆从机

I2C 只有两根线:SCL(时钟)和 SDA(数据)。所有设备都挂在这两根线上,靠地址区分。这个特性,在售货机里简直太实用了。

我建议,凡是「传感器」类的设备,优先考虑 I2C。

  • 温度传感器:比如 SHT30、LM75,都是 I2C 接口。货道里放几个,监测饮料温度是否达标。
  • EEPROM:存配置参数、销售记录。24C02 这种经典芯片,I2C 接口,便宜又好用。
  • RTC 实时时钟:DS3231 或者 PCF8563,记录交易时间。售货机断电了,时间不能丢。
  • IO 扩展芯片:比如 PCF8574,用 I2C 扩展出 8 个 GPIO。主控引脚不够时,这招很管用。
避坑指南: 我曾经在一个项目里,把 5 个 I2C 设备挂在一根总线上。结果发现,总线电容太大,信号波形都变形了。后来加了电平转换芯片,并且把上拉电阻从 4.7k 换成了 2.2k,才稳定下来。记住:I2C 总线上的设备数量,不是无限制的。

I2C 的速度一般 100kHz 或 400kHz。对于传感器和存储来说,完全够用。但你要是想传音频、视频,那还是算了。

4.3 SPI:快,是真的快

SPI 是四线制:SCK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。它比 I2C 快得多,而且全双工,收发可以同时进行。

在售货机里,SPI 主要用在「大流量数据」的场景。

  • LCD 显示屏:尤其是 TFT 彩屏,刷新一帧画面需要传大量像素数据。SPI 的速率可以跑到几十 MHz,刷屏不卡顿。我做过一个 2.8 寸屏,用 SPI 接口,320x240 分辨率,刷新率能到 30fps。
  • SD 卡:存储日志、广告图片、固件升级包。SD 卡支持 SPI 模式,虽然不如 SDIO 快,但胜在接口简单。
  • 高速 ADC:比如检测电流、电压的模拟量,需要高速采样时,SPI 是首选。

SPI 的缺点呢?线多。每加一个从机,就得加一根 CS 片选线。主控引脚不够的话,得用译码器。

我的经验: 如果主控的 SPI 引脚不够用,可以用 GPIO 模拟 SPI。只要时钟频率不高(比如 1MHz 以下),软件模拟完全没问题。我曾在 STM32F103 上用 GPIO 模拟了 3 路 SPI,分别控制屏、SD 卡和 ADC,稳得很。

4.4 GPIO:最基础,也最灵活

GPIO,通用输入输出。它不是什么协议,但却是所有协议的基础。UART、I2C、SPI 的底层,本质上都是在操作 GPIO。

在售货机里,GPIO 直接控制「物理动作」。

  • 电机控制:货道里的弹簧电机,用 GPIO 控制继电器或者 MOS 管。高电平转一下,低电平停。就这么简单。
  • 按键检测:选货按键,每个按键接一个 GPIO,检测电平变化。注意要加去抖处理,不然按一下会触发好几次。
  • LED 指示灯:电源指示、故障报警,GPIO 直接驱动 LED,串个限流电阻就行。
  • 门锁检测:售货机门是否关好,用 GPIO 读一个微动开关的状态。
警告: GPIO 驱动能力有限,一般只能输出几 mA 到 20mA。直接驱动电机或者继电器,会烧坏主控。一定要加驱动芯片(如 ULN2003)或者光耦隔离。我曾经见过一个实习生,直接把电机接到 GPIO 上,结果主控冒烟了……嗯,学费交得有点贵。

GPIO 还有一个妙用:模拟其他协议。比如主控没有 I2C 外设,可以用两个 GPIO 模拟 I2C 时序。虽然效率低点,但应急完全够用。

4.5 四种接口的对比与选型建议

说了这么多,咱们来张表,一目了然。

接口 线数 速度 通信方式 售货机典型应用
UART 2(TX/RX) 慢(通常 9600~115200 bps) 点对点,异步 硬币器、打印机、蓝牙模块
I2C 2(SCL/SDA) 中(100kHz~400kHz) 多从机,半双工 温度传感器、EEPROM、RTC
SPI 4(SCK/MOSI/MISO/CS) 快(几 MHz~几十 MHz) 多从机,全双工 TFT 屏、SD 卡、高速 ADC
GPIO 1 根起 取决于软件 自定义 电机、按键、LED、门锁

选型建议:

  • 跟「钱」有关的设备(硬币器、打印机),用 UART。稳定,协议成熟。
  • 跟「环境」有关的设备(温度、时间、存储),用 I2C。省线,能挂多个。
  • 跟「显示」有关的设备(彩屏、SD 卡),用 SPI。速度快,不卡顿。
  • 跟「动作」有关的设备(电机、按键、灯),用 GPIO。直接,简单。
核心原则: 选接口,不是选「最快的」,而是选「最合适的」。一个硬币器用 SPI 纯属浪费,一个彩屏用 UART 纯属找虐。把合适的接口用在合适的地方,这才是工程师该干的事。

好了,这一章咱们把四种接口在售货机里的应用场景捋了一遍。下一章,我会聊聊主控芯片的选型——到底选 STM32、ESP32 还是国产芯片?到时候见。