I2C总线协议原理

     首先I2C总线一共分为2根,一根是SCL(serial clock),还有一根是SDA(serial data),一根是用来同步时钟的,一根是发送接收数据的,因为有时钟的同步,所以很显然,I2C用的是同步通信的方式。

     在SDA和SCL总线上,所有的设备都是采用的线与的连接方式,也就是说,接地输出的是0,高阻态的情况下输出的是1,所有的设备是不会直接通过输出高电平的,原因也很简单,我们看下面的图可以发现,如果设备A接地,也就是输出0,设备B如果用输出高电平来输出1的话,那就会导致设备B的短路,可能会烧毁设备,所以在线与的时候,我们的做法是接一个上拉的电阻,当我们如果想要设备B输出1的时候,我们只需要让设备B断开与总线的连接,也就是呈现高阻的状态,然后就因为上拉电阻的原因,我们在总线上呈现的是一个高电平,也就可以满足我们要输出1的要求。

     了解了线与的基本原理,下面我们就可以从物理层跳到协议层去看看I2C的协议是什么样的(注意灰色都是主机做的事情,白色都是从机做的事情)

     I2C总线上传送的数据信号是广义的,既包括地址信号(通常是7位或者10位),又包括真正的数据信号。

     因为在起始信号后必须传送一个从机(slave)的地址(7位),第8位是数据的传送方向位(R/),用“0”表示主机发送数据(T),用“1”表示主机接受数据(R)。然后这时候接收机会产生一个应答(ACK),就好比上课的时候,老师在教室里面点名,当喊到小明同学的时候,小明同学需要给老师一个回复,表示他已经做好了回答问题的准备。

    接下来就是传输数据了,每当发送机传输完一byte的数据,接收机都要做出一个相应,来表示有无成功的接受这个数据,当最后的信号发送完成一会,如果发送机是主机,那就由主机直接发送一个停止位,来结束这次的发送。

    如果主机作为接收机呢,那么过程会相对的复杂一点。这是因为在接受slave数据的时候,我们必须要知道我们要从哪个寄存器来读取数据,这就要我们先通过对其进行写入的操作。

   1)发送起始位;
   2)发送slave地址+write bit set 

   3)发送内部寄存器地址;
   4)重新发送起始位,即restart

   3)发送内部寄存器地址;
   4)重新发送起始位,即restart

   需要注意的是主机接收器在接收到最后一个字节后,也不会发出ACK信号,这时候从机释放掉对于SDA总线的控制,等待主机控制SDA,发送停止标志。

   可以看出,开始位和停止位都是只能又主机发送的,从机是不具有这样的功能。

   上面说了那么多发送起始位,和停止位,以及数据的发送和接受,那I2C到底是怎么达到数据的成功传输的呢。

    

    首先来看看I2C里面数据的START信号和STOP信号是长什么样的。

    当我们的SCL总线时钟处在高电平的时候,SDA有一个从1到0的过程,这说明START 信号到来了,所有的从机做好准备,等待主机的地址输入。这其实也很好理解,毕竟在空闲的时候,所以的设备都是处在空闲的高阻态,SDA总线上的电平是由上拉电阻决定的,所以一定是高电平,如果出现了下降沿,那一定是SDA总线被设备占用了,也就说明有数据要开始发送了。

    那我们的STOP呢,就正好与我们的START信号相反,在我们的SCL为高电平的时候,我们的SDA出现了上升沿的过程就是STOP信号。

    那中间的数据是怎么传输的呢,接收机又是在何时接受信号,发送机又是在何时转变自己的电平变化呢

    由上面的这幅图可以看到,在SCL总线为高电平的时候,是要求SDA的数据稳定的,这就是因为这个时候,接收机要读取Data了,只有保证接收机在读取信号的时候,发送机数据是稳定的,才能保证接收机读取的数据不会发生错误,减少误码率。

    而在SCL为低电平的时候,I2C协议规定,接收机是不要读取信号的,这时候发送机要抓紧转换为先下一个电平,这个转化一定要在下一次高电平到来之前完成,这样才能确保高电平读取Data的时候不会出错。

   那在之前说到的,发送完1byte数据的时候,接收机会产生一个ACK/NACK的响应信号,这信号I2C是怎么规定的呢?

    根据这个图,我们来看,当发送完第8位数据的时候,发送机(这里假设主机发送)置为1,也就是放弃对SDA总线的控制权,把权力交给接收机,这时候,接收机需要在第9个高电平到来以前置为1/0,如果成功接收,那就出现一个下降沿,并且保持一整个高电平的时间,来告诉发送机,接收机已经成功接收,请发送下一位数据,如果接收机响应1,那就说明接收失败,要做出相应的对策。

这差不多就是整个I2C协议的大致内容了,如果有问题,也希望可以提醒我来改正,也请谅解。

   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值