本文档描述i2c协议。
关键符号
==============
S (1 bit) : Start bit(起始位)
P (1 bit) : Stop bit(停止位)
Rd/Wr (1 bit) : Read/Write bit. Rd equals 1, Wr equals 0.(读写位)
A, NA (1 bit) : Accept and reverse accept bit. (回复位)
Addr (7 bits):I2C 7位地址。注意,这可以像往常一样扩展到获取10位I2C地址
Comm (8 bits):命令字节,通常选择设备上的寄存器的数据字节。
Data (8 bits):一个普通数据字节。Sometimes, I write DataLow, DataHigh for 16 bit data.
Count (8 bits):包含块操作长度的数据字节。
简单发送
======================
这对应于i2c_master_send。
S Addr Wr [A] Data [A] Data [A] ... [A] Data [A] P
简单接收
===========================
这对应于i2c_master_recv
S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
混合传输
====================
它们与上述事务一样,但不是发送停止位Pa start bit S,而是继续发送事务。字节读取的一个示例,后跟字节写入
S Addr Rd [A] [Data] NA S Addr Wr [A] Data [A] P
修改的传输
=====================
我们发现一些I2C设备需要进行以下修改:
- 标志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。这将可能把总线的其他
client都弄糊涂了,所以不要试着这样做。
2.标志I2C_M_REV_DIR_ADDR
这将切换Rd/Wr标志。也就是说,如果你做一个写操作,但是需要发出一个Rd而不是Wr,反之亦然你要设置这个标志。例如:
S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P
3.标志I2C_M_IGNORE_NAK
如果client有NA时,正常消息传输会被打断,设置这个标志会认为Na为A,消息就会正常传输。
These messages may still fail to SCL lo->hi timeout.
4.标志I2C_M_NO_RD_ACK
在已读消息中,跳过主a/NA位。