PCF8574 IO 扩展器
PCF8574 通过共享 I2C 总线提供 8 路逻辑数字输入/输出。先确认当前固件编译了 IO 扩展器能力,并在功能配置启用「通用 IO 扩展器」(ioExpander);编译能力、功能启用和驱动初始化是三个独立状态。
功能启用顺序
功能开关出厂默认关闭,重启后应用:保存只改变用户意图,bootEnabled 表示本次启动的取值;看到 pendingRestart 时先保存并重启,再检查实际 active 状态。运行中重新加载配置、保存失败回滚或恢复默认均不会提前应用开关。配置可在功能停用时保留和编辑;实际使用同时受「固件已编译、用户已启用、运行内存预算允许」约束,内存预算拒绝时应查看功能状态,不能把保存成功当作硬件已运行。
外设启用顺序:先启用并保存共享 I2C 总线,再启用扩展器父设备,最后启用逻辑输入/输出子通道。被已启用外设引用的总线必须是启用的 I2C 主机(address=0)。
扩展器父设备
| 配置项 | 说明 |
|---|---|
| 类型 | type=55,driver="PCF8574" |
| 地址 | 0x20~0x27(JSON 使用十进制 32~39) |
sampleInterval | 20~1000 ms |
| 数量 | 最多 4 个扩展器父设备 |
当前仅实现 PCF8574;PCF8574A 的 0x38~0x3F 地址不在该驱动支持范围内。
逻辑输入输出通道
| 配置层 | 字段和范围 |
|---|---|
| 逻辑输入 | type=11,ioSource=1,引用 providerId,channel=0~7,pins=[] |
| 逻辑输出 | type=12,引用规则相同,initialState=0/1 定义软件启动状态 |
| 输入参数 | inputMode=0,可配置 debounceMs、invertLogic、reportMode |
| 动作能力 | 高、低、翻转和间隔不小于 200 ms 的低速闪烁;输入支持去抖及按键事件 |
同一父设备的每个通道只能有一个逻辑拥有者,停用条目仍保留通道占用。
PCF8574 为准双向端口:输入通过向对应位写 1 释放端口,没有 MCU 式可选上拉/下拉、ADC、PWM 或呼吸灯能力。当前实现不接芯片的 INT 引脚,只使用有界轮询;这些不支持的模式和动作会被拒绝。
芯片上电时端口为高。initialState 是固件初始化后的目标电平,无法消除固件启动前的电平窗口;需要无误动作的负载必须通过外部使能、驱动电路和硬件默认状态保证。单个通道停用或删除时恢复该通道配置的启动值,正常情况下不重置其他输出。
端口不能直接连接继电器线圈、电机、24 V 工业输入或市电负载;按实际电气需求增加输入整形/隔离或输出驱动。芯片的驱动能力、整板端子额定值及隔离能力不能互相替代。
共享总线规则
- PCF8574 要求 100 kHz;与其他传感器或显示设备共存时统一使用该频率。不同物理总线或频率不能靠新增逻辑总线条目混用。
- 不要让另一个驱动擅自重新初始化同一
Wire。 - 共享地址尤其需注意 LCD1602 转接板:它可能与 PCF8574 使用相同地址,其自动地址扫描模式还可能占用候选地址范围。扫描发现地址仅证明收到应答,不能证明芯片型号、接线或驱动完整可用。
- 共享总线租约上限为 16,既有显示器等也会占用;该上限不是任意组合都能满足实时性和内存预算的保证。
总线引用使用 busPeripheralId,此时从设备的 pins 必须为空;独立接线模式则清空引用并给出两个不同的 SDA/SCL 引脚,不能同时填写两种形式。
状态、错误与恢复
读取失败不是数值 0。Web/API 和规则必须区分「有效读数」「尚未采样」「过期/不可用」,同时查看采样时间、valid、stale 与错误原因;停用或失效的数据不得继续作为新鲜值参与展示或联动。
| 错误或状态 | 处理方式 |
|---|---|
IO_EXPANDER_NOT_COMPILED / IO_EXPANDER_DISABLED / IO_EXPANDER_BUDGET_DENIED | 检查固件、功能开关及预算;IO 功能变更后确认重启应用 |
I2C_REFERENCE_INVALID / I2C_BUS_CONFLICT / I2C_ADDRESS_CONFLICT | 修正总线引用、启用顺序、接线/频率或地址冲突,再预检 |
IO_CHANNEL_CONFLICT / IO_CHANNEL_INVALID | 去除重复通道拥有者,使用通道 0~7 及普通数字输入/输出 |
IO_CONFIG_PENDING / IO_SAMPLE_UNAVAILABLE / IO_PROVIDER_UNAVAILABLE | 配置同步中或父设备未提供新鲜样本;等待状态恢复,持续出现时排查供电和总线 |
IO_WRITE_FAILED | 本次输出操作失败;检查父设备和各输出状态,不假定负载已切换 |
PCF8574 输入按整字节轮询。第一次真实读取失败就使当前样本失效;连续 3 次读取失败或一次结果不确定的写失败才进入输出恢复流程。恢复时重新应用各通道启动值并重建输入基线,避免断线/恢复产生伪按键。真实故障的重试间隔逐步增大至 2 s;总线暂忙与硬件故障分别处理。调度延迟造成样本过期时不会仅凭过期就重放输出启动值。
停用、删除或更新逻辑通道时,如果总线暂忙而无法确认旧通道已经按约定退出,父设备进入 IO_CONFIG_PENDING。退役完成前,同一父设备上的其他通道仍可运行,但原通道不能绑定给新外设;维护任务完成同步后才能重试该配置。这可避免新外设继承旧输出影子和错误电平。
现场验收
最少选一个无 PSRAM 目标和另一个不同芯片家族目标,先单模块验证,再同总线共存,最后加入现有网络、规则、Web 和显示负载。以下项目未完成前保持「待验证」,不能用编译通过或主机测试代替实物结论。
| 检查项 | 操作和通过条件 |
|---|---|
| 接线和预检 | 记录模块/芯片、总线地址、SDA/SCL、上拉电平、电源与负载;预检无未处理冲突 |
| 配置恢复 | 保存、重启、重新打开表单;引用、通道、启用状态与有效功能一致 |
| IO 启动和隔离 | 用可观察测试负载检查启动电平;逐通道高/低/翻转,其他通道不变化 |
| IO 输入事件 | 按下/释放、单击、抖动、长按及启动时按住;无重复事件或伪触发 |
| IO 退出与恢复 | 停用/删除输出恢复其配置启动值;断线/写失败显示未知;重连恢复启动值且无伪按键 |
| 规则链路 | 输入翻转输出;配置变更立即使旧样本失效;按需验证已有平台物模型上报 |
| 共享总线 | 传感器、IO、现有显示、扫描并发;没有重新初始化冲突、输出误改或长期饥饿 |
| 功能和预算 | 开关、重启应用、内存预算拒绝、恢复;保留用户配置且状态能解释不可用原因 |
| 10 轮真实重启 | 保存、重启、恢复配置循环,比较同一稳定点的堆、实例和引用;无持续资源下降 |
| 24 h 混合运行 | 使用相同负载记录堆、最大连续块、执行/采样延迟、错误数和重连;无崩溃或持续资源增长 |
| 回退 | 停用相关规则和外设,恢复配套旧配置/固件,确认原有功能与实际负载状态 |

