文档

UTools-SI104 文档

在线查阅产品文档、快速入门与协议资料。

产品介绍

USB TO I2C / SPI BRIDGE
UTools-SI104 产品介绍 V1.0
让上位机稳定接入多路 I2C 与 SPI 设备
UTools-SI104 是面向研发调试、产线测试和系统集成的 USB 多总线桥接设备。 它通过 USB Bulk 私有协议提供 4 路独立 I2C、1 路 SPI 和独立 OTA 通道, 让上位机可以用统一工具完成外设访问、寄存器仿真、自动化测试和固件维护。
4 路 I2C 1 路 SPI USB Bulk 私有协议 WinUSB 自动绑定 I2C 从机缓存 独立 OTA 文档版本 V1.0

解决什么问题

在板级调试、模块测试和产线夹具里,上位机经常需要同时访问多个 I2C 器件、模拟一个 I2C 从机寄存器区,或者对 SPI 器件做快速收发验证。UTools-SI104 把这些访问统一到一台 USB 设备里:

上位机
Python / C# / 测试平台
USB Bulk 访问
UTools-SI104
协议解析
任务队列与总线驱动
目标设备
I2C 传感器 / EEPROM
SPI Flash / 外设模块
上位机只需要面向一个稳定的 USB 协议编程,SI104 负责通道选择、I2C/SPI 时序、VCC 保护、事件缓存和 OTA 维护路径。

数据如何流动

主机
访问
脚本发起命令
选择 I2C/SPI 通道与参数
USB Bulk 传输
固定帧头 + 负载
固件执行
总线任务处理读写
JSON 结果
便于自动化解析
从机
仿真
配置从机地址
raw / mailbox / reg 模式
写入缓存
8KB 虚拟地址空间
外部主机访问
按寄存器模型读写
事件轮询
感知地址和数据变化

核心能力

多路 I2C 并行接入

4 路独立 I2C 通道,可分别配置主机或从机模式,适合夹具多工位和多器件访问。

寄存器缓存仿真

I2C 从机支持 8KB 缓存、16-bit 虚拟地址和事件队列,可模拟 EEPROM 或寄存器型设备。

SPI 主机收发

提供单通道 SPI 配置与全双工传输,覆盖 CPOL/CPHA、位序、数据位宽、SCLK 和 DMA 选项。

VCC 保护策略

I2C 供电输出带阈值检测,外部电压已存在时可拒绝打开输出,降低误供电风险。

维护链路独立

OTA 使用独立 USB 接口和端点,业务调试与固件升级路径分离,适合产线和现场维护。

自动化友好

Python CLI 输出 JSON,配套自测试脚本覆盖枚举、功能、性能和非破坏性 OTA 检查。

规格速览

USB 枚举

VID:PID 为 34b7:e481,产品字符串为 UTools SI104,接口字符串区分 I2C/SPI/OTA。

接口布局

默认 6 个 Vendor Bulk 接口:I2C CH0..CH3、SPI、OTA;Windows 支持 MS OS 2.0 WinUSB 描述符。

I2C 速率

支持 standard、fast、fast-plus 和 custom,常用 100kHz、400kHz、1MHz。

协议负载

私有协议单帧数据区最大 512 字节,固定帧头 12 字节,便于跨平台稳定收发。

端点分配

I2C 使用 0x01..0x04 / 0x81..0x84,SPI 使用 0x05 / 0x85,OTA 使用 0x06 / 0x86。

硬件接口

24PIN 双排牛角座分区输出 SPI0、I2C3、I2C2、I2C1、I2C0,便于治具线束固定。

类别 摘要
产品名称 UTools-SI104 USB-to-I2C/SPI Bridge
USB 标识 VID 0x34B7,PID 0xE481
USB 接口 4 路 I2C Bulk、1 路 SPI Bulk、1 路 OTA Bulk
I2C 能力 主机读写、写后读、扫描、从机 raw/mailbox/register、虚拟地址页、事件轮询
SPI 能力 配置、全双工传输、中止恢复、可选 DMA
维护能力 OTA 升级、Windows WinUSB 自动绑定、Linux I2C kernel driver 原型

适合哪些应用

板级研发调试

快速访问传感器、电源芯片、EEPROM、SPI Flash 等外设,减少临时线缆和重复脚本。

产线功能测试

一台设备覆盖多路 I2C 与 SPI 回环验证,配合 JSON 报告进入测试平台。

协议联调

用 I2C 从机寄存器缓存模拟目标模块,快速复现上位主控读写行为。

Linux 系统集成

通过私有 Bulk I2C kernel driver 映射标准 i2c_adapter,让常见 i2c-tools 能直接访问。

交付特色

固件与上位机同步维护

协议定义、Python 工具和固件命令集保持同仓管理,减少版本漂移。

可观测性完整

提供状态查询、版本读取、VCC 测量、错误码和事件队列,排查链路更直接。

测试覆盖可复用

自测试脚本内置 smoke、enum、feature、perf、ota 套件,可按项目阶段选择。

维护升级闭环

OTA 工具支持写入、激活和复位选项,适合产线烧录后维护和现场问题修复。

典型工作流程

1
连接设备
确认 USB 枚举为 34b7:e481,并识别 I2C/SPI/OTA 接口。
2
安装依赖
安装 pyusb,Windows 下确认 WinUSB 自动绑定或刷新缓存。
3
配置总线
设置 I2C 模式、SPI 时序和必要的 VCC 策略。
4
执行读写
通过 CLI 或库接口完成设备访问、缓存仿真和事件轮询。
5
验证维护
运行自测试生成报告,必要时通过 OTA 通道升级固件。

产品文档

UTools-SI104 技术手册 V1.1
USB 转 4 路 I2C / 1 路 SPI 桥接与私有 Bulk 协议
项目 内容
文档名称 UTools-SI104 技术手册 V1.1
适用产品 UTools-SI104 USB-to-I2C/SPI Bridge
适用对象 固件开发、上位机开发、测试、FAE、项目集成人员
文档类型 技术接口、协议、工具链与调试手册
文档版本 V1.1
USB 标识 VID 0x34B7,PID 0xE481

目录与阅读路径

快速接入

  1. 先阅读 产品定位USB 枚举与接口布局
  2. Windows 上位机优先阅读 WinUSB 接入;Linux 系统集成优先阅读 Linux I2C 驱动
  3. 需要脚本调试时阅读 Python CLI 使用

协议开发

  1. 先阅读 私有协议帧格式状态码命令集
  2. I2C 主机/从机功能阅读 I2C 功能模型
  3. SPI 功能阅读 SPI 功能模型;OTA 仅作为上位机维护能力说明。

测试与维护

  1. 产线夹具阅读 硬件自测试
  2. 问题定位阅读 调试与诊断
  3. 固件维护由上位机软件承载。

1. 产品定位

UTools-SI104 是一款 USB 多总线桥接设备。当前工程默认固件采用 USB Vendor Bulk 私有协议,面向以下场景:

  • 上位机直接访问 4 路独立 I2C 总线。
  • 上位机访问 1 路 SPI 总线。
  • 将任意一路 I2C 配置为从机,提供 raw、mailbox、register 三类行为。
  • 使用 8KB I2C 从机缓存和虚拟地址页映射,模拟寄存器型器件。
  • 通过独立 OTA 功能进行应用固件维护。
  • 在 Windows 侧通过 MS OS 2.0 描述符自动绑定 WinUSB。
  • 在 Linux 侧通过私有 Bulk I2C 驱动映射为标准 i2c_adapter

2. 系统架构

层级 模块 说明
上位机工具 si104_cli.py 命令行入口,输出 JSON,覆盖 I2C/SPI 常用操作
上位机协议 si104_private_proto.py USB Bulk 传输、帧打包、状态码处理
Linux 驱动 kernel_driver/si104_i2c.c / kernel_driver/si104_spi.c 私有 Bulk I2C/SPI 到 Linux 标准子系统的第一阶段驱动
USB 描述符 USB composite device 接口、端点、字符串、WinUSB 描述符
RTOS 路由 runtime dispatcher USB RX/TX 队列、I2C/SPI 任务分发
I2C 协议 I2C engine I2C 主机、从机缓存、VCC、事件队列
SPI 协议 SPI engine SPI 配置、传输、中止恢复

2.1 运行时数据路径

text
Host CLI / app
    |
    | USB Bulk frame
    v
SI104 USB RX task
    |
    +--> I2C task --> private_i2c.c --> i2c_port.c
    |
    +--> SPI task --> private_spi.c --> spi_port.c
    |
    +--> Host-managed OTA maintenance path
    |
    v
USB TX lane --> Host response

USB 中断侧只负责收包入队和重新挂载端点,协议执行放在 RTOS 任务中完成,以避免在中断上下文中执行耗时总线事务。

3. USB 枚举与接口布局

3.1 设备标识

项目
VID 0x34B7
PID 0xE481
Manufacturer LanMotion
Product UTools SI104
Serial 默认值 SI1040001
bcdDevice 0x0105

3.2 接口与端点

接口 功能 OUT EP IN EP 接口字符串
0 I2C CH0 0x01 0x81 SI104 BULK I2C0
1 I2C CH1 0x02 0x82 SI104 BULK I2C1
2 I2C CH2 0x03 0x83 SI104 BULK I2C2
3 I2C CH3 0x04 0x84 SI104 BULK I2C3
4 SPI 0x05 0x85 SI104 BULK SPI
5 OTA 功能 上位机软件管理 上位机软件管理 上位机维护能力

默认 I2C/SPI 接口为 Vendor Specific 类,使用私有子类区分 I2C/SPI,协议字段为 0x04。OTA 功能由上位机软件管理,本文档不展开其协议细节。

3.3 Windows WinUSB

固件发布 MS OS 2.0 描述符,Windows 应自动将 MI_00MI_05 绑定为 WinUSB:

Windows 接口 功能
MI_00..MI_03 I2C CH0..CH3
MI_04 SPI
MI_05 OTA 功能

如果 Windows 仍显示 Code 28,可运行:

powershell
.\tools\windows_driver\refresh_si104_winusb.ps1

然后重新插拔设备。

4. 外部连接器

设备外部连接器为 24PIN 双排牛角座(2x12),按从左到右分区:

  • SPI0
  • I2C3
  • I2C2
  • I2C1
  • I2C0
引脚列 1 2 3 4 5 6 7 8 9 10 11 12
分区 SPI0 SPI0 SPI0 SPI0 I2C3 I2C3 I2C2 I2C2 I2C1 I2C1 I2C0 I2C0
上排 D2 D0 CS GND SCL GND SCL GND SCL GND SCL GND
下排 D3 D1 CLK VCC SDA VCC SDA VCC SDA VCC SDA VCC

说明:

  • I2C 每路占 2 列:信号列 SCL/SDA 和电源列 GND/VCC
  • 表中 SPI 信号省略 SPI0_ 前缀,I2C 信号通过分区区分通道。
  • I2C VCC 输出受固件保护逻辑控制,打开前会检测外部电压。

5. 私有协议帧格式

所有多字节字段均为 little-endian。USB OUT 请求和 USB IN 响应使用相同帧头。

c
typedef struct __attribute__((packed)) {
    uint16_t magic;       // 0xA55A
    uint8_t  version;     // 0x01
    uint8_t  cmd;         // command id
    uint8_t  channel;     // i2c: 0..3, spi: 0
    uint8_t  reserved;    // 0
    uint16_t seq;         // host sequence id
    uint16_t payload_len; // payload bytes
    uint16_t status;      // response status, request=0
} private_proto_hdr_t;
字段 说明
magic 固定 0xA55A,用于快速识别协议帧
version 当前为 0x01
cmd 命令 ID
channel I2C 使用 0..3,SPI 使用 0
seq 主机序号,响应中原样返回,便于匹配
payload_len 数据负载长度
status 请求填 0,响应填状态码

协议限制:

  • PRIVATE_PROTO_MAX_DATA = 512
  • 最大帧长为 12 + 512 = 524 字节。
  • I2C_MASTER_XFER 请求负载包含 8 字节事务头,因此主机写方向单次最多携带 504 字节数据。
  • I2C_MASTER_XFER 开启 VCC 监测时响应尾部占用 6 字节,因此读方向单次最多返回 506 字节数据;关闭 VCC 监测时可返回 512 字节。
  • I2C_REG_WRITE 请求负载包含 4 字节偏移/长度头,因此单次最多写入 508 字节缓存数据。
  • SPI_XFER 请求负载包含 8 字节事务头,因此 SPI 写方向单次最多携带 504 字节数据,读方向最多返回 512 字节。

6. 状态码

名称 含义
0 OK 成功
1 BAD_MAGIC 帧头 magic 错误
2 BAD_VERSION 协议版本不匹配
3 BAD_LENGTH 长度非法
4 BAD_CMD 命令未知
5 BAD_STATE 当前状态不允许
6 BAD_PARAM 参数非法
7 IO_ERROR 底层总线或 USB I/O 错误
8 TIMEOUT 操作超时
9 UNSUPPORTED 当前固件不支持
10 BUSY 资源忙
11 NO_POWER I2C 供电/上拉检测不满足条件

7. 命令集

7.1 通用命令

命令 ID 说明
PING 0x01 连通性测试
GET_VERSION 0x02 读取协议/固件能力信息
GET_STATUS 0x03 读取通道状态

7.2 I2C 命令

命令 ID 说明
I2C_CONFIG 0x10 配置 I2C 通道角色、速率、从机模式
I2C_MASTER_XFER 0x11 主机写、读、写后读
I2C_SLAVE_READ 0x12 从机 RX 数据读取
I2C_SLAVE_WRITE 0x13 从机 TX 数据准备
I2C_ABORT 0x14 中止当前操作
I2C_RESET 0x15 通道复位
I2C_MAILBOX_PUSH 0x16 写入 mailbox TX 数据
I2C_MAILBOX_POP 0x17 读取 mailbox RX 数据
I2C_REG_WRITE 0x18 写寄存器缓存
I2C_REG_READ 0x19 读寄存器缓存
I2C_REG_REPLY 0x1A 用缓存生成从机回复
I2C_EVENT_POLL 0x1B 轮询从机缓存事件
I2C_VADDR_SET 0x1C 设置虚拟地址页映射
I2C_VADDR_GET 0x1D 读取虚拟地址页映射
I2C_VCC_SET 0x1E 控制 I2C VCC 输出
I2C_VCC_THRESHOLD 0x1F 查询/设置 VCC 保护阈值

7.3 SPI 命令

命令 ID 说明
SPI_CONFIG 0x20 配置 SPI 时序
SPI_XFER 0x21 SPI 传输
SPI_ABORT 0x22 中止并恢复

8. I2C 功能模型

8.1 通道配置

c
typedef struct __attribute__((packed)) {
    uint8_t  role;        // 0 master, 1 slave
    uint8_t  i2c_mode;    // 0 standard, 1 fast, 2 fast-plus, 3 custom
    uint8_t  addr_10bit;  // 0/1
    uint8_t  reserved;    // slave mode and register flags
    uint32_t bus_hz;
    uint16_t slave_addr;
    uint16_t timeout_ms;
} private_i2c_cfg_req_t;

reserved 字段按位编码从机行为:

说明
bits[1:0] 从机逻辑:0 raw1 mailbox2 register
bit2 寄存器地址宽度:0 为 8-bit,1 为 16-bit
bit3 数据宽度提示:0 为 8-bit,1 为 16-bit
bit4 16-bit 数据字节序:0 little1 big

速率建议:

模式 典型速率
standard 100kHz
fast 400kHz
fast_plus 1MHz
custom 10000..1000000 Hz

8.2 主机传输

c
typedef struct __attribute__((packed)) {
    uint16_t addr;
    uint16_t flags;
    uint16_t tx_len;
    uint16_t rx_len;
    uint8_t  data[];
} private_i2c_master_xfer_req_t;
条件 行为
tx_len > 0 && rx_len == 0 I2C write
tx_len == 0 && rx_len > 0 I2C read
tx_len > 0 && rx_len > 0 I2C write-then-read,常用于寄存器读取

当固件检测到 I2C 总线缺少可用上拉供电时,传输可能返回 NO_POWER。上位机应先查询或设置 VCC。

8.3 从机模式

模式 适用场景 行为
raw 简单字节流验证 直接读写从机 RX/TX 缓冲
mailbox 双向消息交换 上位机 push/pop mailbox,外部 I2C 主机读写消息
register 寄存器或 EEPROM 仿真 将外部主机写入解析为地址和数据,映射到缓存

寄存器模式支持:

  • 8-bit 或 16-bit 寄存器地址。
  • 8-bit 或 16-bit 数据宽度提示。
  • little/big endian 数据提示。
  • 事件队列记录外部主机写入、指针设置、主机侧缓存写入。

8.4 虚拟地址缓存

每个 I2C 通道拥有 8KB 缓存,划分为 32 个 256B 页:

  • page0 固定映射到逻辑地址 0x00xx
  • page1..page31 可绑定到虚拟高字节 0x01..0xFE
  • 解绑值为 0xFF
  • 未映射虚拟页读返回 0x00,写入被忽略。

逻辑地址映射:

text
addr = (hi << 8) | lo

if hi == 0x00:
    physical = lo
else if hi is mapped:
    physical = mapped_page * 256 + lo
else:
    unmapped

8.5 事件轮询

I2C_EVENT_POLL 响应:

c
typedef struct __attribute__((packed)) {
    uint8_t  type;       // 0 no event, 1 master write, 2 pointer set, 3 host reg write
    uint8_t  sample_len; // 0..32
    uint16_t addr;
    uint16_t len;
    uint16_t dropped;
    uint8_t  sample[32];
} private_i2c_event_poll_rsp_t;

上位机可通过事件轮询知道外部 I2C 主机写入了哪个逻辑地址、长度和采样数据,并观察事件队列是否发生丢包。

8.6 VCC 控制

I2C VCC 是设备级共享电源轨,对 CH0..CH3 四路 I2C 连接器同时生效,并不是 CH0 专用电源。上位机 CLI 默认通过 CH0 私有端点路由 VCC 命令,以保持工具入口稳定;命令效果仍作用于全部 I2C 通道:

  • I2C_VCC_SET:开启/关闭输出,可选择保存状态。
  • I2C_VCC_THRESHOLD:查询或设置外部电压保护阈值。

响应字段包括输出状态、持久化状态、阈值、ADC 电压、失败原因、操作结果和测量电压。常见失败原因:

名称 说明
0 none 无失败
1 over_threshold 检测到外部电压超过阈值,拒绝打开输出
2 adc_read_fail ADC 读取失败
3 nvs_fail 持久化失败
4 policy_not_ready 保护策略未就绪

9. SPI 功能模型

9.1 SPI 配置

SPI 支持主机模式和 single-I/O 从机模式。标准使用场景以主机模式为主;从机模式用于外部 SPI master 夹具验证。

参数 说明
cpol / cpha SPI Mode0..Mode3
bit_order msblsb
data_bits 常用 8/16/32
io_mode 当前常用 0=single
sclk SPI 主机时钟,标准固件上限为 40 MHz
timeout 固件侧超时
use_dma 主机 single-I/O 传输优先使用 DMA

说明:

  • 主机模式下 sclk 超过 40 MHz 会被 CLI/客户端库拒绝,或由固件返回参数错误。
  • 主机 single-I/O 传输长度超过外设 FIFO 容量时,固件会在 DMA 可用时自动优先使用 DMA。
  • 从机模式仅支持 single-I/O,实际验证需要外部 SPI master 提供 SCLK。

9.2 SPI 传输

SPI_XFER 支持:

  • tx-only。
  • rx-only。
  • full-duplex。
  • 单次传输负载受 512 字节协议上限约束。
  • 可在单次传输上覆盖 DMA 选项,也可用 no-DMA 选项强制走 FIFO 路径用于对比。

典型读取 JEDEC ID:

bash
python si104_cli.py spi-config --cpol 0 --cpha 0 --bit-order msb --data-bits 8 --sclk 1000000
python si104_cli.py spi-xfer --tx "9F" --rx-len 3

10. OTA 功能

标准固件保留独立 OTA 维护能力,用于上位机软件执行固件升级和维护。本文档不定义 OTA 操作流程、脚本接口或升级参数;对外协议脚本仅覆盖 I2C/SPI 私有协议能力。

11. Python CLI 使用

11.1 安装依赖

bash
pip install pyusb

11.2 全局参数

参数 默认值 说明
--vid 0x34B7 USB Vendor ID
--pid 0xE481 USB Product ID
--serial 多设备时指定序列号
--timeout-ms 3000 USB 传输超时

11.3 参数总表

类型约定:

类型标记 含义 示例
int 十进制整数 1000
auto_int 自动识别进制,支持 0x 0x50 / 80
str(hex bytes) 十六进制字节串,支持空格、逗号、冒号分隔 "00 01 A5"
str 普通字符串 "SI1040001"

全局参数:

参数 类型 必填 默认值 可选范围 / 格式 说明
--vid auto_int 0x34B7 0x0000..0xFFFF USB Vendor ID
--pid auto_int 0xE481 0x0000..0xFFFF USB Product ID
--serial str 任意序列号字符串 多设备时建议指定
--timeout-ms int 3000 >0 USB 传输超时,单位 ms

I2C 参数:

参数 类型 必填 默认值 可选范围 / 格式 适用命令
--ch int 0/1/2/3 i2c-vcc-* 外的 i2c-* 命令
--role str master master / slave i2c-config
--mode str/int standard standard/std/normal/0fast/1fast_plus/fast+/fp/2custom/3 i2c-config
--addr10 int 0 0/1 i2c-config
--bus-hz int 条件必填 10000..1000000,仅 custom 模式有效 i2c-config
--slave-addr auto_int 0x30 0x0000..0x03FF i2c-config
--timeout int 1000 >0 i2c-config
--slave-mode str raw raw/mailbox/reg i2c-config
--reg-addr-width int 8 8/16 i2c-config
--data-width int 8 8/16 i2c-config
--data-endian str little little/big i2c-config
--addr auto_int 0x0000..0x03FF i2c-write/read/wr
--data str(hex bytes) 视命令 无或空字符串 i2c-write<=504i2c-reg-write<=508,从机/邮箱 <=512 字节 i2c-writei2c-slave-writei2c-mailbox-pushi2c-reg-write
--tx str(hex bytes) <=504 字节 i2c-wr
--rx-len int 视命令 无或 0 默认 VCC 监测时 1..506--monitor-vcc 01..512 i2c-readi2c-wr
--flags auto_int 0 0x0000..0xFFFF i2c-write/read/wr
--monitor-vcc int 1 0/1 i2c-write/read/wri2c-scan
--start auto_int 0x03 0x00..0x7F i2c-scan
--end auto_int 0x77 0x00..0x7F i2c-scan
--show-fail int 0 0/1 i2c-scan
--len int >=0,建议 <=512 i2c-slave-readi2c-reg-readi2c-reg-reply
--max-len int 512 1..512 i2c-mailbox-pop
--offset auto_int 0x0000..0xFFFF i2c-reg-write/read/reply
--interval-ms int 200 >=1 i2c-event-watch
--count int 0 0 或正整数 i2c-event-watch
--show-empty int 0 0/1 i2c-event-watch
--slot int 1..31 i2c-vaddr-set
--vaddr auto_int 0x01..0xFF0xFF 表示解绑 i2c-vaddr-set
--enable int 0/1 i2c-vcc-set
--save int 0 0/1 i2c-vcc-seti2c-vcc-threshold
--set-mv int 100..6000 mV i2c-vcc-threshold

i2c-pingi2c-versioni2c-statusi2c-event-polli2c-vaddr-geti2c-reset 仅需 --chi2c-vcc-status/set/threshold 默认通过 CH0 路由,通常不需要指定 --ch;VCC 供电效果对 CH0..CH3 同时生效。

SPI 参数:

参数 类型 必填 默认值 可选范围 / 格式 适用命令
--cpol int 0 0/1 spi-config
--cpha int 0 0/1 spi-config
--bit-order str msb msb/lsb spi-config
--data-bits int 8 1..32,常用 8/16/32 spi-config
--io-mode int 0 当前常用 0=single spi-config
--sclk int 1000000 1..40000000 spi-config
--timeout int 1000 >0 spi-config
--use-dma int 0 0/1 spi-configspi-xfer
--tx str(hex bytes) 空字符串 0..504 字节 spi-xfer
--rx-len int 0 0..512 spi-xfer
--flags auto_int 0 0x0000..0xFFFF spi-xfer
--no-dma int 0 0/1 spi-xfer

11.4 I2C 主机示例

bash
# 连通性测试
python si104_cli.py i2c-ping --ch 0

# 配置 400kHz I2C 主机
python si104_cli.py i2c-config --ch 0 --role master --mode fast --timeout 1000

# 写寄存器
python si104_cli.py i2c-write --ch 0 --addr 0x50 --data "00 01 A5"

# 写后读
python si104_cli.py i2c-wr --ch 0 --addr 0x50 --tx "00" --rx-len 8

# 读取完整 512 字节时关闭 VCC 尾部监测
python si104_cli.py i2c-read --ch 0 --addr 0x50 --rx-len 512 --monitor-vcc 0

# 扫描地址
python si104_cli.py i2c-scan --ch 0 --start 0x03 --end 0x77

11.5 I2C 从机缓存示例

bash
# 配置 CH0 为 16-bit 地址 + 8-bit 数据的寄存器从机
python si104_cli.py i2c-config --ch 0 --role slave --slave-addr 0x30 --slave-mode reg --reg-addr-width 16 --data-width 8

# 绑定 slot1 到虚拟高字节 0x12
python si104_cli.py i2c-vaddr-set --ch 0 --slot 1 --vaddr 0x12

# 写入缓存
python si104_cli.py i2c-reg-write --ch 0 --offset 0x1200 --data "11 22 33 44"

# 读取缓存
python si104_cli.py i2c-reg-read --ch 0 --offset 0x1200 --len 16

# 轮询事件
python si104_cli.py i2c-event-poll --ch 0

11.6 VCC 示例

bash
# 查询 VCC 状态
python si104_cli.py i2c-vcc-status

# 请求打开 VCC,不保存
python si104_cli.py i2c-vcc-set --enable 1

# 设置阈值为 1000mV 并保存
python si104_cli.py i2c-vcc-threshold --set-mv 1000 --save 1

12. Linux I2C 驱动

kernel_driver/si104_i2c.c 是第一阶段 out-of-tree Linux kernel module,目标是把 4 路 SI104 私有 Bulk I2C 接口注册为标准 Linux I2C adapter。

已实现范围:

  • 绑定 34b7:e481 的 I2C 接口 0..3
  • CH0..CH3 分别使用 0x01/0x810x04/0x84
  • 支持一条消息写、一条消息读、两条消息写后读 repeated-start。
  • 支持常见 SMBus 访问通过 I2C core emulation,暂不支持 SMBus quick。
  • 可通过模块参数或 sysfs 请求固件保护下的共享 VCC 输出,VCC 对 CH0..CH3 同时生效。

加载示例:

bash
sudo insmod si104_i2c.ko enable_vcc=1 bus_hz=400000 i2c_timeout_ms=1000 usb_timeout_ms=3000
i2cdetect -l
sudo i2cdetect -y -r <bus>

运行时控制共享 VCC:

bash
find /sys/bus/usb/drivers/si104_i2c -name vcc_enable -print
echo 1 | sudo tee /sys/bus/usb/drivers/si104_i2c/<usb-interface>/vcc_enable
echo 0 | sudo tee /sys/bus/usb/drivers/si104_i2c/<usb-interface>/vcc_enable

模块参数:

参数 说明
bus_hz I2C 频率,范围 10000..1000000
i2c_timeout_ms 固件侧 I2C 超时
usb_timeout_ms 主机侧 USB Bulk 超时
enable_vcc 探测时请求打开共享 VCC,作用于 CH0..CH3

未实现范围:

  • SI104 私有从机/register/mailbox/vaddr 控制面。
  • SPI controller driver。
  • OTA 维护能力由上位机软件承载。

13. 硬件自测试

自测试脚本路径:

bash
test_scripts/si104_self_test.py

默认夹具接线:

  • I2C CH0 <-> CH1
  • I2C CH2 <-> CH3
  • SPI MOSI <-> MISO

常用命令:

bash
# 默认 smoke 测试
python test_scripts/si104_self_test.py

# 私有协议非破坏性矩阵
python test_scripts/si104_self_test.py --suite private --report-json reports/si104_self_test_private.json

# 完整矩阵
python test_scripts/si104_self_test.py --suite all --report-json reports/si104_self_test_all.json

# 性能测试
python test_scripts/si104_self_test.py --suite perf --perf-iterations 1000 --perf-payload-len 256

测试套件:

套件 内容
smoke 私有端点、I2C 双向回环、SPI MOSI-MISO 回环
enum USB 描述符、接口和端点布局
feature I2C/SPI 非破坏性功能矩阵
perf 吞吐与延迟矩阵
private enum + smoke + feature + perf
all 当前等同完整非破坏性矩阵

默认 --vcc auto 会先请求固件 VCC 保护逻辑打开 I2C 上拉供电;若检测到外部电压已超过阈值,固件会拒绝打开输出,脚本继续使用外部供电。

14. 调试与诊断

14.1 设备未找到

检查:

  • VID/PID 是否为 34b7:e481
  • Windows 是否已绑定 WinUSB。
  • 多设备场景是否需要 --serial
  • Linux 下当前用户是否具备 USB 访问权限。

14.2 I2C 返回 NO_POWER

可能原因:

  • 目标 I2C 总线没有外部上拉电源。
  • SI104 内部 VCC 未打开。
  • 外部电压超过保护阈值,固件拒绝打开 VCC 输出。

建议:

bash
python si104_cli.py i2c-vcc-status
python si104_cli.py i2c-vcc-set --enable 1

14.3 I2C 读写超时

检查:

  • 目标地址是否存在。
  • --mode--bus-hz 是否适合目标器件。
  • I2C 线序、上拉、电平是否正确。
  • 从机模式是否未复位导致通道状态残留,可执行 i2c-reset

14.4 SPI 读数异常

检查:

  • CPOL/CPHA 是否与目标器件匹配。
  • MISO/MOSI/CLK/CS 线序是否正确。
  • sclk 是否超过 40 MHz 或超出夹具信号完整性能力。
  • 是否需要关闭或开启 DMA 做对比。

15. 技术规格

类别 规格
USB USB Vendor Bulk composite device
VID/PID 0x34B7 / 0xE481
I2C 通道 4 路,CH0..CH3
I2C 角色 master / slave
I2C 速率 standard、fast、fast-plus、custom 10000..1000000 Hz
I2C 从机模式 raw、mailbox、register
I2C 缓存 每通道 8KB,32 页,每页 256B
SPI 通道 1 路,主机模式为主,支持 single-I/O 从机验证
SPI 配置 CPOL/CPHA、bit order、data bits、SCLK 最高 40 MHz、DMA 选项
协议负载 每帧最大 512B payload
OTA 上位机软件承载的独立维护能力
Windows MS OS 2.0 WinUSB 自动绑定
Linux 私有 Bulk I2C kernel driver 原型

16. 发布资料索引

资料 用途
UTools-SI104 产品介绍 产品定位、典型连接和能力概览
UTools-SI104 技术手册 接口、协议、CLI 参数和诊断说明
si104_cli.py Python CLI
si104_private_proto.py 私有协议 Python 客户端
test_scripts/si104_self_test.py 硬件自测试
kernel_driver/si104_i2c.c / kernel_driver/si104_spi.c Linux kernel driver 原型
release.json / tools_manifest.json 云端发布索引和工具包校验清单

17. 修订历史

版本 日期 说明
V1.1 2026-05 更新 SPI DMA/40 MHz 限制、OTA 功能说明、云端发布索引和发布资料索引
V1.0 2026-05 完成产品介绍与技术手册拆分,整理 I2C / SPI 接口、主机接入、脚本工具和驱动说明

Copyright (c) 2026 LanMotion.