硬件介绍

CH347是一款高速USB总线转接芯片,通过USB总线提供异步串口、I2C同步串行接口、SPI同步串行接口和JTAG接口等。
芯片资源如下:

  1. 2个高速串口,最高波特率达9Mbps
  2. 1个2线I2C接口,作为Host/Master主机模式,最高速率1MHz
  3. 1个4线SPI接口,作为Host/Master主机模式,最高速率60MHz
  4. 1个JTAG接口,作为Host/Master主机模式,最高速率60MHz
  5. 1个SWD接口,作为Host/Master主机模式, 最高速率5MHz

具体信息可参考:

CH347-高速USB转串口、JTAG/SWD、SPI、I2C芯片介绍

i2c-tools工具

i2c-tools 是一款在 Linux 系统下用于调试和操作 I2C(Inter-Integrated Circuit)总线及设备的开源命令行工具集。它允许开发者直接与应用层交互,无需编写额外代码,即可扫描设备、读写寄存器,是嵌入式系统开发和硬件调试的利器。

i2c-tools工具包包含多个实用工具名称:

工具名称 功能描述 基本使用示例 常用参数说明
i2cdetect 扫描 I2C 总线,列出连接的设备地址 i2cdetect -y 1 -y: 非交互模式;-r: 使用 SMBus 读取模式扫描
i2cset 向指定 I2C 设备寄存器写入数据 i2cset -y 1 0x48 0x01 0x55 -y: 非交互模式;-f: 强制访问;-r: 写入后读回验证
i2cdump 转储 I2C 设备所有寄存器的内容 i2cdump -y 1 0x48 -y: 非交互模式;-f: 强制访问;-r FIRST-LAST: 指定寄存器范围

i2c-tools工具安装

Ubuntu等常规Linux系统直接使用相应apt install

sudo apt install i2c-tools

git clone源码

git clone https://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git

CH347总线驱动安装

CH347在Linux下的驱动有:总线驱动字符设备驱动两种,总线驱动支持I2C、SPI、GPIO操作,而字符设备驱动则在以上基础上增加支持JTAG、SWD操作。两种驱动互斥,不可同时使用!

i2c-tools工具使用的是总线驱动。

CH347 Linux总线驱动:

ch34x_mphsi_master_linux

CH347 Linux字符设备驱动:

ch341par_linux

软件使用

安装完驱动后,接入CH347评估板,可观察到:

root@User:~# ls /dev/i2c*
/dev/i2c-0

设备已被识别,当前CH347总线编号0。

扫描总线设备

root@User:~# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: 50 51 52 53 54 55 56 57 -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                                        

查看当前的I2C总线上所有已经挂载的设备地址。
CH347评估板默认挂载了一颗24C02 FLASH,每个地址255字节,总共2K字节容量。

拉取I2C设备数据

root@User:~# i2cdump -y -r 0x00-0xFF 0 0x50 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: ab cd 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f    ????????????????
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f    ????????????????
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f     !"#$%&'()*+,-./
30: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f    0123456789:;<=>?
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f    @ABCDEFGHIJKLMNO
50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f    PQRSTUVWXYZ[\]^_
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f    `abcdefghijklmno
70: 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f    pqrstuvwxyz{|}~?
80: 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f    ????????????????
90: 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f    ????????????????
a0: a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af    ????????????????
b0: b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf    ????????????????
c0: c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf    ????????????????
d0: d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df    ????????????????
e0: e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef    ????????????????
f0: f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff    ???????????????.

该指令的含义:
从 I2C 总线 0 上地址为 0x50 的设备中,以字节方式读取 0x00 到 0xFF 所有寄存器值的调试命令。

-y : 开启自动应答;
-r 0x00-0xFF :指定读取设备中的寄存器地址为0x00-0xFF
0 0x50 b : 使用当前总线编号0(CH347)设备读取当前地址为0x50的设备,按b(byte)模式读取。

写入I2C设备数据

写入前先读取下数据:

root@User:~# i2cdump -y -r 0x00-0x00 0 0x50 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: ab                                                 ?        

对0X50设备的0x00寄存器写入0xFF:

root@User:~# i2cset -y 0 0x50 0x00 0xff

再次回读:

root@User:~# i2cdump -y -r 0x00-0x00 0 0x50 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: ff                                                 ?        

写入成功。

Windows下i2c-tools工具的使用

CH347应用 USB转I2C功能之:开源项目i2c-tools工具的使用(2)

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐