Ivan's Blog
主题

I2C

I2C 表示总线本身就是项目的主要维护边界之一,仓库需要持续处理地址、寄存器读写模式、mux/switch/expander、shared bus ownership 或 async/sync 访问策略。这里的重点是 I2C 作为协议/总线契约,而不是“芯片刚好挂在 I2C 上”。

  • 硬件

目录

Definition

I2C 表示总线本身就是项目的主要维护边界之一,仓库需要持续处理地址、寄存器读写模式、mux/switch/expander、shared bus ownership 或 async/sync 访问策略。这里的重点是 I2C 作为协议/总线契约,而不是“芯片刚好挂在 I2C 上”。

它通常会和 Embedded Rust、embedded-hal driver、Async embedded 一起出现,但不替代这些 Topic:I2C 解释的是 bus-level 约束,其他 Topic 解释驱动类型、运行时模型或器件语义(projects/pca9546a-rs.md、projects/xca9545a-async-rs.md、projects/bq25730-rs.md)。

When to use

当 README、crate 描述、project snapshot 或代码结构明确表明仓库主要维护 I2C 总线上的 driver、mux/switch/expander、bus sharing 或寄存器事务语义时使用。若 I2C 只是被某个更高层协议透明封装、维护者平时无需直接面对它,则不一定要命中。

如果一个改动会影响地址处理、读写事务、寄存器布局、bus arbitration、mux channel selection、sync/async I2C 访问、或 I2C mock/test 方式,就应该命中 I2C。若改动主要影响 charger/PD/touch 等器件语义,则应同时借助相邻 Topic 收边界。

Habits / defaults

  • Many crates are “driver skeletons” that prioritize correctness and composability over performance tricks (projects/tps55288-rs.md)
  • I2C bus infrastructure drivers (mux/switch/expander) are kept especially small (projects/pca9546a-rs.md, projects/tca6424-rs.md)
  • Async support is often introduced without changing the core protocol logic (projects/xca9545a-async-rs.md)
  • 倾向保持 driver skeleton 正确且可组合,而不是在总线层过早做复杂抽象。I2C 代码最重要的是事务语义清晰、可验证,而不是微优化。
  • bus infrastructure 驱动要尤其小而明确。mux/switch/expander 这类仓库的价值在于把 channel/address 选择做对,而不是承载上层业务。
  • async support 适合通过 trait/feature 叠加,而不改变核心协议语义。I2C 总线规则不应因执行模型变化而分叉。
  • 回答此 Topic 时,应明确总线层负责到哪、器件语义由谁负责。这样才能防止 I2C 和 Battery management、USB PD、Touch controller 互相抢定义。
  • 对共享总线场景,Topic 里应保留 bus ownership、仲裁和 mock/test 策略;这些往往比单个寄存器定义更决定后续维护难度。

Reference implementations

  • projects/pca9546a-rs.md:最适合说明 I2C 总线基础设施驱动应当保持多薄、多专注。
  • projects/xca9545a-async-rs.md:适合说明 mux/switch 类 driver 如何在不破坏核心协议语义的前提下增加 async support。
  • projects/ft6336u-async.md:适合说明 I2C 只是总线层,真正的触摸事件语义要留给相邻 Topic。
  • projects/bq25730-rs.md 和 projects/bq769x0-async-rs.md:适合说明同一 I2C 总线层可以承载完全不同的器件语义,因此 Topic 里必须把 bus-level 与 device-level 分开。

Failure modes

  • 只因为芯片挂在 I2C 上就打 I2C,会把 bus-level 主题和器件语义主题混为一谈。
  • 把 I2C 当成整个仓库的总括标签,忽略 Embedded Rust、embedded-hal driver、Async embedded 等相邻 Topic,会让后续 Agent 无法判断真正该看的是总线事务、驱动 API 还是执行模型。
  • 不写 bus ownership、mux/channel 语义和 mock 策略,会让最常见的维护风险完全丢失。
  • 让 async support 改写核心协议逻辑,也会让总线层出现不必要的双真相。

Evidence index

  • projects/bq25730-rs.md
  • projects/bq769x0-async-rs.md
  • projects/ft6336u-async.md
  • projects/ina3221-async-rs.md
  • projects/pca9546a-rs.md
  • projects/sc8815-rs.md
  • projects/sw2303-rs.md
  • projects/tca6424-rs.md
  • projects/tps55288-rs.md
  • projects/xca9545a-async-rs.md
  • skills/style-playbook/references/data/topics/i2c.json