ESP32-2432S028 (CYD 2.8寸黄屏) · CN1接口 · PCF8575 16路IO批量检测

ESP32黄屏 PCF8575 16路IO扩展
测试资料(CN1批量筛板)

PCF8575 是一颗 16 位 I2C IO 扩展芯片,一颗芯片能当 16 路数字输入输出用。这份资料是给它做 批量筛板的测试固件:CN1 插上模块,屏幕先判 0x20 地址在不在,PASS 后按板载 BOOT 键让 16 路 IO 在 LOW / HIGH 之间整体切换,配合万用表逐路量电压,一片片快速判断模块好坏。

整理于 2026-08-20 · 已实机烧录测试,LOW/HIGH 两态万用表实测均 PASS

  • 主控ESP32-2432S028 (CYD)
  • 被测芯片PCF8575(I2C,0x20)
  • 接口CN1 (GND/IO22/IO27/3V3)
  • 测试方式BOOT键切LOW/HIGH + 万用表逐路量
  • SKUT1234
当前状态
固件编译烧录已实测
0x20 地址识别已实测 PASS
LOW 态万用表实测0.0068V PASS
HIGH 态万用表实测≈3.0V PASS
万能IIC测试仪交叉验证已实测 0x20
16路逐路详细数据仅整体验证,未逐路单独记录
1

这是什么

PCF8575 是恩智浦(NXP)出的一颗 16 位准双向 I2C IO 扩展芯片——单片机 I2C 总线上挂一颗,就能多出 16 个可读可写的数字 IO(P00~P07、P10~P17),常用在按键矩阵、LED 阵列、继电器板这类需要大量数字 IO、又不想占用单片机自身引脚的场合。

这份资料记录的不是"怎么用 PCF8575 驱动什么",而是拿到一批 PCF8575 模块后怎么快速筛出坏板: 跑在 ESP32-2432S028(CYD,2.8寸黄屏)上的一个专用固件,插上模块自动判断 0x20 地址在不在, PASS 后按一次板载 BOOT 键,16 路 IO 整体在 LOW(全拉低)和 HIGH(全释放)之间切换, 配合万用表挨个量每路的电压,一片板子几十秒就能测完。

跟站内另一篇资料共用同一块板子和同一个接口

CN1 排针(GND-IO22-IO27-3V3,IO22当SCL、IO27当SDA) 和本站 ESP32黄屏 万能IIC测试仪 用的是同一组脚。 本次测试还额外用那个万能测试仪对同一块 PCF8575 做了一次独立扫描,交叉确认了 0x20 地址(见第5节)。

2

硬件与接线

主控板关键参数

项目说明
主控ESP32-2432S028R (CYD),ESP32-D0WD-V3 双核
屏幕2.8寸 ST7789 驱动 TFT,240×320,本项目位带(bit-bang)直接操作GPIO寄存器手写驱动,不依赖 TFT_eSPI 库
按键板载 BOOT 键(GPIO0),按下接地,本项目用来手动切换 16 路 LOW/HIGH

CN1 扩展口接 PCF8575

PCF8575 模块ESP32黄屏 CN1
VCC3V3
GNDGND
SDAIO27
SCLIO22
INT本测试不接
IO21 是屏幕背光,别接 SDA

这块板子的 IO21 是背光控制脚(LCD_BLK), 跟 I2C 无关。接线时对照丝印用 IO27,不要凭编号相近误接到 21。

PCF8575 模块参考图(资料参考,非本次实拍模块)

PCF8575 IO扩展模块实拍特写,蓝色PCB,SOIC芯片可见
实拍:本次测试用的 PCF8575 模块特写(通用 I2C 16位IO扩展板,丝印无独立型号)。
芯片与引脚布局,资料参考

常见同类 PCF8575 扩展板尺寸约 32.2×21mm,芯片丝印 PCF8575TS(NXP), 左侧一列 GND/VCC/SDA/SCL/INT,上下两排分别是 P17~P10 和 P00~P07 共 16 路 IO。具体引脚顺序、丝印以到手模块实物为准,不同批次/供应商的板型可能不同。

地址选择与 I2C 上拉(资料参考)

A0/A1/A2 地址位 + 总线上拉,资料参考,非本次实测

PCF8575 支持 3 位硬件地址选择(A0/A1/A2),这 3 位由模块上对应焊盘/跳线 接 VCC 或 GND 决定,理论上同一条 I2C 总线上最多可以并联 8 颗 PCF8575(地址 0x20~0x27) 互不冲突。本次测试用的模块实拍图分辨率不够看清楚 A0/A1/A2 是否有独立可改焊盘, 多数同类通用扩展板会直接固定接地(对应本页实测的 0x20)。如果你需要改地址, 请对照到手模块背面丝印确认,不要照抄这里的说法。

I2C 总线的 SDA/SCL 需要合适的上拉电阻才能正常通信。本模块是否已经 板载上拉、阻值多少,本项目没有专门测量确认过——如果你在自己的板子上接线后总线无 响应、地址识别不到,除了检查接线,也可以排查一下 SDA/SCL 是否缺上拉(常见做法是外加 4.7kΩ~10kΩ 到 VCC)。

本项目相关引脚定义(源码 src/main.cpp 第20-40行)

main.cpp:20
// ---- 屏幕 ST7789 位带 SPI 引脚(与"万能IIC测试仪"一致)----
#define LCD_W     240
#define LCD_H     320
#define LCD_SCK   14   // 屏幕 SPI 时钟
#define LCD_MOSI  13   // 屏幕 SPI 数据(不是 I2C 的 SDA)
#define LCD_CS    15
#define LCD_DC    2
#define LCD_BLK   21   // 背光

// ---- I2C 引脚(扫描到 0x20 用的就是这两根)----
#define I2C_SDA   27
#define I2C_SCL   22

#define PCF8575_ADDR 0x20

// 板载 BOOT 按钮 = GPIO0,按下接地(低电平)
#define BOOT_BTN   0
3

16路怎么测:灌电流电路原理

资料参考 —— 下面讲的是 PCF8575 IO 的通用电气特性,帮助理解测试电路为什么这么接,不是本项目独立验证的结论。

PCF8575 是准双向(quasi-bidirectional)IO:芯片内部只有弱上拉、没有强推挽输出—— 拉高能力弱、拉低(灌电流/sink)能力强。所以驱动 LED 这类负载时常见接法不是让 IO 自己往外推电流,而是:

环节接法
电源3.3V/5V
限流电阻
负载端PCF8575 IO

即 VCC 经限流电阻接到 IO,IO 输出 LOW 时芯片把电流灌下去(负载导通/点亮), IO 输出 HIGH(释放)时电阻把节点拉回 VCC 附近。这套 16×10kΩ 上拉正是同一个电路的测试版本—— 用电阻代替 LED,用万用表代替"点不点亮",量的是同一个节点电压:

  • 固件写 0x0000(16路全 LOW):PCF8575 灌电流拉低,节点应接近 0V。
  • 固件写 0xFFFF(16路全释放/HIGH):芯片释放,10kΩ 电阻把节点拉回 VCC 附近。
  • 16 路各自带一颗 10kΩ 上拉,固件让 16 路同步切换,操作者拿万用表逐路碰测试点,任何一路电压不对就是那一路虚焊或损坏。
PCF8575测试夹具实拍:模块经排针接出多路带上拉电阻的测试线
实拍:PCF8575 模块经排针座接出测试线束,16 路各自带 10kΩ 上拉,供万用表逐路测量。
4

实测结果

实录:万用表实测 PCF8575 某路 IO 电压,屏幕同步显示 0x20 PASS 与 HIGH/LOW 状态。

实测电压

状态实测电压判断
LOW0.0068 VPASS
HIGH≈ 3.0 VPASS

判断标准

状态阈值判断
LOW< 0.2 VPASS
HIGH> 2.8 VPASS
LOW> 0.5 V异常
HIGH< 2.5 V异常
结论

LOW 0.0068 V、HIGH ≈3.0 V,均在 PASS 区间—— 这片 PCF8575 判定正常。批量测片时,LOW 看 < 0.2 V、HIGH 看 > 2.8 V 即可。本次是整体验证(16路同步切换后抽测), 没有逐路单独记录 16 个数值——如果要做更严格的产线级判定,建议改成逐路记录。

5

独立验证:万能IIC测试仪扫描

为交叉确认这片 PCF8575 的地址判断没错,同一块模块又接到本站 ESP32黄屏 万能IIC测试仪(同样走 CN1 接口) 跑了一次独立的 QUICK 地址扫描——两套完全不同的固件、两次独立测试,都确认到同一个地址 0x20。

实录:万能IIC测试仪 QUICK 模式扫描同一片 PCF8575,屏幕显示 I2C QUICK / OK / ADDR 0x20。
6

固件源码关键段

下面三段摘自实际烧录测试通过的 src/main.cpp。

① 写 16 位 IO:PCF8575 准双向输出(第236-244行)

PCF8575 一次 I2C 写操作传 2 字节,先低 8 位(P00~P07)、再高 8 位(P10~P17), 写 1 = 释放为高(弱上拉),写 0 = 主动拉低(强灌电流)。

main.cpp:236
// ---- PCF8575 写 16 位 ----
// 先低 8 位(P00~P07),再高 8 位(P10~P17),共 16 路全部控制。
// PCF8575 是准双向(quasi-bidirectional)IO:写 1 = 释放为高,写 0 = 拉低。
// 返回值是 Wire.endTransmission() 的错误码:0 = 成功。
static byte pcfWrite(uint16_t value) {
  Wire.beginTransmission(PCF8575_ADDR);
  Wire.write(value & 0xFF);          // P00~P07 低8位
  Wire.write((value >> 8) & 0xFF);   // P10~P17 高8位
  return Wire.endTransmission();
}

② 启动自检:0x20 地址探测(第299-324行)

上电先用一次空写探测 0x20 有没有 ACK,PASS 才进入测试状态,FAIL 直接停机等重新排查接线。

main.cpp:299
// 检测 0x20
Wire.beginTransmission(PCF8575_ADDR);
byte err = Wire.endTransmission();

if (err == 0) {
  Serial.println("Address: 0x20 PASS");
  drawStartup(true);
  delay(1500);              // 给用户看清 PASS
  drawTestHeader();
  // 开机默认 16 路全部 LOW 并保持,等 BOOT 键切换
  byte w = pcfWrite(0x0000);
  if (w != 0) {
    showError(w);
    Serial.print("I2C ERROR code=");
    Serial.println(w);
    return;               // running 保持 false,屏幕停在 FAIL
  }
  drawState("LOW", RED);
  Serial.println("16 IO = LOW");
  running = true;
} else {
  Serial.print("Address: 0x20 FAIL code=");
  Serial.println(err);
  drawStartup(false);
  // running 保持 false,loop() 里不动作,屏幕停在 FAIL
}

③ BOOT 键切换 16 路 LOW/HIGH(第327-354行)

按一次 BOOT 键(下降沿 + 200ms 消抖),16 路整体在 0x0000 / 0xFFFF 间切换并保持,不是自动循环——切一次、稳定住,方便万用表逐路测量。

main.cpp:327
void loop() {
  if (!running) {
    delay(100);
    return;
  }

  // BOOT 键(GPIO0)按下为低电平,抓下降沿,按一次切换一次并保持
  bool pressed = (digitalRead(BOOT_BTN) == LOW);
  uint32_t now = millis();

  if (pressed && !btnWasPressed && (now - lastBtnMs) > 200) {
    lastBtnMs = now;
    highState = !highState;

    uint16_t value = highState ? 0xFFFF : 0x0000;
    byte err = pcfWrite(value);
    if (err != 0) {
      showError(err);
      Serial.print("I2C ERROR code=");
      Serial.println(err);
      running = false;
      return;
    }
    drawState(highState ? "HIGH" : "LOW", highState ? GREEN : RED);
    Serial.println(highState ? "16 IO = HIGH" : "16 IO = LOW");
  }
  btnWasPressed = pressed;
}
7

下载与编译

⬇ 下载 main.cpp ⬇ 下载源码包(.ini + main.cpp + README)

编译参数取值
开发环境PlatformIO
开发板esp32dev
Frameworkarduino
Arduino-ESP32 核心固定 2.0.17(3.x/ESP-IDF5 核心在本机会报 undefined reference to esp_bt_controller_mem_release,是工具链BT库版本不匹配的已知问题, 固定 2.0.17 绕开)
依赖库无——屏幕位带直驱、I2C 用核心自带 Wire.h,不需要 TFT_eSPI/LVGL 等第三方库
串口

下载包已去掉本机的 upload_port/monitor_port (原为 COM20),PlatformIO 会自动探测串口;如需手动指定,按自己电脑实际识别到的 COM 口在 platformio.ini 里加一行 upload_port = COMx,不要照抄我们的。

8

常见问题

现象说明 / 排查方向
开机显示 0x20 FAIL(红)认不到 PCF8575,检查 SDA/SCL 有没有接反、VCC 是否 3.3V、GND 是否共地
测试中显示 I2C ERROR + 错误码切换 LOW/HIGH 过程中总线通信失败,多是接触不良,检查排针插接是否牢固
某一路电压量不出变化该路对应的上拉电阻没接好,或该路 IO 焊盘虚焊,判该模块这一路异常
为什么用 IO22/IO27 而不是常见的 I2C 默认脚ESP32 的 I2C 引脚是软件可配的通用 GPIO 复用,这里沿用了本站"万能IIC测试仪"CN1接口的既有定义,两篇资料共用同一组接口
16路是同时测的还是分开测的固件是 16 路同步整体切换(一次 I2C 写 2 字节全控制),本次实测也是整体验证;要逐路单独记录,需要人工逐路量并记录数值
9

参考资料

本页固件已实机烧录测试;LOW/HIGH 两态用万用表实测并配合万能IIC测试仪独立扫描交叉确认地址(用户原话)。 16路IO批量检测的电气原理(准双向IO、灌电流特性)为资料参考,不是本项目独立验证的结论。 16路本次为整体切换验证,未逐路单独记录数值;PCF8575 模块无独立型号丝印,SKU 按内部编号 T1234 标注。

← 返回显示与LED分类 返回首页 进入淘宝店铺 →