
UK534-USB4I2C:单芯片Tiny-I2C-USB转换器
简介
UK534-USB4I2C:芯片级的Tiny-I2C-USB(I2C-MP-USB或I2C-Pico-USB)转换器,软件和硬件全面兼容Tiny-I2C-USB。
简介:UK534-USB4I2C:芯片级的Tiny-I2C-USB(I2C-MP-USB或I2C-Pico-USB)转换器,软件和硬件全面兼容Tiny-I2C-USB。开源协议
:CC BY-NC-SA 3.0
(未经作者授权,禁止转载)描述
UK534-USB4I2C使用说明
版本号:V1.03C
发布日期:2025年6月8日
UK534-USB4I2C实质是芯片级的Tiny-I2C-USB(I2C-MP-USB或I2C-Pico-USB)转换器,软件和硬件全面兼容Tiny-I2C-USB,理论上可以兼容Tiny-I2C-USB、I2C-MP-USB、I2C-Pico-USB的全部软件资源。
硬件连接
UK534-USB4I2C可以单芯片实现Tiny-I2C-USB协议转换,原生真正的USB2.0接口,外围电路非常简洁,QFN28封装,只需必要的去耦电容和i2c上拉电阻,无需外围晶振及繁琐的USB接口配置电阻(原版Tiny-I2C-USB必需),硬件开源在https://oshwhub.com/openiic/uk534-usb4i2c-piic。

连接示意
UK534-USB4I2C连接示意图如下:

实物连接PIIC-EXT(集成AT24C08,增强i2c通信距离可达80cm,SCL时钟可稳定在400KHz通信)图如下:

VID选择
源于一些众所周知的原因,UK534-USB4I2C提供两个不同的USB VID编号,用户通过VID引脚来自由配置。
- VID连接GND时:VID/PID= (0x1c40, 0x0534),默认设置;
- VID连接VCC时:VID/PID= (0x0403, 0xC631),用户需自行配置;
实际连接PC后可以产看到以下信息:

常见问题及排查
|
问题现象 |
可能原因 |
解决方案 |
|
设备未被识别 |
USB接触不良或驱动未安装 |
1. 更换USB端口; 2. 检查设备管理器(Windows); 3. 重新安装驱动 |
|
I2C设备无响应 |
接线错误或电源不匹配 |
1. 检查SDA/SCL是否接反; 2. 确认电源电压(3.3V); 3. 检查设备地址是否正确 |
|
通信不稳定 |
缺少上拉电阻 |
在SDA和SCL线上添加4.7kΩ上拉电阻 |
|
数据错误 |
信号干扰或线缆过长 |
1. 缩短连接线缆(<30cm); 2. 使用双绞线或屏蔽线; 3. 降低I2C时钟频率 |
|
设备发热 |
电源短路 |
立即断开电源,检查VCC-GND是否短路 |
Linux i2c-tools
Linux(含各种发行版本)下可以直接使用i2c-tools工具操作i2c设备。
i2c-tools安装与检测
# 安装工具
sudo apt install i2c-tools
# 检测可用I2C适配器
i2cdetect -l
# 扫描总线7上的设备
i2cdetect -y 7
i2c-tools命令详解
常见的i2c-tools命令有:
- tools
- i2cdetect : 扫描i2c总线上的设备
- i2cget : 读取i2c设备上的某个寄存器值
- i2cset : 将值写入i2c设备上的某个寄存器
- i2cdump : 读取某个i2c设备所有寄存器的值
- i2ctransfer : 一次性从i2c设备读取多个寄存器的值
i2cdetect : 扫描i2c总线上的设备
- i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]
- -y : 关闭交互模式
- -a : 强制扫描非常规地址(不推荐)
- -q : 使用 SMBus 的 "quick write" 命令进行探测(不推荐)
- -r : 使用 SMBus 的 "receive byte" 命令进行探测(不推荐)
- I2CBUS : i2c-x中的x总线编号
- FIRST LAST : 操作地址范围FIRST~LAST
- -F : 显示适配器实现的功能列表并退出
- -V : 显示版本信息并退出
- -l : 输出已安装 I2C 总线的列表
- eg : sudo i2cdetect -y -r 7 0x33 0x5F
- eg : sudo i2cdetect -y 7

i2cget : 读取i2c设备上的某个寄存器值
- i2cget [-f] [-y] [-a] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
- -f : 强制读取数据,即使设备忙
- -y : 不提示确认,直接读取数据
- -a : 以字节形式输出数据
- I2CBUS : 指定I2C总线的编号
- CHIP-ADDRESS : 指定I2C设备的地址。
- DATA-ADDRESS : 可选参数,指定要读取的寄存器地址
- MODE : 可选参数,指定读取数据的模式
- eg : sudo i2cget -y -a 7 0x53 0x00 c

i2cset : 将值写入i2c设备上的某个寄存器
- i2cset [-f] [-y] [-m MASK] [-r] [-a] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]
- -f : 强制执行操作,即使总线被锁定也可以使用
- -y : 不要询问确认,直接执行操作。
- -m MASK : 使用位掩码设置数据
- -r : 从设备读回数据
- -a : 自动增加数据地址
- I2CBUS : I2C总线号,例如/dev/i2c-1
- CHIP-ADDRESS : I2C设备的地址
- DATA-ADDRESS : 要写入或读取的数据地址
- VALUE : 要写入的数据值
- MODE : 可选参数,用于指定数据的格式,例如"b"表示字节,"w"表示字
- eg : sudo i2cset -r -a 7 0x53 0x30 0x24

i2cdump : 读取某个i2c设备所有寄存器的值
- i2cdump [-f] [-y] [-r first-last] [-a] I2CBUS ADDRESS [MODE [BANK [BANKREG]]]
- -f : 强制访问设备
- -y : 关闭人机交互模式
- -r first-last : 指定寄存器范围,只能扫描从first到last地址区域
- -a : 强制扫描非常规地址
- I2CBUS : i2c-x中的x总线编号
- ADDRESS : 设备地址(指定设备)
- MODE : 指定读取的大小,b字节,w字,s是SMBus块,i是i2c块,c连续字节
- BANK : i2c设备的BANK号
- BANKREG : BANK中的寄存器号
- eg : sudo i2cdump -f -y 7 0x53 c

i2ctransfer : 一次性从i2c设备读取多个寄存器的值
- i2ctransfer [-f] [-y] [-v] [-V] [-a] I2CBUS DESC [DATA] [DESC [DATA]]...
- -f : 强制执行操作,即使设备忙碌
- -y : 不要询问用户确认,直接执行操作
- -v : 显示详细的输出信息
- -V : 显示版本信息
- -a : 自动发送读取命令,而不需要显式指定
- I2CBUS : i2c-x中的x总线编号
- DESC : 以此形式描述传输:{r|w}LENGTH[@address],读或写一定长度的字节到某设备0地址
- DATA : DESC描述的字节数据,空格分开
- eg : sudo i2ctransfer -y -a 7 r3@0x53
i2c-stub-from-dum : 使用文件模拟i2c设备进行虚拟测试
- i2c-stub-from-dump [-V] [-f] [-t] [-d ] [-c ]
- -V:显示命令的版本信息。
- -f:强制创建i2c stub设备,即使设备已经存在。
- -t:在创建设备后运行i2c-stub-test测试程序。
- -d \:指定每个字节之间的延迟时间(以毫秒为单位)。
- -c \:指定要从转储文件中读取的字节数。
- \:指定i2c设备文件的路径。
- \:指定i2c数据转储文件的路径。
i2c-tools操作AT24C02示例
# 1. 写入单个字节到地址0x10
sudo i2cset -y 7 0x50 0x10 0xA5
# 2. 从地址0x10读取字节
sudo i2cget -y 7 0x50 0x10
# 3. 写入多个字节(0x00-0x0F)
sudo i2cset -y 7 0x50 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F i
# 4. 转储EEPROM内容(前32字节)
sudo i2cdump -y -r 0x00-0x1F 7 0x50 b
# 5. 高级传输(写地址后读数据)
sudo i2ctransfer -y 7 w1@0x50 0x10 r2
Win/Mac/Lin跨平台调用usb4i2c.py
非常遗憾,Win/Mac没办法直接使用i2c-tools,因为Win/Mac在底层禁止了直接通过I2C总线访问外设,所以"I2C-Tiny-USB"基本是Linux用户。
福气啦。usb4i2c.py借助Python语言技巧,UK534-USB4I2C在保持与"I2C-Tiny-USB"或"I2C-MP-USB"或"I2C-Pico-USB"兼容的同时,通过libusb跨平台驱动、pyusb Python库和usb4i2c.py实现了Win/Mac/Lin跨平台i2c调试。
安装libusb与pyusb.py
Windows没有官方i2c-tools支持,替代方案:1、使用Python+libusb开发(见3.2/3.3节);2、使用第三方工具如NinjaI2C、Bus Pirate等。
Mac OS X从10.8(Mountain Lion) 开始不再支持i2c-tools,内核架构变化移除了I2C驱动支持。替代方案:使用Python+libusb(见5.1/5.3节)。
Windows安装libusb驱动与pyusb
- 下载Zadig驱动工具:https://zadig.akeo.ie/
- 运行Zadig,选择"Options > List All Devices"

- 从列表中选择"UK534-USB4I2C"、"I2C-Tiny-USB"或"I2C-MP-USB"

- 选择"libusb-win32"驱动,点击"Install Driver"

正确安装驱动后,可在设备管理器看到libusb-win32 devices->UK534-USB4I2C设备号。
# win安装pyusb库
pip install pyusb
常见问题排查:
- 设备未列出:重新插拔设备,检查设备管理器
- 驱动安装失败:以管理员身份运行Zadig
- DLL缺失错误:确认libusb-1.0.dll在系统PATH或Python目录
Mac安装libusb驱动与pyusb
# 安装Homebrew
/bin/bash -c "$(curl -fsSL [https://raw.githubusercontent.com/Homebrew/install/HEAD/install.s](https://raw.githubusercontent.com/Homebrew/install/HEAD/install.s)h)"
# 安装libusb
brew install libusb
# 添加USB访问权限
echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c631", MODE="0666"' | sudo tee /etc/udev/rules.d/99-i2c-tiny-usb.rules
# 安装Python绑定
pip install pyusb
常见问题:
- USB访问被拒绝:在系统偏好设置中启用USB设备访问
- 库未找到:添加libusb到库路径export DYLD_LIBRARY_PATH=/opt/homebrew/lib
- 设备未列出:重启系统或重新插拔设备
linux安装libusb与pyusb
# 安装依赖
sudo apt install libusb-1.0-0-dev
# 添加udev规则
echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c631", MODE="0666"' | sudo tee /etc/udev/rules.d/99-i2c-tiny-usb.rules
# 重新加载规则
sudo udevadm control --reload-rules
sudo udevadm trigger
# 安装Python绑定
pip install pyusb
常见问题:
- LIBUSB_ERROR_ACCESS:确认udev规则生效,或使用sudo
- 设备未找到:运行lsusb检查设备是否列出
- 驱动冲突:卸载内核驱动sudo modprobe -r i2c-tiny-usb
安装usb4i2c.py库文件
方法一:从源码安装
git clone https://github.com/usb-i2c-spi/uk534-usb4i2c.git
cd uk534-usb4i2c
pip install .
方法二:直接安装
pip install usb4i2c
使用usb4i2c.py库操作i2c设备
以下案例都采用AT24C02作为i2c device,也可以选用PIIC-EXT快速测试。
USB4I2C-TEST.py
import sys
import os
# 添加包路径到系统路径
package_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if package_path not in sys.path:
sys.path.append(package_path)
from usb4i2c import I2CTinyUSB
from time import sleep
# 初始化设备
i2c = I2CTinyUSB()
# 扫描 I2C 总线
devices = i2c.scan_devices()
print(f"Detected devices: {[hex(addr) for addr in devices]}")
# 基本读写操作
i2c.write_byte(0x50, 0x10, 0xA5) # 向设备0x50的寄存器0x10写入0xA5
sleep(0.1)
value = i2c.read_byte(0x50, 0x10) # 从设备0x50的寄存器0x10读取值
print(f"Read value: 0x{value:02X}")
# 多字节操作
i2c.write_bytes(0x50, 0x00, [0x01, 0x02, 0x03]) # 写入多个字节
sleep(0.1)
data = i2c.read_bytes(0x50, 0x00, 3) # 读取多个字节
print(f"Read data: {data}")
# 原始操作
i2c.write_raw(0x50, [0x10, 0x20]) # 原始写入
sleep(0.1)
raw_data = i2c.read_raw(0x50, 2) # 原始读取
# 断开连接
i2c.disconnect()
以下图片是Thonny运行结果。

basic_test.py
import sys
import os
# 添加包路径到系统路径
package_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if package_path not in sys.path:
sys.path.append(package_path)
from usb4i2c import I2CTinyUSB, AT24CXX
import time
# Auto-detect device
i2c = I2CTinyUSB()
# Scan I2C bus
devices = i2c.scan_devices()
print(f"Detected devices: {[hex(addr) for addr in devices]}")
# Create EEPROM instance
eeprom = AT24CXX(i2c, model='24C02', i2c_addr=0x50)
time.sleep(1)
# Basic read/write test
test_addr = 0x10
test_value = 0x5A
# Write and read back
eeprom.write_byte(test_addr, test_value)
read_value = eeprom.read_byte(test_addr)
print(f"Wrote 0x{test_value:02X} to 0x{test_addr:04X}, read back 0x{read_value:02X}")
# Dump first 32 bytes
eeprom.dump_memory(0x00, 256)
# Disconnect
i2c.disconnect()
以下图片是Thonny运行结果。

USB4I2C-TEST_EEPROM.py
import sys
import os
# 添加包路径到系统路径
package_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if package_path not in sys.path:
sys.path.append(package_path)
from usb4i2c import I2CTinyUSB, AT24CXX
import time
def test_eeprom():
try:
# Initialize I2C device
i2c = I2CTinyUSB()
# Scan I2C bus
devices = i2c.scan_devices()
print(f"Detected devices: {[hex(addr) for addr in devices]}")
# Create AT24C02 instance
eeprom = AT24CXX(i2c, model='24C02', i2c_addr=0x50)
# Test basic info
print(f"\nEEPROM Model: {eeprom.model}")
print(f"Total Size: {eeprom.total_bytes} bytes")
print(f"Page Size: {eeprom.page_size} bytes")
# Execute full test
eeprom.full_test()
except Exception as e:
print(f"Test error: {e}")
finally:
if 'i2c' in locals():
i2c.disconnect()
if __name__ == "__main__":
test_eeprom()
以下图片是Thonny运行结果(部分)。

USB4I2C-TEST-24C02-STRESS.py
import sys
import os
# 添加包路径到系统路径
package_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if package_path not in sys.path:
sys.path.append(package_path)
from usb4i2c import I2CTinyUSB, AT24CXX
import time
def test_eeprom():
try:
# 初始化I2C设备
i2c = I2CTinyUSB()
# 扫描I2C总线
devices = i2c.scan_devices()
print(f"Detected devices: {[hex(addr) for addr in devices]}")
# 创建AT24C02实例
eeprom = AT24CXX(i2c, model='24C02', i2c_addr=0x50)
# 测试基本信息
print(f"\nEEPROM Model: {eeprom.model}")
print(f"Total Size: {eeprom.total_bytes} bytes")
print(f"Page Size: {eeprom.page_size} bytes")
# 执行完整测试
eeprom.full_test()
# 高强度压力测试,需要优化eeprom写入时间
eeprom.stress_test(cycles=100)
except Exception as e:
print(f"Error during test: {e}")
finally:
if 'i2c' in locals():
i2c.disconnect()
if __name__ == "__main__":
test_eeprom()
以下图片是Thonny运行结果(部分)。

参考文献与资源
|
类别 |
资源 |
链接 |
|
官方资源 |
UK534-USB4I2C |
|
|
I2C-Tiny-USB项目主页 |
||
|
I2C-MP-USB产品页面 |
||
|
代码仓库 |
I2C-Tiny-USB GitHub |
|
|
jI2C_MP_USB库 |
||
|
I2C-Pico-USB |
||
|
驱动工具 |
Zadig(Windows驱动) |
|
|
libusb |
||
|
开发库 |
usb4java |
|
|
pyusb(Python) |
||
|
参考项目 |
Smart Battery示例 |
https://github.com/harbaum/I2C-Tiny-USB/blob/master/testapp/smart_battery.py |
|
传感器集成示例 |
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。


评论