I2C通信协议原理以及时序详解

本文详细介绍了I2C通信协议的原理,包括其同步结构、半双工特性和数据应答机制。此外,探讨了一主多从和多主多从模式的硬件设计,以及SCL和SDA的时序操作,如起始、终止单元和数据传输的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


I2C通信协议的原理

I2C通信协是由一根时钟线、一根数据线组成,是同步的(有时钟线控制时间,若遇到中断去执行别的程序,通信不会被打算),由一根数据线完成接收和发送数据,是半双工模式,为了实时的知道数据的接收信息设置了数据应答,支持连接多个外设。本文主要使用一主多从模式。
一主多从:一个主机,多个从机,从机默认无法操作数据线,主机可选择某个从机使其短暂的可以操作数据线。
多主多从:也是一个主机,多个从机,但从机可以与主机互换身份。
在这里插入图片描述

I2C的硬件设计

如下图,为一主多从模式的电路连接,由于由CPU控制总线,可以先将所有从机设置为浮空输入或上拉输入,不过对于数据总线,主机从机都会在输出输入直接反复切换,很容易导致某个从机与主机都处于输出状态导致短路,所以把总线都设置为开漏输出模式(即强下拉),然后外接一个弱上拉,当所有从机都为高电平时,这个弱上拉才会生效,总线为高电平,当一个或多个从机为低电平时,开漏输出的强下拉就会使总线置为低电平,这样可以杜绝电路短路的问题
在这里插入图片描述

I2C的时序单元

为了方便时序单元间的拼接,规定除了起始单元与终止单元的其他时序单元都已低电平开始。

起始单元

SCL高电平期间,SDA变为低电平,然后将SCL置位低电平,以便于与其他的时序单元拼接
在这里插入图片描述

终止单元

SCL高电平期间,SDA由低电平变为高电平
在这里插入图片描述

发送一个字节的时序单元

在SCL低电平时SDA要先确定好发送的数据,高电平为1、低电平为0,在SCL上升沿时会立刻读取SDA的数据(所以SCL高电平期间SDA不允许变化),然后在高电平期间,从机获取SDA的数据,然后SCL回到低电平,然后重复8次,获取一个字节。(这个传输过程是从高位开始)

在这里插入图片描述

接收一个字节的时序单元

在接收数据前,主机要先释放SDA,交由从机控制。然后与发送字节单元类似,SCL低电平时(前一个下降沿后),从机确定好要发送的数据。在SCL高电平期间主机开始接收数据(从高位开始)
在这里插入图片描述

发送应答单元

与发送字节一样,在接收一个字节之后,相当于接着发送了一位应答位,SCL高电平时读取,SDA高电平为1,低电平为0,1为非应答,0为应答。<发送应答成功后主机把SDA拉为低电平>
在这里插入图片描述

接收应答单元

与接收字节一样,在发送一个字节之后,接着会接收一位应答位,SCL高电平时读取,SDA高电平为1,低电平为0,1为非应答,0为应答。(主机接收前需释放SDA)<从机机把SDA拉为低电平,主机收到0则应答成功>
在这里插入图片描述

指定地址写的时序

以下就是示波器所测的一个指定地址写的完整时序
在这里插入图片描述

当前地址读的时序

指定从机从当前地址指针所在地址开始读取数据
当前地址指针:所有的寄存器地址会线性连接,每当读入或写入一个字节时,这个指针就会加1,向后移一位,默认开始为0
在这里插入图片描述

指定地址读的时序

指定从机再指定地址下读取数据,相当于指定地址写的时序+当前地址读的时序,再指定地址写还没写时开始当前地址读,就可以再指定的地址处读数据。最后发送的应答是非应答,表示数据接收够了,不需要再接收了。若发送的应答为应答,则主机认为需要继续接收数据,总线的控制就还是从机控制,此时可以继续写数据,但会无法终止,因为总线还被从机拉着,所有不需要接收数据后要发送应答为非应答,这样总线才会回到被主机控制,才能进行终止时序。
在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值