Files

mcu-rp2040 — RP2040 注入器固件

本目录存放 I2C-Inject 的总线端:跑在 BPI-Pico-RP2040RP2040 + MicroPython)上的 注入器应用脚本,以及配套的 MicroPython 运行时 UF2。

PC 端 GUI 见上级目录 ../README.md。两者通过 USB 虚拟串口通信。

1. 文件说明

文件 用途
rp2040_inject.py 注入器应用(MicroPython 脚本)。上传为板上 main.py,上电自启动
RPI_PICO-20260824-v1.29.0.uf2 MicroPython 运行时(标准 RP2040 构建,v1.29.02026-08-24)。首次使用或升级时刷

⚠️ UF2 必须是 RPI_PICO 标准构建(RP2040 芯片);PICO_W(带 WiFi 芯片)与 RPI_PICO2RP2350 芯片)变体不可用。

2. 硬件与接线

BPI-Pico-RP2040 接 LT8619C 总线 说明
GP8(物理脚 11 SDA 平时高阻输入只听,注入时才驱动
GP9(物理脚 12 SCL 同上
GND GND 必须共地
  • 不接 VCC/3V3(各喂各的电)、不外加任何上拉电阻(总线用 demo 板自带上拉)
  • 动手前确认总线上拉电平为 3.3V(RP2040 不耐 5V

3. 刷写步骤

① 刷 MicroPython 运行时(首次/升级):
   按住板上 BOOTSEL 键插入 USB → 出现 RPI-RP2 U 盘
   → 把 RPI_PICO-20260824-v1.29.0.uf2 拖入 → 自动重启
   ⚠ 刷 UF2 可能重建板载文件系统, 之后需重传 ② 的 main.py

② 上传注入器应用(每次刷 UF2 后, 或应用更新后):
   py -m pip install mpremote
   py -m mpremote connect COMx cp rp2040_inject.py :main.py
   py -m mpremote connect COMx reset        # 复位, main.py 自启动

③ 验证: 串口终端(任意波特率)应看到
   LT8619C 注入器就绪 GP8=SDA GP9=SCL 100kHz addr 0x32

LED 状态:上电快闪 3 次 = 自检;常亮 = 总线监听中

4. 串口命令(USB CDC,十六进制参数,一行一令)

命令 功能 回显示例
w <bank> <reg> <val> 择机写 + 读回校验 = w 60 6E 80 : OK 读回=80
r <bank> <reg> 择机读 = r 60 6E : OK 00
s 总线边沿计数(接好线后在涨 = 监听正常) = 边沿计数 2958
c [ms] 嗅探捕获(默认 700ms),输出边沿时间戳供离线解码 I2C = capture 1207 edges / 700 ms + C
? 帮助
  • 回显行首:= 正常结果 / ! 告警(校验不符、总线错误、静置超时)
  • 读回不符(被 demo 板 MCU 插队)会自动整组重试,最多 3 次

5. 工作机制(择机注入)

监听 SDA/SCL 边沿(双沿中断) → 等下一轮总线活动出现
→ 活动结束后总线静置满 50ms → 立即发射:
   START→[bank 写]→START→[reg/数据 写]→RESTART→[读回]→STOP
→ 成功/失败(重试) → 立即释放总线回监听
  • demo 板 MCU 以 ~500ms 周期轮询,注入序列 <2ms,落在周期间空窗内冲突概率趋近零
  • 嗅探捕获采用 viper 裸指针读 GPIO~0.27µs/次 ≈ 3MHz 采样),字节码路径仅 ~12µs/次(会混叠)作兜底

6. 已知实测行为(demo 板)

  • 0x606Ebit5(0x20) 镜像 D[7:0](蓝值组)立即生效;板子非稳态时 0.3~0.5s 内会被其固件刷回 0x00 → 先投图等稳态再写,写完立即读回确认
  • 0x606D000/001/010=BGR、011=BRG、100=GBR、101=GRB、110=RBG、111=RGB(字母串= D[23:16]/D[15:8]/D[7:0] 分量顺序),切换实时生效,不影响 HDMI 锁定
  • 过程数据与完整规程见上游主仓库 doc/architecture/rgb_bit_swap_test.md