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消息。
返回负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消息。
返回负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消息。
返回负errno,否则返回执行的消息数。
注意,没有要求将每个消息发送到相同的从地址,尽管这是最常见的方式。
通过为I2C消息设置这些标志,还可以生成对I2C协议的以下修改。除了I2C_M_NOSTART之外,它们通常只用于解决设备问题:
正常情况下,如果客户端有[NA]消息,会立即中断。设置此标志将任何[NA]视为[A],并发送所有消息。这些消息可能会发送失败由于SCL lo->hi 超时。
在读消息中,跳过master a /NA位。
在一个合并事务中,在某个点没有‘ S Addr Wr/Rd [a] ‘生成。例如,在第二个部分消息上设置I2C_M_NOSTART将生成如下内容:
S Addr Rd [A] [Data] NA Data [A] P
如果您为第一个部分消息设置I2C_M_NOSTART变量,我们不会生成Addr,但我们会生成启动条件s。这可能会混淆您总线上的所有其他客户端,所以不要尝试这样做。
这通常用于收集来自系统内存中的多个数据缓冲区的传输,这些传输看起来像是向I2C设备的单个传输,但也可能在一些罕见设备的方向更改之间使用。
这将切换Rd/Wr标志。也就是说,如果你想写,但需要发出Rd而不是Wr,或者相反,你可以设置这个标志。例如:
S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P
在消息之后强制一个停止条件(P)。一些与I2C相关的协议,如SCCB,需要这样做。通常情况下,你真的不想在一次传输的消息之间被打断。
原文:https://www.cnblogs.com/wanglouxiaozi/p/15146868.html