I2C 协议

符号注解

S

Start 条件

P

Stop 条件

Rd/Wr (1 bit)

读/写位。Read等于1, Write等于0。

A, NA (1 bit)

确认(ACK)和不确认(NACK)位

Addr (7 bits)

I2C 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,需要这样做。通常情况下,你真的不想在一次传输的消息之间被打断。

posted @ 2021-08-16 11:23  闹闹爸爸  阅读(500)  评论(0编辑  收藏  举报