全部博文(36)
分类: 嵌入式
2012-11-26 16:50:34
欢迎转载和指导,然后再吐槽!!!
重要的符号标志
——————————————
S (1位) :开始位
P (1 位) :停止位
Rd/Wr (1 位) :读写位,读,它就等于1,写,它就等于0
A,NA (1位) :应答和非应答位
Addr (7位) :I2C 7位地址。注意此地址也可以扩展到10位地址。
Comm (8位) :命令字节,就是一个数据用来选择设备上面的一个寄存器
Data (8位) :普通数据字节。如果是16位数据,我也会写高数据位和低数据位
Count (8位) : 包含块操作长度的数据字节
[. .] : I2C设备的数据发送,与之对应的,主控制器数据的发送
简单发送事务
————————————————
这个相当于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
组合事务传输
————————————————
这个就相当于i2c_transfer
他们就像上面说的事务那样,但是不是一个停止位P,而是接着一个开始位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变量,我们不会产生地址,但是会产生开始位S。这个可能会是你适配器上面的client设备产生混乱,所以不要试。
标志 I2C_M_REV_DIR_ADDR
这个用来切换Rd/Wr标志,也就是说,当你想写的时候,你需要发送Rd而不是Wr,反之亦然。例如:
S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P
标志 I2C_M_IGNORE_NAK
如果从client设备传回的是一个[NA]的话,那么正常的消息就会被马上打断。设置这个的话,就把所有[NA]当做[A]来处理,那么所有的消息继续发送。
标志I2C_M_NO_RD_ACK
在读消息中,master控制器的A/NA会被跳过。