I2C/SPI/USB
文档版本:V1.0 | 适用系统:RT-Thread | 适用硬件:C-3576BQ V10 核心板 + M4-R2(ShimetaPi)底板 | 更新日期:2026-10-23
1. 概述
本文档覆盖 M4-R2(RK3576)平台上 RT-Thread 环境下 I2C、SPI 和 USB 三类外设的驱动框架、配置方法和使用示例。
RK3576 SoC 提供丰富的低速与高速外设接口,其中 I2C、SPI 和 USB 是嵌入式开发中最常用的三类总线/接口。RT-Thread 为上述外设提供了统一的设备驱动框架,开发者可通过标准 API 进行外设访问,无需直接操作寄存器。
接口数量(已核实硬件事实):
- I2C:核心板最多 6 个(S-02,已验证)
- SPI:核心板最多 5 个(S-02,已验证)
- USB:M4-R2 底板共 5 个 USB 接口(1×USB3.0 OTG + 1×USB3.0 HOST + 3×USB2.0 HOST)(S-01,已验证)
驱动框架来源:
本文档基于以下 Rockchip 官方 RT-Thread 指南编写(通用方法,适配 RK3576,标注为参考说明):
| 外设 | 指南文件名 | 版本 | 发布日期 | 适用范围说明 |
|---|---|---|---|---|
| I2C | Rockchip_Developer_Guide_RT-Thread_I2C_CN.pdf | V1.0.2 | 2020-05-27 | 原文以 RK2108/Pisces 为示例,I2C 框架适用于所有 Rockchip 平台(含 RK3576) |
| SPI | Rockchip_Developer_Guide_RT-Thread_SPI_CN.pdf | V2.2.0 | 2024-06-26 | 覆盖 SPI 控制器主/从模式、DMA 传输及 SPI2APB 桥接 |
| USB | Rockchip_Developer_Guide_RT-Thread_USB_CN.pdf | V1.3.0 | 2024-09-23 | 原文支持芯片列表未显式包含 RK3576,本文档中的 USB 内容标注为参考说明 |
重要提示:以下驱动框架内容来自原厂 PDF 指南,尚未在 C-3576BQ V10 + M4-R2 上完成板级验证。具体状态见各节验证标注。
2. 硬件准备
2.1 公共硬件
| 项目 | 说明 | 状态 |
|---|---|---|
| 核心板 | C-3576BQ V10(RK3576) | 已验证 |
| 底板 | M4-R2(ShimetaPi) | 已验证 |
| RT-Thread 固件 | 需支持 I2C/SPI/USB 驱动的 RT-Thread BSP | 待板上验证 |
| 调试串口 | 底板 DEBUG 串口(UART0_M0_DEBUG,1500000 波特率) | 已验证 |
2.2 I2C 外设硬件
| 项目 | 说明 | 状态 |
|---|---|---|
| I2C 控制器 | RK3576 核心板最多 6 路 I2C(S-02) | 已验证(规格声明) |
| I2C 从设备 | 根据实际应用连接传感器、EEPROM 等 I2C 从设备 | 待板上验证 |
| IOMUX 配置 | I2C 引脚需通过 IOMUX 配置为 I2C 功能 | 待板上验证 |
注意:底板 40PIN 接口标注
I2C8_SDA/I2C8_SCL(S-01),与规格书"最多 6 路 I2C"的表述存在命名差异,具体 I2C 控制器编号以实际发布的 RK3576 SDK 与 BSP 为准(待板上确认)。
2.3 SPI 外设硬件
| 项目 | 说明 | 状态 |
|---|---|---|
| SPI 控制器 | RK3576 核心板最多 5 路 SPI(S-02) | 已验证(规格声明) |
| SPI 从设备 | Flash、显示屏、ADC 等 SPI 从设备 | 待板上验证 |
| SPI2APB | 独立的 SPI-to-APB 桥接控制器,用于低速外设扩展 | 参考说明 |
2.4 USB 外设硬件
| 项目 | 说明 | 状态 |
|---|---|---|
| USB 接口 | M4-R2 底板共 5 个:1×USB3.0 OTG + 1×USB3.0 HOST + 3×USB2.0 HOST(S-01) | 已验证(规格声明) |
| DWC2 控制器 | DesignWare USB 2.0 IP,支持 Device 和 Host 模式 | 参考说明 |
| USB VID | 0x2207(Rockchip 厂商 ID) | 参考说明 |
3. 软件准备
3.1 开发环境
| 项目 | 要求 | 状态 |
|---|---|---|
| RT-Thread BSP | 需包含 RK3576 平台的 BSP 包,含 I2C/SPI/USB 驱动支持 | 待板上验证 |
| Env 工具 | RT-Thread Env 工具,用于 menuconfig 配置 | 参考说明 |
| 编译工具链 | ARM GCC 交叉编译工具链(32 位模式) | 参考说明 |
3.2 Menuconfig 配置开关
I2C 配置宏
在 RT-Thread menuconfig 中依次进入 RT-Thread Components -> Device Drivers -> Using I2C Device Drivers:
| 配置宏 | 说明 | 状态 |
|---|---|---|
RT_USING_I2C | 启用 I2C 驱动框架总开关 | 参考说明 |
RT_USING_I2C0 | 启用 I2C0 控制器 | 参考说明 |
RT_USING_I2C1 | 启用 I2C1 控制器 | 参考说明 |
RT_USING_I2Cx | 按需启用对应控制器 | 参考说明 |
具体可用的 I2C 控制器编号与数量以实际 RK3576 BSP 的 Kconfig 选项为准(待板上确认)。
SPI 配置
在 menuconfig 中启用 SPI 控制器和 SPI 设备驱动:
| 配置项 | 说明 | 状态 |
|---|---|---|
RT_USING_SPI | 启用 SPI 驱动框架总开关 | 参考说明 |
| SPI 控制器选择 | 按需启用对应 SPI 控制器 | 参考说明 |
| SPI DMA 传输 | 启用 DMA 传输模式以获得更高吞吐 | 参考说明 |
USB 配置
| 配置项 | 说明 | 状态 |
|---|---|---|
RT_USING_USB_DEVICE | 启用 USB Device 模式 | 参考说明 |
RT_USING_USB_HOST | 启用 USB Host 模式 | 参考说明 |
| USB 类驱动 | 按需启用 CDC-ACM、HID、MStorage 等类驱动 | 参考说明 |
3.3 IOMUX 配置
I2C 和 SPI 引脚均需通过 IOMUX(引脚复用)配置为对应功能。RK3576 的 IOMUX 配置通常在 BSP 的 board 初始化代码或设备树中完成。具体引脚映射需参考底板原理图确认实际使用的 I2C/SPI 编号及其对应引脚(以实际 RK3576 SDK 为准,待板上确认)。
4. 操作步骤
4.1 I2C 操作步骤
步骤 1:确认 I2C 控制器编号
根据底板原理图确认目标 I2C 总线的编号。RK3576 核心板最多 6 路 I2C 控制器(S-02),实际可用编号取决于 IOMUX 配置和底板引出情况。
步骤 2:配置 I2C 驱动
在 RT-Thread menuconfig 中启用 I2C 驱动框架:
RT-Thread Components
-> Device Drivers
-> Using I2C Device Drivers [*]
-> Using I2C0 [*]
-> Using I2C1 [ ]
-> Using I2Cx [ ]步骤 3:配置 IOMUX
在 BSP 源码中配置目标 I2C 引脚的 IOMUX,将其功能设置为 I2C。引脚编号和 IOMUX 值需参照 RK3576 数据手册和底板原理图(待板上确认)。
步骤 4:编译并烧录固件
使用 RT-Thread 编译工具链编译工程,生成固件后烧录至核心板。
步骤 5:验证 I2C 设备注册
启动后在 MSH 终端执行 list_device 命令,确认 I2C 总线设备已注册。
msh>list_device步骤 6:编写 I2C 读写程序
参考第 5.1 节代码示例,通过 rt_i2c_bus_device_find 查找总线,通过 rt_i2c_transfer 发送读写消息。
4.2 SPI 操作步骤
步骤 1:确认 SPI 控制器编号
根据底板原理图确认目标 SPI 总线的编号。RK3576 核心板最多 5 路 SPI 控制器(S-02)。
步骤 2:配置 SPI 驱动
在 RT-Thread menuconfig 中启用 SPI 驱动框架和对应控制器。
步骤 3:配置 SPI 模式
根据从设备要求配置 SPI 工作模式:
| 模式 | CPOL | CPHA | 说明 | 状态 |
|---|---|---|---|---|
| Mode 0 | 0 | 0 | 时钟空闲低电平,第一采样沿 | 参考说明 |
| Mode 1 | 0 | 1 | 时钟空闲低电平,第二采样沿 | 参考说明 |
| Mode 2 | 1 | 0 | 时钟空闲高电平,第一采样沿 | 参考说明 |
| Mode 3 | 1 | 1 | 时钟空闲高电平,第二采样沿 | 参考说明 |
步骤 4:配置数据宽度
SPI 控制器支持 8 位和 16 位两种数据宽度,通过 rt_spi_configure 设置。
步骤 5:选择传输模式
| 传输模式 | 说明 | 适用场景 | 状态 |
|---|---|---|---|
| 中断模式 | 默认模式,通过中断完成数据搬运 | 小数据量传输 | 参考说明 |
| DMA 模式 | 通过 DMA 控制器搬运数据 | 大数据量高速传输 | 参考说明 |
步骤 6:编译并烧录固件
步骤 7:验证 SPI 设备注册
msh>list_device4.3 USB 操作步骤
注意:RK3576 未显式出现在 USB 指南(V1.3.0)的支持芯片列表中。以下步骤基于 DWC2 控制器通用框架编写,标注为参考说明,需在目标板上完成验证。
步骤 1:确认 USB 控制器类型
RK3576 使用 DesignWare USB 2.0 (DWC2) 控制器 IP(参考说明),支持 Device 模式和 Host 模式。具体控制器编号与 USB3.0 控制器配置以实际 RK3576 SDK 为准(待板上确认)。
步骤 2:配置 USB 驱动
在 menuconfig 中根据使用场景选择:
- Device 模式:启用
RT_USING_USB_DEVICE,并按需启用类驱动(CDC-ACM、HID、MStorage 等)。 - Host 模式:启用
RT_USING_USB_HOST。
步骤 3:选择 USB 类驱动
| 类驱动 | 说明 | 典型应用 | 状态 |
|---|---|---|---|
| CDC-ACM | 虚拟串口 | USB 串口通信 | 参考说明 |
| HID | 人机接口设备 | 键盘、鼠标 | 参考说明 |
| MStorage | 大容量存储 | U 盘读写 | 参考说明 |
| RNDIS | 网络 | USB 网卡 | 参考说明 |
| WINUSB | Windows USB 驱动 | Windows 平台设备通信 | 参考说明 |
| UVC | 视频类 | USB 摄像头 | 参考说明 |
| UAC | 音频类 | USB 声卡/麦克风 | 参考说明 |
步骤 4:配置 USB VID/PID
USB 厂商 ID (VID) 为 0x2207(Rockchip)。产品 ID (PID) 需根据实际产品定义。
步骤 5:编译并烧录固件
步骤 6:验证 USB 设备枚举
Device 模式下连接主机后,在 MSH 中查看设备注册状态;Host 模式下插入 USB 设备后查看枚举日志。
5. 代码详解
5.1 I2C 驱动代码详解
5.1.1 I2C 消息结构
RT-Thread I2C 驱动使用 rt_i2c_msg 结构体描述单次传输消息:
struct rt_i2c_msg
{
rt_uint16_t addr; /* 从设备地址(7 位) */
rt_uint16_t flags; /* 传输标志:RT_I2C_RD(读)或 RT_I2C_WR(写) */
rt_uint16_t len; /* 数据长度(字节) */
rt_uint8_t *buf; /* 数据缓冲区指针 */
};flags字段:RT_I2C_RD表示读操作,RT_I2C_WR表示写操作。addr字段:7 位从设备地址,不含读写位。
5.1.2 查找 I2C 总线设备
struct rt_i2c_bus_device *i2c_bus;
/* 通过设备名称查找 I2C 总线(名称以实际 BSP 注册名为准) */
i2c_bus = (struct rt_i2c_bus_device *)rt_device_find("i2c0");
if (i2c_bus == RT_NULL)
{
rt_kprintf("I2C bus device i2c0 not found\n");
return;
}rt_i2c_bus_device_find("i2cx") 是 rt_device_find 的封装,内部通过设备名称匹配已注册的 I2C 总线设备。名称格式为 i2c0、i2c1 等,与 menuconfig 中启用的控制器编号对应。
5.1.3 I2C 读写操作
通过 rt_i2c_transfer 函数执行读写传输。该函数一次可发送多条消息(支持重复 START 条件):
/* 向 I2C 从设备写入 1 字节寄存器地址,然后读取 2 字节数据 */
struct rt_i2c_msg msgs[2];
rt_uint8_t reg_addr = 0x00;
rt_uint8_t rx_buf[2] = {0};
/* 第一条消息:写寄存器地址 */
msgs[0].addr = 0x50; /* 从设备地址 */
msgs[0].flags = RT_I2C_WR; /* 写标志 */
msgs[0].len = 1; /* 写 1 字节(寄存器地址) */
msgs[0].buf = ®_addr;
/* 第二条消息:读数据 */
msgs[1].addr = 0x50; /* 从设备地址 */
msgs[1].flags = RT_I2C_RD; /* 读标志 */
msgs[1].len = 2; /* 读 2 字节 */
msgs[1].buf = rx_buf;
/* 执行传输,返回成功传输的消息数 */
rt_int32_t ret = rt_i2c_transfer(i2c_bus, msgs, 2);
if (ret != 2)
{
rt_kprintf("I2C transfer failed, ret=%d\n", ret);
return;
}
rt_kprintf("Read data: 0x%02X 0x%02X\n", rx_buf[0], rx_buf[1]);5.1.4 I2C 写操作示例
/* 向 I2C 从设备连续写入多个字节 */
struct rt_i2c_msg msg;
rt_uint8_t tx_buf[4] = {0x10, 0x20, 0x30, 0x40};
msg.addr = 0x50;
msg.flags = RT_I2C_WR;
msg.len = sizeof(tx_buf);
msg.buf = tx_buf;
rt_int32_t ret = rt_i2c_transfer(i2c_bus, &msg, 1);
if (ret != 1)
{
rt_kprintf("I2C write failed, ret=%d\n", ret);
}5.1.5 I2C 完整初始化与读写示例
#include <rtthread.h>
#include <rtdevice.h>
#define I2C_BUS_NAME "i2c0" /* 以实际 BSP 注册名为准 */
#define I2CSlave_ADDR 0x50
static void i2c_sample(void)
{
struct rt_i2c_bus_device *i2c_bus;
struct rt_i2c_msg msgs[2];
rt_uint8_t reg = 0x00;
rt_uint8_t data[2] = {0};
/* 1. 查找 I2C 总线 */
i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(I2C_BUS_NAME);
if (i2c_bus == RT_NULL)
{
rt_kprintf("Can not find %s bus device\n", I2C_BUS_NAME);
return;
}
/* 2. 读操作:从寄存器 0x00 读取 2 字节 */
msgs[0].addr = I2CSlave_ADDR;
msgs[0].flags = RT_I2C_WR | RT_I2C_NO_STOP;
msgs[0].len = 1;
msgs[0].buf = ®
msgs[1].addr = I2CSlave_ADDR;
msgs[1].flags = RT_I2C_RD;
msgs[1].len = 2;
msgs[1].buf = data;
if (rt_i2c_transfer(i2c_bus, msgs, 2) == 2)
{
rt_kprintf("I2C read: 0x%02X 0x%02X\n", data[0], data[1]);
}
else
{
rt_kprintf("I2C read failed\n");
}
}5.2 SPI 驱动代码详解
5.2.1 SPI 配置结构
SPI 设备通过 rt_spi_configure 配置工作参数:
struct rt_spi_configuration
{
rt_uint8_t mode; /* SPI 模式:RT_SPI_MASTER(主)/ RT_SPI_SLAVE(从) */
rt_uint8_t data_width; /* 数据宽度:8 或 16 */
rt_uint16_t max_hz; /* 最大时钟频率 */
};注:SPI 控制器 FIFO 深度取决于具体控制器,影响单次传输的数据量上限(以实际 RK3576 TRM 为准)。
5.2.2 查找 SPI 总线设备
struct rt_spi_device *spi_device;
/* 通过设备名称查找 SPI 设备(名称以实际 BSP 注册名为准) */
spi_device = (struct rt_spi_device *)rt_device_find("spi00");
if (spi_device == RT_NULL)
{
rt_kprintf("SPI device spi00 not found\n");
return;
}SPI 设备名称格式为 spixy,其中 x 为总线编号,y 为片选编号。
5.2.3 配置 SPI 参数
struct rt_spi_configuration cfg;
cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0; /* 主模式,Mode 0 */
cfg.data_width = 8; /* 8 位数据宽度 */
cfg.max_hz = 10000000; /* 最大时钟 10 MHz */
rt_spi_configure(spi_device, &cfg);5.2.4 SPI 全双工传输
/* 全双工传输:同时发送和接收数据 */
rt_uint8_t tx_buf[4] = {0xAA, 0xBB, 0xCC, 0xDD};
rt_uint8_t rx_buf[4] = {0};
rt_spi_transfer(spi_device, tx_buf, rx_buf, 4);rt_spi_transfer 执行全双工传输,tx_buf 中的数据在时钟驱动下送出,同时接收的数据存入 rx_buf。
5.2.5 SPI 单向发送与接收
/* 仅发送 */
rt_spi_send(spi_device, tx_buf, 4);
/* 仅接收(发送 0xFF) */
rt_spi_receive(spi_device, rx_buf, 4);5.2.6 SPI 完整初始化与读写示例
#include <rtthread.h>
#include <rtdevice.h>
#define SPI_BUS_NAME "spi00" /* 以实际 BSP 注册名为准 */
#define SPI_CLK_FREQ 10000000 /* 10 MHz */
static void spi_sample(void)
{
struct rt_spi_device *spi_dev;
struct rt_spi_configuration cfg;
rt_uint8_t tx_buf[4] = {0x01, 0x02, 0x03, 0x04};
rt_uint8_t rx_buf[4] = {0};
/* 1. 查找 SPI 设备 */
spi_dev = (struct rt_spi_device *)rt_device_find(SPI_BUS_NAME);
if (spi_dev == RT_NULL)
{
rt_kprintf("Can not find %s device\n", SPI_BUS_NAME);
return;
}
/* 2. 配置 SPI 参数 */
cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0;
cfg.data_width = 8;
cfg.max_hz = SPI_CLK_FREQ;
rt_spi_configure(spi_dev, &cfg);
/* 3. 全双工传输 */
if (rt_spi_transfer(spi_dev, tx_buf, rx_buf, 4) != RT_NULL)
{
rt_kprintf("SPI rx: 0x%02X 0x%02X 0x%02X 0x%02X\n",
rx_buf[0], rx_buf[1], rx_buf[2], rx_buf[3]);
}
else
{
rt_kprintf("SPI transfer failed\n");
}
}5.3 USB 驱动代码详解
重要说明:RK3576 未显式出现在 USB 指南(V1.3.0)的支持芯片列表中。以下代码基于 DWC2 控制器通用框架编写,标注为参考说明。
5.3.1 USB Device 初始化
RT-Thread USB Device 驱动基于 DWC2 (DesignWare USB 2.0) 控制器。初始化时需注册 USB 设备并配置设备描述符:
#include <rtthread.h>
#include <rtdevice.h>
#define USB_VID 0x2207 /* Rockchip 厂商 ID */
#define USB_PID 0x0001 /* 产品 ID,需自定义 */
static struct udevice_descriptor dev_desc =
{
USB_DESC_LENGTH_DEVICE, /* bLength */
USB_DESC_TYPE_DEVICE, /* bDescriptorType */
USB_VERSION_200, /* bcdUSB */
0, /* bDeviceClass */
0, /* bDeviceSubClass */
0, /* bDeviceProtocol */
64, /* bMaxPacketSize0 */
USB_VID, /* idVendor */
USB_PID, /* idProduct */
0x0100, /* bcdDevice */
1, /* iManufacturer */
2, /* iProduct */
3, /* iSerialNumber */
1 /* bNumConfigurations */
};5.3.2 CDC-ACM 虚拟串口示例
CDC-ACM 是最常见的 USB Device 类,用于实现虚拟串口通信:
/* 启用 CDC-ACM 类驱动后,在 menuconfig 中配置:
* RT_USING_USB_DEVICE
* RT_USB_DEVICE_CDC_ACM
*
* 启动后系统会自动注册 /dev/ttyACM0 设备节点
* 应用层通过标准串口 API 读写即可
*/使用方式:
/* 查找 CDC-ACM 设备 */
rt_device_t serial = rt_device_find("ttyACM0");
if (serial == RT_NULL)
{
rt_kprintf("CDC-ACM device not found\n");
return;
}
/* 打开设备 */
rt_device_open(serial, RT_DEVICE_FLAG_RDWR);
/* 写入数据 */
const char *msg = "Hello USB CDC-ACM\n";
rt_device_write(serial, 0, msg, rt_strlen(msg));
/* 读取数据 */
char rx_buf[64];
rt_size_t rx_len = rt_device_read(serial, 0, rx_buf, sizeof(rx_buf));5.3.3 USB Host 模式
USB Host 模式下,DWC2 控制器作为主机驱动外部 USB 设备。RT-Thread USB Host 框架自动枚举接入的设备:
/* 启用 USB Host 后,插入 USB 设备时系统自动枚举
* Mass Storage 设备会注册为块设备
* HID 设备会注册为输入设备
*/5.3.4 USB 类驱动对照
| 类驱动 | RT-Thread 配置宏 | 设备节点示例 | 典型应用 | 状态 |
|---|---|---|---|---|
| CDC-ACM | RT_USB_DEVICE_CDC_ACM | /dev/ttyACM0 | 虚拟串口 | 参考说明 |
| HID | RT_USB_DEVICE_HID | 输入设备节点 | 键盘、鼠标 | 参考说明 |
| MStorage | RT_USB_DEVICE_MSTORAGE | 块设备节点 | U 盘 | 参考说明 |
| RNDIS | RT_USB_DEVICE_RNDIS | 网络设备节点 | USB 网卡 | 参考说明 |
| WINUSB | RT_USB_DEVICE_WINUSB | 自定义设备 | Windows 通信 | 参考说明 |
| UVC | RT_USB_DEVICE_UVC | 视频设备节点 | USB 摄像头 | 参考说明 |
| UAC | RT_USB_DEVICE_UAC | 音频设备节点 | USB 声卡 | 参考说明 |
6. 常见问题
6.1 I2C
| 现象 | 已确认原因 | 处理方法 | 状态 |
|---|---|---|---|
| I2C 设备未出现在 list_device 中 | 未在 menuconfig 中启用对应 I2C 控制器 | 检查 RT_USING_I2Cx 配置宏是否启用 | 参考说明 |
| I2C 传输返回 0 | 从设备地址错误或 IOMUX 未配置为 I2C 功能 | 检查从设备地址和引脚 IOMUX 配置 | 参考说明 |
6.2 SPI
| 现象 | 已确认原因 | 处理方法 | 状态 |
|---|---|---|---|
| SPI 数据收发异常 | SPI 模式(CPOL/CPHA)与从设备不匹配 | 确认从设备要求的 SPI 模式并匹配配置 | 参考说明 |
| SPI 传输数据丢失 | FIFO 溢出或时钟频率过高 | 降低 SPI 时钟频率,检查 FIFO 深度限制 | 参考说明 |
6.3 USB
| 现象 | 已确认原因 | 处理方法 | 状态 |
|---|---|---|---|
| USB Device 无法枚举 | DWC2 控制器未正确初始化或 VID/PID 配置错误 | 检查 USB 控制器初始化代码和描述符配置 | 参考说明 |
| USB Host 无法识别设备 | USB 类驱动未启用或供电不足 | 启用对应类驱动,检查 USB 供电电路 | 参考说明 |
7. 相关文档
| 文档 | 说明 |
|---|---|
| RT-Thread环境与工程入口 | AMP 架构、SDK 目录、构建流程入口 |
| BSP与启动 | 调试串口配置、menuconfig、finsh shell |
| CAN-FD与UART | RT-Thread 外设驱动(CAN-FD、UART) |
| I2C驱动开发 | Linux 侧 I2C 驱动(对照参考) |
| SPI驱动开发 | Linux 侧 SPI 驱动(对照参考) |
| USB主机与设备驱动 | Linux 侧 USB 驱动(对照参考) |
| 核心板参数 | 硬件事实基线(接口能力) |
| 40PIN引脚定义 | 底板 40PIN 接口(含 I2C8_SDA/SCL 标注) |
