Read product documentation, quick starts, and protocol references online.
Overview
USB TO I2C / SPI BRIDGE
UTools-SI104 Product Overview V1.0 Stable host access to multiple I2C and SPI devices
UTools-SI104 is a USB multi-bus bridge device for R&D debugging, production testing, and system integration.
It provides four independent I2C channels, one SPI channel, and an independent OTA channel through a USB Bulk private protocol.
Host software can use one toolchain for peripheral access, register emulation, automated testing, and firmware maintenance.
In board-level debugging, module testing, and production fixtures, host software often needs to access multiple I2C devices at the same time, emulate an I2C slave register area, or quickly verify SPI transfers. UTools-SI104 unifies these access paths into one USB device:
Host software only needs to target a stable USB protocol. SI104 handles channel selection, I2C/SPI timing, VCC protection, event buffering, and OTA maintenance paths.
How data flows
Host access
Script starts command
Select I2C/SPI channel and parameters
USB Bulk transfer
Fixed frame header + payload
Firmware executes
Bus task processes reads and writes
JSON result
Structured output for automated analysis
Slave emulation
Configure slave address
Raw / mailbox / register mode
Write cache
8KB virtual address space
External host access
Reads and writes through the register model
Event polling
Detects address and data changes
Core Capabilities
Parallel multi-channel I2C access
Four independent I2C channels can each be configured as master or slave, making the device suitable for multi-station fixtures and multi-device access.
Register Cache Simulation
The I2C slave path supports an 8KB cache, 16-bit virtual addresses, and an event queue, allowing it to emulate EEPROM or register-based devices.
SPI host transfer
Single-channel SPI configuration and full-duplex transfer cover CPOL/CPHA, bit order, data width, SCLK, and DMA options.
VCC protection strategy
The I2C power output has threshold detection and can refuse to enable output when external voltage is present, reducing the risk of incorrect power injection.
Independent maintenance path
OTA uses independent USB interfaces and endpoints, separating normal debugging from firmware upgrade workflows for production and field maintenance.
Automation friendly
The Python CLI outputs JSON and is paired with self-test scripts for enumeration, function checks, performance tests, and non-destructive OTA checks.
Quick specs
USB enumeration
VID:PID is 34b7:e481. The product string is UTools SI104, and interface strings distinguish I2C, SPI, and OTA paths.
Interface layout
The default firmware exposes six Vendor Bulk interfaces: I2C CH0..CH3, SPI, and OTA. Windows uses MS OS 2.0 descriptors for WinUSB binding.
I2C rate
Supports standard, fast, fast-plus, and custom rates. Common settings are 100kHz, 400kHz, and 1MHz.
Protocol payload
The private protocol supports a maximum single-frame data area of 512 bytes and uses a fixed 12-byte frame header for stable cross-platform transfer.
Endpoint assignment
I2C uses 0x01..0x04 / 0x81..0x84, SPI uses 0x05 / 0x85, and OTA uses 0x06 / 0x86.
Hardware interface
The 24-pin dual-row boxed header groups SPI0, I2C3, I2C2, I2C1, and I2C0 for stable fixture wiring.
Category
Summary
Product name
UTools-SI104 USB-to-I2C/SPI Bridge
USB identification
VID 0x34B7, PID 0xE481
USB interface
4-way I2C Bulk, 1-way SPI Bulk, 1-way OTA Bulk
I2C capabilities
Host read and write, read after write, scan, slave raw/mailbox/register, virtual address page, event polling
OTA upgrade, Windows WinUSB automatic binding, Linux I2C kernel driver prototype
Which applications are suitable?
Board-level R&D and debugging
Quickly access sensors, power chips, EEPROM, SPI Flash, and other peripherals while reducing temporary wiring and repeated scripts.
Production function test
One device covers multi-channel I2C and SPI loopback verification and feeds JSON reports into the test platform.
Protocol bring-up
Use the I2C slave register cache to emulate the target module and quickly reproduce master-side read/write behavior.
Linux system integration
Map the private Bulk I2C path to standard i2c_adapter instances through the Linux kernel driver, allowing common i2c-tools to access it directly.
Delivery Features
Synchronized firmware and host tools
Protocol definitions, Python tools, and firmware command sets are maintained in the same repository to reduce version drift.
Complete observability
Status queries, version reads, VCC measurement, error codes, and event queues make link troubleshooting more direct.
Reusable test coverage
The self-test script includes smoke, enum, feature, perf, and OTA suites that can be selected according to the project stage.
Maintenance and upgrade closed loop
The OTA tool supports write, activation, and reset options, making it suitable for production-line maintenance and field issue recovery.
Typical workflow
1
Connect device
Confirm USB enumeration as 34b7:e481 and identify the I2C/SPI/OTA interfaces.
2
Install dependencies
Install pyusb and confirm automatic WinUSB binding under Windows, refreshing cached state if needed.
3
Configure bus
Set the I2C mode, SPI timing, and required VCC policy.
4
Run access flow
Complete device access, cache emulation, and event polling through the CLI or library API.
5
Verify and maintain
Run self-tests to generate reports and upgrade firmware through the OTA channel when needed.
Manual
UTools-SI104 Technical Manual V1.1
USB to 4-channel I2C / 1-channel SPI bridge with private Bulk protocol
Project
Content
Document name
UTools-SI104 Technical Manual V1.1
Applicable products
UTools-SI104 USB-to-I2C/SPI Bridge
Applicable objects
Firmware development, PC development, testing, FAE, project integration personnel
Document type
Technical interface, protocol, tool chain and debugging manual
Document version
V1.1
USB identification
VID 0x34B7, PID 0xE481
Directory and reading path
Quick access
Read Product Positioning, USB Enumeration and Interface Layout first.
Windows host computer reads WinUSB access first; Linux system integration reads Linux I2C driver first.
Read Python CLI usage when you need to debug scripts.
Protocol Development
Read Private Protocol Frame Format, Status Code, Command Set first.
I2C master/slave function reading I2C functional model.
Please read SPI Function Model for SPI; OTA is only described as a host-managed maintenance capability.
Testing and Maintenance
Production line fixture reading Hardware self-test.
Read Debugging and Diagnosis for problem location.
Firmware maintenance is handled by the host application.
1. Product positioning
UTools-SI104 is a USB multi-bus bridge device. The current project default firmware uses the USB Vendor Bulk private protocol, which is targeted at the following scenarios:
The host computer directly accesses 4 independent I2C buses.
The host computer accesses 1 SPI bus.
Configure any I2C channel as a slave, providing three types of behaviors: raw, mailbox, and register.
Emulates a register-based device using 8KB I2C slave cache and virtual address page mapping.
Application firmware maintenance through an independent OTA function.
Automatic binding of WinUSB via MS OS 2.0 descriptor on Windows side.
Map to standard i2c_adapter on Linux side via private Bulk I2C driver.
2. System architecture
Level
Module
Description
PC tools
si104_cli.py
Command line entry, output JSON, covering common I2C/SPI operations
Host computer protocol
si104_private_proto.py
USB Bulk transmission, frame packaging, status code processing
First-stage drivers from private Bulk I2C/SPI to standard Linux subsystems
USB Descriptor
USB composite device
Interface, endpoint, string, and WinUSB descriptors
RTOS routing
runtime dispatcher
USB RX/TX queues and I2C/SPI task dispatch
I2C protocol
I2C engine
I2C master, slave cache, VCC, and event queue
SPI protocol
SPI engine
SPI configuration, transfer, and abort recovery
2.1 Runtime data path
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
The USB interrupt side is only responsible for collecting packets into the queue and remounting the endpoint. The protocol execution is completed in the RTOS task to avoid executing time-consuming bus transactions in the interrupt context.
3. USB enumeration and interface layout
3.1 Device identification
item
value
VID
0x34B7
PID
0xE481
Manufacturer
LanMotion
Product
UTools SI104
Serial default value
SI1040001
bcdDevice
0x0105
3.2 Interfaces and endpoints
Interface
Function
OUT EP
IN EP
Interface string
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 function
Host application managed
Host application managed
Host maintenance capability
The default I2C/SPI interfaces are Vendor Specific classes with private subclasses for I2C/SPI and protocol field 0x04. OTA is managed by the host application, and this document does not define its protocol details.
3.3 Windows WinUSB
Firmware releases MS OS 2.0 descriptors and Windows should automatically bind MI_00 to MI_05 as WinUSB:
Windows Interface
Features
MI_00..MI_03
I2C CH0..CH3
MI_04
SPI
MI_05
OTA function
If Windows still shows Code 28, run:
powershell
.\tools\windows_driver\refresh_si104_winusb.ps1
Then reseat the device.
4. External connector
The external connector of the device is 24PIN double row horn socket (2x12), divided from left to right:
SPI0
I2C3
I2C2
I2C1
I2C0
Pin Column
1
2
3
4
5
6
7
8
9
10
11
12
Partition
SPI0
SPI0
SPI0
SPI0
I2C3
I2C3
I2C2
I2C2
I2C1
I2C1
I2C0
I2C0
Top row
D2
D0
CS
GND
SCL
SCL
GND
Bottom row
D3
D1
CLK
VCC
SDA
VCC
SDA
VCC
Description:
Each I2C channel occupies 2 columns: signal column SCL/SDA and power column GND/VCC.
The SPI0_ prefix is omitted for the SPI signals in the table, and the I2C signals distinguish the channels through partitions.
The I2C VCC output is controlled by firmware protection logic and detects external voltage before turning on.
5. Private protocol frame format
All multibyte fields are little-endian. USB OUT requests and USB IN responses use the same frame header.
Fixed 0xA55A, used to quickly identify protocol frames
version
Currently 0x01
cmd
Command ID
channel
I2C uses 0..3, SPI uses 0
seq
Host serial number, returned unchanged in the response to facilitate matching
payload_len
Data payload length
status
Fill in 0 for request, fill in status code for response
Agreement restrictions:
PRIVATE_PROTO_MAX_DATA = 512
The maximum frame length is 12 + 512 = 524 bytes.
The I2C_MASTER_XFER request payload contains an 8-byte transaction header, so a master write can carry up to 504 bytes of data.
When VCC telemetry is enabled, the I2C_MASTER_XFER response reserves a 6-byte tail; a master read can return up to 506 bytes. With VCC telemetry disabled, a master read can return 512 bytes.
I2C_REG_WRITE request payload contains a 4-byte offset/length header, so a maximum of 508 bytes of cached data can be written at a time.
The SPI_XFER request payload contains an 8-byte transaction header, so SPI TX can carry up to 504 bytes and SPI RX can return up to 512 bytes.
6. Status code
value
name
meaning
0
OK
Success
1
BAD_MAGIC
Frame header magic error
2
BAD_VERSION
Protocol version mismatch
3
BAD_LENGTH
Illegal length
4
BAD_CMD
Unknown command
5
BAD_STATE
Current status not allowed
6
BAD_PARAM
Illegal parameter
7
IO_ERROR
Low-level bus or USB I/O error
8
TIMEOUT
Operation timeout
9
UNSUPPORTED
Current firmware does not support
10
BUSY
Resource busy
11
NO_POWER
I2C power supply/pull-up detection does not meet the conditions
I2C write-then-read, often used for register reading
When firmware detects a lack of available pull-up power on the I2C bus, the transfer may return NO_POWER. The host computer should query or set VCC first.
The host computer can know which logical address, length and sampling data are written by the external I2C host through event polling, and observe whether packet loss occurs in the event queue.
8.6 VCC control
I2C VCC is a device-level shared rail for all four I2C connectors, so enabling it affects CH0..CH3 and is not CH0-only. The host CLI routes VCC commands through the CH0 private endpoint by default to keep the tool entry stable; the effect still applies to all I2C channels:
I2C_VCC_SET: Turn on/off output, optionally save status.
I2C_VCC_THRESHOLD: Query or set the external voltage protection threshold.
Response fields include output status, persistence status, threshold, ADC voltage, failure reason, operation result, and measured voltage. Common reasons for failure:
value
name
description
0
none
No failures
1
over_threshold
It is detected that the external voltage exceeds the threshold and refuses to turn on the output
2
adc_read_fail
ADC read failed
3
nvs_fail
Persistence failed
4
policy_not_ready
Protection policy not ready
9. SPI functional model
9.1 SPI configuration
SPI supports master mode and single-I/O slave mode. The standard use case is master mode; slave mode is intended for external SPI master fixture verification.
Parameters
Description
cpol / cpha
SPI Mode0..Mode3
bit_order
msb or lsb
data_bits
Commonly used 8/16/32
io_mode
Currently commonly used 0=single
sclk
SPI master clock, limited to 40 MHz in the standard firmware
timeout
Firmware side timeout
use_dma
Prefer DMA for master single-I/O transfers
Notes:
In master mode, sclk values above 40 MHz are rejected by the CLI/client library or by firmware as a parameter error.
For master single-I/O transfers larger than the peripheral FIFO capacity, firmware automatically prefers DMA when DMA is available.
Slave mode supports single-I/O only and requires an external SPI master to provide SCLK for verification.
9.2 SPI transmission
SPI_XFER supports:
tx-only.
rx-only.
full-duplex.
Single transfer payload is subject to the protocol limit of 512 bytes.
DMA options can be overridden on a single transfer. The no-DMA option can force the FIFO path for comparison.
The standard firmware keeps an independent OTA maintenance capability for host application firmware upgrade and maintenance. This document does not define OTA operation flows, script interfaces, or upgrade parameters; public protocol scripts only cover I2C/SPI private protocol functions.
11. Python CLI usage
11.1 Install dependencies
bash
pip install pyusb
11.2 Global parameters
Parameters
Default value
Description
--vid
0x34B7
USB Vendor ID
--pid
0xE481
USB Product ID
--serial
None
Specify the serial number when using multiple devices
1..506 with default VCC telemetry, 1..512 with --monitor-vcc 0
i2c-read, i2c-wr
--flags
auto_int
No
0
0x0000..0xFFFF
i2c-write/read/wr
--monitor-vcc
int
No
1
0/1
i2c-write/read/wr, i2c-scan
--start
auto_int
No
0x03
0x00..0x7F
i2c-scan
--end
auto_int
No
0x77
0x00..0x7F
i2c-scan
--show-fail
int
No
0
0/1
i2c-scan
--len
int
Yes
None
>=0, recommended <=512
i2c-slave-read, i2c-reg-read, i2c-reg-reply
--max-len
int
No
512
1..512
i2c-mailbox-pop
--offset
auto_int
Yes
None
0x0000..0xFFFF
i2c-reg-write/read/reply
--interval-ms
int
No
200
>=1
i2c-event-watch
--count
int
No
0
0 or a positive integer
i2c-event-watch
--show-empty
int
No
0
0/1
i2c-event-watch
--slot
int
Yes
None
1..31
i2c-vaddr-set
--vaddr
auto_int
Yes
None
0x01..0xFF, 0xFF means unbundling
i2c-vaddr-set
--enable
int
Yes
None
0/1
i2c-vcc-set
--save
int
No
0
0/1
i2c-vcc-set, i2c-vcc-threshold
--set-mv
int
No
None
100..6000 mV
i2c-vcc-threshold
i2c-ping, i2c-version, i2c-status, i2c-event-poll, i2c-vaddr-get, i2c-reset only requires --ch. i2c-vcc-status/set/threshold routes through CH0 by default, usually with no need to specify --ch; VCC output affects CH0..CH3 at the same time.
# Query VCC status
python si104_cli.py i2c-vcc-status
# Request to open VCC without saving
python si104_cli.py i2c-vcc-set --enable 1
# Set the threshold to 1000mV and save
python si104_cli.py i2c-vcc-threshold --set-mv 1000 --save 1
12. Linux I2C driver
kernel_driver/si104_i2c.c is the first stage out-of-tree Linux kernel module, which aims to register the 4-way SI104 private Bulk I2C interface as a standard Linux I2C adapter.
Realized scope:
Bind I2C interface 0..3 of 34b7:e481.
CH0..CH3 use 0x01/0x81 to 0x04/0x84 respectively.
Supports writing one message, reading one message, and reading two messages after writing repeated-start.
Supports common SMBus access through I2C core emulation, but does not support SMBus quick yet.
The shared VCC output under firmware protection can be requested via module parameters or sysfs. VCC affects CH0..CH3 at the same time.
Current equivalent complete non-destructive matrix
By default, --vcc auto will first request the firmware VCC protection logic to turn on the I2C pull-up power supply; if it detects that the external voltage has exceeded the threshold, the firmware will refuse to turn on the output, and the script will continue to use the external power supply.
14. Debugging and Diagnostics
14.1 Device not found
Check:
Whether the VID/PID is 34b7:e481.
Whether Windows has bound WinUSB.
Whether --serial is required in multi-device scenarios.
Whether the current user has USB access rights under Linux.
14.2 I2C returns NO_POWER
Possible reasons:
The target I2C bus does not have an external pull-up supply.
SI104 Internal VCC is not open.
The external voltage exceeds the protection threshold and the firmware refuses to turn on the VCC output.