0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深入剖析I2C协议

FPGA设计论坛 来源:CSDN技术社区 2025-08-21 15:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、什么是I2C协议

I2C是由Philips开发的简单的双向两线总线,在深入浅出理解SPI协议中,我们区分了单工,半双工,全双工协议数据流向的区别,根据特征,I2C协议属于半双工协议(即同一时刻,数据单向流动)。此外,I2C也是一种可以多主设备,多从设备的总线协议,通过地址索引,I2C可以使能所需从设备,I2C的出现主要是用来实现不同集成电路组件之间的控制功能,比如通过I2C协议,连接MCU与LCD驱动器,远程I/O口,RAM,EEPROM或数据转换器。

二、I2C,SPI,UART协议的区别

作者按照顺序,依次完成了UART,SPI,I2C协议,因为这三种协议都属于低速通用协议接口,因此作者将这三种协议放在一块进行比较,诚然,这些协议经过数十年的发展,衍生出了很多新版本,拥有了很多新特性,但他们的基本通信方式没变,因此我们仅比较他们的基本版本,得到如下表格,当然特性太多,也未必绝对准确,仅供初学者参考。

65b1425e-7d8d-11f0-a18e-92fbcf53809c.png

重点解释一下UART,SPI,I2C这三个协议的选通方式,作者觉得很有意思。

对于UART来说,正常来说是没有办法满足一个主设备,多个从设备的通信,它的通信方式最为简单,最低只需要一根线即可完成通信,协议本身并不允许外接多个从设备,但是我们也可以通过比如485转接、增加二极管的方式来进行多从设备选择(电路层面的设计内容,不是数字IC需要考虑的内容)。

其次是SPI协议,它有一个专门的NSS端口,默认拉低来选择所需的从设备。

最后是I2C协议,每个主设备和每个从设备都对应一个地址,通信的时候先发送地址信号,若一致,则被选中。

三、I2C的信号线

I2C仅需要两根信号线即可完成通信,如下图所示。除此以外,I2C的信号线需要连接上拉电路,有关上拉电阻的大小,是电路设计工程师需要操心的事,不归Digital IC Design Engineer管,就不在这里赘述了。

65c2bb9c-7d8d-11f0-a18e-92fbcf53809c.png

SDA(Serial Data) :串行数据线,用来传输数据信号。

SCL(Serial Clock):串行时钟线,用来传输时钟信号,一般是主设备向从设备提供。

四、I2C的连接方式

I2C的连接的连接形式非常灵活,可以是单主设备,单从设备,也可以是单主设备,多从设备,还可以是多主设备,多从设备。

4.1 单主设备,单从设备

65d280a4-7d8d-11f0-a18e-92fbcf53809c.png

4.2 单主设备,多从设备

65eb9652-7d8d-11f0-a18e-92fbcf53809c.png

4.3 多主设备,多从设备

65faa336-7d8d-11f0-a18e-92fbcf53809c.png

五、I2C的数据传输格式

5.1 空闲位

空闲时SDA与SCL默认都是高电平,对应于主设备状态机IDLE(默认态)时的输出为高

660e7dd4-7d8d-11f0-a18e-92fbcf53809c.png

5.2 起始位

SCL为高电平的时候 ,主设备控制SDA从1到0,为起始位,进入起始位后,SCL按照始终的要求进行翻转

从设备接收到起始位信息,状态机发生跳变,等待地址信号的输入

661c508a-7d8d-11f0-a18e-92fbcf53809c.png

从设备在这里需要使用到下降沿检测电路,作为状态机跳变的控制信号,详情可参考作者之前的文章。【数字IC手撕代码】Verilog边沿检测电路

5.3 地址位与读写控制

主设备按照从高到低的顺序,依次发送地址位,从设备进行接收,通常情况下,地址位为7bit,读写选择为1bit。每个从设备有且只有一个唯一的地址编号,依靠着这个编号,确定主设备具体与哪一个从设备进行通信。

6631fd68-7d8d-11f0-a18e-92fbcf53809c.png

同时,为了确保采样时信号稳定,对于主设备,我们在下降沿的时候将信号放在SDA上,对于从设备,我们在上升沿的时候进行采样。

对于读写控制位来说如果主设备需要将数据发送到从设备,则该位设置为 0;如果主设备需要往从设备接收数据,则将其设置为 1 。即写为0,读为1。

5.4 应答位(ACK/NACK)

发送了标题为5.3的8bit后,主机释放对SDA的控制权,由于上拉电阻的作用这个时候SDA默认为高电平,从机接管SDA的控制权,假如从机正确的接收了数据,会将SDA拉低,假如没有正确的接收数据,在从设备的控制下,SDA依旧为高电平。

读者在这里会发现,同一个SDA,怎么主设备也能控制,从设备也能控制呢?这里涉及到了inout双向端口的相关问题,可以参考作者的这篇文章进行解读和理解通俗易懂的带你解读inout双向端口

5.4.1 正确接收数据(ACK)

正确接收,SDA由从设备拉低

663d3dfe-7d8d-11f0-a18e-92fbcf53809c.png

5.4.2 未正确接收数据(NACK)

未正确接收,SDA依旧为高电平

664cd80e-7d8d-11f0-a18e-92fbcf53809c.png

5.5 数据位

当我们成功收到ACK信号后,就可以正式传输数据位了,每一次默认传输一个字节(即8bit),每个字节的传输都需要跟一个应答位(ACK/NACK)

665a5498-7d8d-11f0-a18e-92fbcf53809c.png

5.6 停止位

SCL先拉高,在SCL为高电平的时候,SDA从低到高,即为停止位,此后,I2C协议重新进入到空闲状态。这里使用了上升沿检测电路,原理同起始位的下降沿检测电路

666f5c4e-7d8d-11f0-a18e-92fbcf53809c.png

5.7 总结

667a3df8-7d8d-11f0-a18e-92fbcf53809c.png

首先为起始位S(start),接着传输地址7位SLAVE ADDRESS和1位读写控制信号R/W,再往后8位8位的传输数据位,每个字节紧跟ACK信号,最后为停止位

所有的阴影部分,都是主设备在操作总线,而A对应的ACK,则为从设备在操作总线。

六、I2C可配置变量

6.1 传输模式

标准模式(Standard):100kbps

快速模式(Fast):400kbps

快速模式+(Fast-Plus):1Mbps

高速模式(High-speed):3.4Mbps

超快模式(Ultra-Fast):5Mbps(单向传输)

提起不同速度的传输模式,读者首先想到的可能是指SCK的频率,这没有错,但是绝不仅限于此,为了获得更高的传输速率,除开芯片设计工程师外,电路的设计人员需要认真思考诸如“负载电容,上拉电阻的大小”等更偏向于电路设计或模拟设计的内容。

6.2 地址位宽

标准I2C:七位寻址

扩展I2C:十位寻址

每个主设备或者从设备都能对应一个唯一的地址,大多数情况下,7位的地址,已经够用了。但是也可以对其进行扩展,转变为10位地址,多出来的3位地址相当于提供了8倍潜在设备数量,同时,按照NXP2021版的I2C协议规定,10位地址的从设备,和7位地址的从设备,都可以挂在一个总线上,彼此相互兼容,不过,客观来讲,10位寻址的I2C不常用,7位寻址的I2C协议就足够大家日常使用了。

6.3 设备地址

每个主设备与从设备需要设置互不相同的七位地址或十位地址。

等等等等

七、I2C的仲裁机制

7.1 SCL同步问题

总线天生带线与逻辑,即总线的几个输入端,任意有一个拉低,总线表现为低电平,全部位高电平时,总线才是高电平,真值表如下所示。

6691d8a0-7d8d-11f0-a18e-92fbcf53809c.png

假设有两个主设备都想拉低SCL信号,Master1先拉低 ,Master2后拉低,那么SCL会按照CLK1的时间来拉低自身(线与逻辑的应用),而假如Master1先拉高,Master2后拉高,SCL又会按照CLK2的时间来拉高自身。

因此:当多个节点同时发送时钟信号时,在总线上表现的是统一的时钟信号。这就是SCL的同步原理

669b1154-7d8d-11f0-a18e-92fbcf53809c.png

7.2 SDA仲裁问题

设想一种多主设备,多从设备的情况

假如在空闲状态时,两个主设备先后想要操控I2C总线(相隔时间很短),I2C岂不是会发生错误(数据紊乱等),如何解决这个问题呢?

我们可以采取仲裁机制,同样应用到总线的线与逻辑,在箭头所指的位置,SCL上升沿到来,对SDA上的数据进行采样,结果为0,与DATA2上的数据0相同,与DATA1上的数据1不同,通过这种比较 Master1退出了对总线的控制,而Master2所发送的数据都是正确的,完成仲裁。

66b50758-7d8d-11f0-a18e-92fbcf53809c.png

原文链接:

https://blog.csdn.net/weixin_43698385/article/details/125094436

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    9443

    浏览量

    156112
  • 总线
    +关注

    关注

    10

    文章

    3014

    浏览量

    91287
  • uart
    +关注

    关注

    22

    文章

    1304

    浏览量

    106081
  • I2C协议
    +关注

    关注

    0

    文章

    29

    浏览量

    9097

原文标题:理解I2C协议

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    I2C协议以及I2C读写EEPROM

    2-3 数据有效性2-4 地址及数据方向2-5 响应三、STM32 的 I2C 架构剖析3-1 通讯引脚3-
    发表于 08-23 08:25

    I2C总线协议及其应用(图)

    I2C总线协议及其应用
    发表于 06-01 20:22 7210次阅读

    什么是i2c总线

    什么是i2c总线  下载请点击: i2c总线协议中文版 
    发表于 11-05 09:26 3164次阅读

    I2C总线协议及其应用

    I2C总线协议及其应用 一、I2C总线介绍: ---- 由于大规模集成电路技术的发展,在单个芯片集成CPU以及组成一个单独工作系统
    发表于 02-08 11:23 1736次阅读
    <b class='flag-5'>I2C</b>总线<b class='flag-5'>协议</b>及其应用

    I2C最新协议标准

    I2C最新协议标准,详细介绍了IIC信号要求,供大家参考,
    发表于 12-22 17:59 17次下载

    如何更加深入理解I2C总线、协议及应用

    更加深入理解I2C总线、协议及应用
    的头像 发表于 03-20 09:29 3917次阅读
    如何更加<b class='flag-5'>深入</b>理解<b class='flag-5'>I2C</b>总线、<b class='flag-5'>协议</b>及应用

    I2C系列的合集,可以系统学习I2C协议

    这篇文章给大家带来了I2C系列的合集,可以系统学习I2C协议。大家赶紧看看吧! 1、I2C总线:何时使用I2C缓冲器 本文讨论了使用
    的头像 发表于 09-23 15:28 3789次阅读

    STM32学习之I2C协议(读写EEPROM)

    关于STM32学习分享第七章 I2C协议(读写EEPROM)文章目录关于STM32学习分享前言二、代码1.i2c.c2.i2c.h3.main.c总结前言开始!开始!单片机的I2C
    发表于 11-30 15:21 34次下载
    STM32学习之<b class='flag-5'>I2C</b><b class='flag-5'>协议</b>(读写EEPROM)

    MPU6050的I2C通信协议

    不同硬件有不同的I2C协议
    发表于 12-06 12:21 3次下载
    MPU6050的<b class='flag-5'>I2C</b>通信<b class='flag-5'>协议</b>

    硬件I2C与模拟I2C

    配置;而软件I2C是没有寄存器这个概念的。 软件I2C一般是使用GPIO管脚,用软件控制SCL,SDA线输出高低电平,模拟i2c协议的时序。例如下面这段
    发表于 12-28 19:14 81次下载
    硬件<b class='flag-5'>I2C</b>与模拟<b class='flag-5'>I2C</b>

    一文看懂I2C协议

    电子行业最常用的3种串行通讯协议:UART、SPI和I2C。前面介绍了串口通讯协议及其FPGA实现,SPI协议。本篇文章介绍I2C通讯
    发表于 01-25 18:32 40次下载
    一文看懂<b class='flag-5'>I2C</b><b class='flag-5'>协议</b>

    深度剖析I2C总线协议

    I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来 产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一
    发表于 02-11 09:54 727次阅读

    使用I2C协议点亮OLED

    你好,我是爱吃鱼香ROS的小鱼。本节我们就尝试直接使用I2C协议来点亮OLED,因为主要测试I2C协议,所以对于复杂的显示处理部分小鱼就略过了,毕竟有方便的开源库使用,我们也不用那么纠
    的头像 发表于 07-15 16:47 3033次阅读
    使用<b class='flag-5'>I2C</b><b class='flag-5'>协议</b>点亮OLED

    I2C串行总线协议是什么?I2C总线有哪些优点?

    I2C串行总线协议是什么?I2C总线有哪些优点? I2C(Inter-Integrated Circuit)是一种串行总线协议,由Phili
    的头像 发表于 09-12 11:18 2807次阅读

    I2C总线协议的工作原理和寻址格式

    等特点,在嵌入式系统设计中得到了广泛应用。本文将详细介绍I2C总线协议的工作原理和寻址格式,帮助读者深入理解该协议
    的头像 发表于 05-27 15:47 3417次阅读