IIC时序图

硬件电路

(只讨论一主多从的情况)

 

IIC时序图由4个基本单元组成

1:起始条件

 起始条件开始之前,先将SCL时钟信号线和SDA数据信号线拉高电平,之后两根线都为高电平

其次,在SCL高电平期间!把SDA电平拉低!SCL捕获到这个下降沿,之后主机再把SCL拽下来,占用SCL总线,方便时序单元的拼接,就打开了传输数据的条件

2:发送字节或接收字节

主机发送字节

SCL和SDA一开始由起始条件触发进入,所以都是低电平,接着SCL会被主机控制规律的拉高和拉低电平

SDA是传输数据的信号线,当主机发数据的情况下,主机在SCL低电平的时候,拉高或拉低SDA的电平,用来放数据在SDA上,SCL高电平的时候,主机发在SDA上的数据就被从机读走,当然,从机只在SCL高电平的时候读SDA的数据,只在SCL低电平拉SDA线放数据。

总结:拉高或拉低SDA数据线是用来放数据的,拉高或拉低SDA线只能在SCL低电平操作,因为SCL高电平的时候,别人在读数据,你当然不能来回改变数据。。SCL高电平读数据,SCL低电平,放数据(改变SDA电平高低就是放数据)

主机接收字节

主机如果是接收数据的时候,也就是读数据,那么SDA就得交给从机操作了,因为SDA是用来放数据的,谁发数据当然就谁操作SDA了,所以,数据线需要交给从机,那么主机就得松开SDA线,在写程序的时候,先让主机SDA=1,松开SDA信号线,从机就方便拽这个SDA发数据给主机读了 .。

和上面过程类似,在主机控制的SCL低电平的时候,从机放数据在SDA,SCL高电平的时候,主机就读取从机控制的SDA的高低电平数据,总结:SCL低电平,从机控制SDA高低电平放数据,SCL高电平,主机读数据,循环8次,就接收一个字节

3:应答位

应答分为发送应答接收应答

发送应答

从机应答 

总结:

谁接收数据,谁就发应答位,在8位字节发送完之后的那一位,SCL读SDA为0,表示应答,就可以继续发数。SCL读1,表示非应答,停止发数据 

 当主机发数据,从机读数据(接收)的时候,8位过后的第9位为应答位,注意了,前面8位数据是主机发,从机有没有收到数据,第9位应该是从机发应答位回给主机,但是前8位一直是主机在控制SDA,从机没有操控权,所以第9位从机应答位之前,也就是第8位过后的SCL低电平那段时间,主机需要把SDA拉高,交出占用权,从机才能去拉SDA表示应答。

当从机发数据,主机读数据(接收)的时候,接收完一个字节,也就是8位接收完后,在SCL低电平时,拉高拉低SDA电平来作为应答位,拉低为0,应答,拉高为1,非应答,这里主机发应答位就不需要从机交出控制权哈,和上面不一样,直接就能控制SDA,可以说是,主机对SDA有绝对控制权

4:终止条件

 

8位字节发完,第9位应答位后,在SCL高电平期间,对SDA拉高电平,SCL检测到SDA上升沿,为终止条件

                                                接下来看几个实例图

                                                1:主机写从机数据

这段时序图表示,主机在某个从机某个寄存器写入某个数据

                                                 2:主机读从机数据

 细心的你应该会发现!!!!!对于这个主机读从机的操作,我并没有要求读从机的哪个寄存器数据的权利,只要你读写位写1,表示读,那么下一个字节传输的就是寄存器的数据,那么到底读的是哪个寄存器的数据值呢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

这里涉及一个地址指针的问题,一般给从机上电后,地址指针默认指向第一个地址,如果说你读或者写第一个地址后,这个地址指针默认就指向下一个地址,*p++。

所以说,在从机读操作之前,没有进行读或写操作,地址指针指向的就是第一个地址,也就是读的第一个寄存器的数据 ,那么如果我要读的数据并不是第一个寄存器的数据,我想读第三个或者第四个第五个都寄存器数据怎么办呢,没有指定地址读的操作啊

刚刚说了,只要对某个寄存器进行读或写操作后,地址指针就会指向下一个,那么下一次读的就是下一个寄存器的值,如果想要指定读某个寄存器的值,我们就想到一个办法!!!!

因为写操作可以选择寄存器地址,首先,对你想要读的寄存器的上一个寄存器进行写操作,但是不要写数据,就像这样

总结来说,指定地址写可以选择寄存器地址进行写,但是读寄存器没有直接指定地址读的操作,但可以间接先进行指定地址写的操作,不写数据,来个重复起始条件,刷新地址指针指到到下一个寄存器,就可以直接进行下一个地址寄存器的读操作了 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值