符号注解
S |
Start 条件 |
P |
Stop 条件 |
Rd/Wr (1 bit) |
读/写位。Read等于1, Write等于0。 |
A, NA (1 bit) |
确认(ACK)和不确认(NACK)位 |
Addr (7 bits) |
2C 7位地址。注意,这可以像往常一样进行扩展,以获得10位I2C地址。 |
Comm (8 bits) |
命令字节,通常选择设备上的寄存器。 |
Data (8 bits) |
一个普通数据字节。有时,对于16位数据写DataLow, DataHigh。 |
Count (8 bits) |
包含块操作长度的数据字节。 |
[..] |
由I2C设备发送的数据,而不是由主机适配器(adapter)发送的数据。 |
简单的发送事务
由 i2c_master_send() 实现:
S Addr Wr [A] Data [A] Data [A] ... [A] Data [A] P
API解释:
int i2c_master_send(const struct i2c_client *client, const char *buf, int count);
在主传输模式下发出单个I2C消息。
参数
- const struct i2c_client *client:从设备的指针
- const char *buf:将要写入从设备的数据
- int count:要写多少字节,必须小于64k,因为 msg.len 是u16
描述
返回负errno,否则返回写入的字节数。
简单的接收事务
由 i2c_master_recv() 实现:
S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
API解释:
int i2c_master_recv(const struct i2c_client *client, char *buf, int count);
在主接收模式下发出单个I2C消息。
参数
- const struct i2c_client *client:从设备的指针
- char *buf:存储从slave读取的数据
- int count:要读取多少字节,必须小于64k,因为 msg.len 是u16
描述
返回负errno,否则返回读的字节数。
合并事务
由 i2c_transfer() 实现。
它们就像上面的事务,但不是一个停止条件P,而是一个开始条件S被发送,事务继续。先读一个字节,再写一个字节的例子:
S Addr Rd [A] [Data] NA S Addr Wr [A] Data [A] P
API解释:
int i2c_transfer
(struct i2c_adapter *adap, struct i2c_msg *msgs, int num);
执行单个或组合的I2C消息。
参数
- struct i2c_adapter *adap:i2c适配器的指针
- struct i2c_msg *msgs:在发出STOP命令以终止操作之前要执行的一条或多条消息;每条消息都以START开头。
- int num: 要执行的消息数。
描述
返回负errno,否则返回执行的消息数。
注意,没有要求将每个消息发送到相同的从地址,尽管这是最常见的方式。
修改后的事务
通过为I2C消息设置这些标志,还可以生成对I2C协议的以下修改。除了I2C_M_NOSTART之外,它们通常只用于解决设备问题:
- I2C_M_IGNORE_NAK:
正常情况下,如果客户端有[NA]消息,会立即中断。设置此标志将任何[NA]视为[A],并发送所有消息。这些消息可能会发送失败由于SCL lo->hi 超时。
- I2C_M_NO_RD_ACK:
在读消息中,跳过master a /NA位。
- I2C_M_NOSTART:
在一个合并事务中,在某个点没有‘ S Addr Wr/Rd [a] ‘生成。例如,在第二个部分消息上设置I2C_M_NOSTART将生成如下内容:
S Addr Rd [A] [Data] NA Data [A] P
如果您为第一个部分消息设置I2C_M_NOSTART变量,我们不会生成Addr,但我们会生成启动条件s。这可能会混淆您总线上的所有其他客户端,所以不要尝试这样做。
这通常用于收集来自系统内存中的多个数据缓冲区的传输,这些传输看起来像是向I2C设备的单个传输,但也可能在一些罕见设备的方向更改之间使用。
- I2C_M_REV_DIR_ADDR:
这将切换Rd/Wr标志。也就是说,如果你想写,但需要发出Rd而不是Wr,或者相反,你可以设置这个标志。例如:
S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P
- I2C_M_STOP:
在消息之后强制一个停止条件(P)。一些与I2C相关的协议,如SCCB,需要这样做。通常情况下,你真的不想在一次传输的消息之间被打断。