diff --git a/rt-thread-version/rt-thread-standard/programming-manual/device/i2c/i2c.md b/rt-thread-version/rt-thread-standard/programming-manual/device/i2c/i2c.md index 6bb4df2f0efe2955ad92f2bed78bd73c2369a9da..05301316d398bfdffa5cf5cdbf1433603c1ba22a 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/device/i2c/i2c.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/device/i2c/i2c.md @@ -106,12 +106,13 @@ struct rt_i2c_msg 标志 flags 可取值为以下宏定义,根据需要可以与其他宏使用位运算 “|” 组合起来使用。 ```c -#define RT_I2C_WR 0x0000 /* 写标志 */ -#define RT_I2C_RD (1u << 0) /* 读标志 */ +#define RT_I2C_WR 0x0000 /* 写标志,不可以和读标志进行“|”操作 */ +#define RT_I2C_RD (1u << 0) /* 读标志,不可以和写标志进行“|”操作 */ #define RT_I2C_ADDR_10BIT (1u << 2) /* 10 位地址模式 */ #define RT_I2C_NO_START (1u << 4) /* 无开始条件 */ #define RT_I2C_IGNORE_NACK (1u << 5) /* 忽视 NACK */ #define RT_I2C_NO_READ_ACK (1u << 6) /* 读的时候不发送 ACK */ +#define RT_I2C_NO_STOP (1u << 7) /* 不发送结束位 */ ``` 使用示例如下所示: @@ -146,6 +147,61 @@ static rt_err_t read_regs(struct rt_i2c_bus_device *bus, rt_uint8_t len, rt_uint } ``` +## I2C 从设备数据读写API + +以下两个读写函数封装自 rt_i2c_transfer() 函数,用于读写I2C从设备的数据,更加简单易用,推荐使用。 + +从 I2C 从设备发送数据: + +```c +rt_size_t rt_i2c_master_send(struct rt_i2c_bus_device *bus, + rt_uint16_t addr, + rt_uint16_t flags, + const rt_uint8_t *buf, + rt_uint32_t count); +``` + +| **参数** | **描述** | +| ------------------ | ------------------------------------------------------------ | +| bus | I2C 总线设备句柄 | +| addr | I2C 从设备地址 | +| flags | 标志位,可为上文提到的除 `RT_I2C_WR` `RT_I2C_RD`之外的其他标志位,可以进行 “\|” 操作 | +| buf | 待数据数据缓冲区 | +| count | 待发送数据大小(单位:字节) | +| **返回** | —— | +| 消息数组的元素个数 | 成功 | +| 错误码 | 失败 | + +从 I2C 从设备读取数据,数据会放在缓冲区中: + +```c +rt_size_t rt_i2c_master_recv(struct rt_i2c_bus_device *bus, + rt_uint16_t addr, + rt_uint16_t flags, + rt_uint8_t *buf, + rt_uint32_t count); +``` + +| **参数** | **描述** | +| ------------------ | ------------------------------------------------------------ | +| bus | I2C 总线设备句柄 | +| addr | I2C 从设备地址 | +| flags | 标志位,可为上文提到的除 `RT_I2C_WR` `RT_I2C_RD`之外的其他标志位,可以进行 “\|” 操作 | +| buf | 数据缓冲区 | +| count | 缓冲区大小(单位:字节,要大于等于最大接收到的数据长度) | +| **返回** | —— | +| 消息数组的元素个数 | 成功 | +| 错误码 | 失败 | + +### 小技巧 + +有时,I2C数据需要通过多次函数拼接而成,通过如下方法,可以实现拼接发送一条I2C数据,数据内容为 prefix_buffer + buffer: + +```c +rt_i2c_master_send(_i2c_bus_dev, _addr, RT_I2C_NO_STOP, prefix_buffer, prefix_len); /* 只发送起始位,不发送停止位 */ +rt_i2c_master_send(_i2c_bus_dev, _addr, RT_I2C_NO_START, buffer, len); /* 不发送起始位,只发送停止位 */ +``` + ## I2C 总线设备使用示例 I2C 设备的具体使用方式可以参考如下示例代码,示例代码的主要步骤如下: