Linux_I2C读写流程

1.1. I2C-SCCB时钟

此处描述的I2C时序,是摄像头SCCB的通信时序。不过其实和I2C时序没啥区别,就是换了个名字而已 ...

在这里插入图片描述

很重要的一点,我以前就讲过,I2C要上拉电阻,典型值4.7K,不然会出问题。。。其次,通信频率。。。手册规定400KHz以内,这跟业界保持了一致。。。
在这里插入图片描述

如上图所示,Tmack=1.25us=800KHz----所以SCLK最多为400KHz。

准确的采样点应该是:1.25us+SCLK高电平的中点;或者直接说,是SCLK高电平的中点。

1.2. I2C通信时序描述

(1)数据传输:SCL为高电平,SDA保持稳定,如下图所示:在这里插入图片描述

(2)数据改变:SCL位低电平,SDA才能改变传输的bit,这个非常重要,因为I2C在高电平读取数据。

(3)开始信号:SCL为高电平时,SDAT由高电平向低电平跳转,开始传送数据


在这里插入图片描述

(4)结束信号:SCL为高电平时,SDAT由低电平向高电平传输,结束传送数据


在这里插入图片描述

(5)应答信号:


在这里插入图片描述
在9th clock,若I2C发出ACK,SDA会被拉低;

在9th clock,若I2C没有ACK,SDA会被置高,从而Master Repeat。


在这里插入图片描述
在这里插入图片描述

1.2.1. I2C写流程

(1)Master发出START信号--开始信号

(2)Master发出I2C ADDR(7bit)和W操作0( 1bit)信号,等待ACK

(3)Slave发送ACK

(4)Master发送reg addr(8bit),等待ACK

(5)Slave发送ACK

(6)Master发送reg data(8bit),等待ACK

(7)Slave发送ACK

(8)Master发出STOP信号--结束信号

备注:操作(6)(7)可以连续进行,即顺序写入寄存器,时序仿真图如下所示:
在这里插入图片描述
1.2.2. I2C读流程
在这里插入图片描述
在这里插入图片描述

如上图所示,读取分为2个过程,过程1制定寄存器地址,过程2读取寄存器数据,总的流程如下所示:

(1)Master发出START信号--开始信号

(2)Master发出I2C ADDR(7bit)和W操作0( 1bit)信号,等待ACK

(3)Slave发送ACK

(4)Master发送reg addr(8bit),等待ACK

(5)Slave发送ACK

(6)Master发出STOP信号--结束信号

(7)I2C初始化状态

(8)Master发出START信号--开始信号

(9)Master发出I2C ADDR(7bit)和R操作1( 1bit)信号,等待ACK

(10)Slave发送ACK

(11)Slave发送reg data(8bit),等待ACK

(12)Master发送ACK

读取寄存器数据的时序仿真图,如下所示:

在这里插入图片描述
1.3. 总结

一个I2C写入的时序,需要8个状态的转移;而一个I2C读取的时序,需要12个状态的转移,加上1个初始化状态,一个完整的I2C时序,共需要21个状态转移。最重要的一点,是要保证SCK高电平是,SDA已经处于稳定期;而读取Slave数据的时候,最好在SCK高电平中点,这样读取的也是稳定期的数据!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值