跳到主要内容

I2C 外设指南

在 TuyaOpen 中配置和使用 I2C 总线进行传感器通信、OLED 显示、IO 扩展器等外设。

初始化

1. 通过 pinmux 分配引脚

#include "tkl_pinmux.h"
#include "tkl_i2c.h"

tkl_io_pinmux_config(TUYA_GPIO_NUM_9, TUYA_IIC0_SCL);
tkl_io_pinmux_config(TUYA_GPIO_NUM_10, TUYA_IIC0_SDA);

2. 初始化总线

TUYA_IIC_BASE_CFG_T i2c_cfg = {
.role = TUYA_IIC_MODE_MASTER,
.speed = TUYA_IIC_BUS_SPEED_400K,
.addr_width = TUYA_IIC_ADDRESS_7BIT,
};
tkl_i2c_init(TUYA_I2C_NUM_0, &i2c_cfg);

读写操作

写寄存器

UINT8_T buf[2] = { reg_addr, value };
tkl_i2c_master_send(TUYA_I2C_NUM_0, device_addr, buf, 2, TRUE);

读寄存器

UINT8_T reg = 0x00;
UINT8_T data[2];
tkl_i2c_master_send(TUYA_I2C_NUM_0, device_addr, &reg, 1, FALSE);
tkl_i2c_master_receive(TUYA_I2C_NUM_0, device_addr, data, 2, TRUE);

最后参数 FALSE 表示不产生 STOP 条件,以便后续读取生成 repeated START。

I2C 总线扫描

for (UINT8_T addr = 0x08; addr < 0x78; addr++) {
UINT8_T dummy;
OPERATE_RET rt = tkl_i2c_master_receive(TUYA_I2C_NUM_0, addr, &dummy, 1, TRUE);
if (rt == OPRT_OK) {
TAL_PR_INFO("found device at 0x%02X", addr);
}
}

限制

功能状态
主模式支持
从模式不支持 (OPRT_NOT_SUPPORTED)
10-bit 寻址支持
总线复位 / ioctl不支持

TuyaOpen 项目中常用 I2C 设备

设备地址类型
SHT3x0x44 / 0x45温湿度传感器
SSD13060x3COLED 显示
ES83110x18音频编解码器
ES83880x20音频编解码器
FT5x060x38触摸控制器
BMI2700x68 / 0x69IMU

参考资料