基础通信协议之 IIC (I2C) 详细讲解

article/2025/6/24 7:52:59
IIC是当今嵌入式应用中最常见的串行通信协议之一。对比OneWire严苛的时序要求,SPI等更多的线缆要求,IIC处于一个折中的位置:不那么多的2根线缆的硬件要求,不那么复杂严苛的时序要求,便可进行多主多从的双向通信,小巧灵活方便,这使它广受欢迎。

目录

  • 一、简介
  • 二、主要特性
  • 三、硬件结构
    •  1. 总线结构
    •  2. 总线的拉高和拉低
  • 四、工作时序
    •  1. 数据有效性
    •  2. 开始和结束信号
    •  3. 重复开始信号
    •  4. 字节格式
    •  5. 应答信号
  • 五、7-bit 设备的数据传输
    •  1. 主机写-从机收,传输方向不变
    •  2. 主机读-从机发,传输方向改变
  • 六、10-bit 设备的数据传输
    •  1. 10-bit 设备的写
    •  2. 10-bit 设备的读

一、简介

  IIC(Inter-Integrated Circuit)是 IIC Bus 简称,中文叫集成电路总线。它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。自2006年10月1日起,使用I²C协议已经不需要支付专利费,但制造商仍然需要付费以获取I²C从属设备地址。
  IIC使用两根信号线进行通信:一根时钟线SCL,一根数据线SDA。IIC将SCL处于高时SDA拉低的动作作为开始信号,SCL处于高时SDA拉高的动作作为结束信号;传输数据时,SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递1位数据。


二、主要特性

  • IIC用2根信号线通信:串行数据线 SDA、串行时钟线 SCL
  • IIC总线上所有器件的SDA、SCL引脚输出驱动都为 开漏(OD) 结构,通过外接上拉电阻实现总线上所有节点SDA、SCL信号的线与逻辑关系;
  • 总线上的所有设备通过软件寻址且具有唯一的地址(7位或10位)。7位“从机专用地址码”,其高4位为由生产厂家制定的设备类型地址,低3位为器件引脚定义地址(由使用者定义);10位地址不常见;
  • 任何时刻都只存在简单的主从关系,按数据传输的方向,主机可以是主发送器或主接收器;
  • 支持多主机。在总线上存在多个主机时,通过冲突检测和仲裁机制防止多个主机同时发起数据传输时存在的冲突;
  • IIC总线上所有器件都具有“自动应答”功能,保证数据传输的正确性; 主机和从机的区别在于对SCL的发送权,只有主机才能发送SCL;
  • IIC总线允许挂载最多的设备数量取决于总线上最大电容值,一般为400pf(Hs模式100pf)
  • IIC总线不仅广泛应用于电路板级的内部通信,还可以通过I2C总线驱动器进行不同系统间的通信; 支持传输速率包括:
模式速度
标准模式(Standard Mode)100kb/s
快速模式(Fast Mode)400kb/s
增强快速模式(Fast Mode Plus)1Mb/s
高速模式(High Speed Mode)3.4Mb/s
极速模式(Ultra-FastMode)5Mb/s

三、硬件结构

 1. 总线结构

  IIC使用两根信号线进行通信,要求两根线都使用 开漏输出接上拉电阻 的配置,以此实现总线上所有节点SDA、SCL信号的 线与 逻辑关系。
  Rp电阻的取值有一定的要求,太小会导致灌入电流过大,使’低’数据不稳定,甚至损坏端口;太大会导致信号上升缓慢,使得数据传输出错。在不同应用场景及供电电压下有不同的取值要求。

在这里插入图片描述
  线与 逻辑使得总线上不会出现数据冲突,实现了总线的仲裁控制。总线的控制权会交给最后一个输出低电平的设备,其它设备(输出高)通过检测总线上的电平状态(状态低),对比与自己输出状态不一致,则自动退出对总线的控制请求,从而防止了总线上的数据冲突。
  漏极开路/集电极开路的缺点是对于一个距离长的数据线,信号传输速率得不到有效保证。更长的走线对于输出驱动器表现为更大的容性负载,等效容性负载C和信号线的上拉电阻R构成RC振荡器。RC越大,意味着反射和振荡越强,从而影响总线的信号完整性。这也是I2C规范对总线电容值约束在400pf以内的原因。高速模式对信号完整性的要求更高,协议有定义相关SDA/SCL处理办法,以保证在数据线够长、速率够高时,信号完整性也可以得到满足。


 2. 总线的拉高和拉低

  下图展示了IIC总线拉低和拉高的过程。

  • 拉低:设备的逻辑电路控制FET打开,总线通过导通的FET连接到GND从而被拉低
  • 拉高:设备的逻辑电路控制FET关闭,总线通过上拉电阻Rp连接到VDD从而被拉高
    总线变化

四、工作时序

 1. 数据有效性

  IIC 的数据读取动作都在 SCL为高 时产生,SCL为低时是数据改变的时期,无论SDA如何变化都不影响读取。所以,传输数据的过程中,当SCL为高时,数据应当保持稳定,避免数据的采集出错。

在这里插入图片描述


 2. 开始和结束信号

   开始信号(START/S): SCL为高时,SDA从高到低的跳变产生开始信号
   结束信号(STOP/P)  : SCL为高时,SDA从低到高的跳变产生结束信号
在这里插入图片描述


 3. 重复开始信号

   重复开始信号(ReSTART/Sr): 在结束时不给出STOP信号,而以一个时钟周期内再次给出开始信号作为替代


 4. 字节格式

   SDA数据线上的每个字节必须是8位,对于每次传输的字节数没有限制。每个字节(8位)数据传送完后紧跟着应答信号(ACK,第9位)。数据的先后顺序为:高位在前

在这里插入图片描述


 5. 应答信号

  协议规定数据传输过程必须包含应答(ACK)。接收器通过应答告知发送的字节已被成功接收,之后发送器可以进行下一个字节的传输。主机产生数据传输过程中的所有时钟,包括用于应答的第9个时钟。发送器在应答时钟周期内释放对SDA总线的控制,这样接收器可以通过将SDA线拉低告知发送器:数据已被成功接收。
  应答信号分为两种:
    1)当第9位(应答位)为 低电平 时,为 ACK  (Acknowledge)   信号
    2)当第9位(应答位)为 高电平 时,为 NACK(Not Acknowledge)信号
  主机发送数据,从机接收时,ACK信号由从机发出。当在SCL第9位时钟高电平信号期间,如果SDA仍然保持高电平,则主机可以直接产生STOP条件终止以后的传输或者继续ReSTART开始一个新的传输
  从机发送数据,主机读取数据时,ACK信号由主机给出。主机响应ACK表示还需要再接收数据,而当主机接收完想要的数据后,通过发送NACK告诉从机读取数据结束、释放总线。随后主机发送STOP命令,将总线释放,结束读操作。
在这里插入图片描述


五、7-bit 设备的数据传输

  一个完整的7-bit通信过程如图所示:

在这里插入图片描述
  在START信号后的首字节由7位从机地址和1位读写位组成,结构如下图:
在这里插入图片描述

  发送完这个字节之后,主机释放SDA总线等待从机给出ACK应答。如果从机给出了ACK应答,表示从机地址正确(有从机响应)并且已知晓是读还是写,便可以开始读写数据。如果从机没有给出ACK应答,则说明接收设备可能没有收到数据(如寻址的设备不存在或是设备正在忙碌)或无法解析收到的数据,如果是这样,则由master来决定如何处理(STOP或ReSTART)。


 1. 主机写-从机收,传输方向不变

  主机对从机发送数据时,主机对从机发送一个开始字节,然后即可一直发送数据。以示例来讲解,其第一帧数据为要操作的寄存器地址,所以为:“[1-Byte]开始字节(写) + [1-Byte]寄存器地址 + [1-Byte]寄存器数据”。

请添加图片描述

 2. 主机读-从机发,传输方向改变

  主机对向从机读取数据时,方式同发送数据有所不同,要多一次通信过程。
  主机需要先向从机发送一次信号,告诉从机”我要读取数据“,然后重开一次通信,等待从机主动返回数据。以示例来讲解,发送 “[1-Byte]开始字节(写) + [1-Byte]要读取的寄存器的地址”,之后结束通信,或者重开始,来进入到第二次通信中,先发送 [1-Byte]开始字节(读),然后等待读取从机发送过来的 [1-Byte]数据 即可。

请添加图片描述

六、10-bit 设备的数据传输

  随着IIC设备日益增多,7位的从机地址逐渐不能满足使用,于是从机地址从7位扩充到了10位。7位和10位地址的设备可以共存于同一个I2C总线系统互不冲突,展现了良好的兼容性。
  10-bit 地址的IIC设备需要 2-Byte 来传输从设备地址信息,所以采用了这样的设计:第一个字节为 1111 0 + 地址高两位(第10、9bit) + 读写控制位,第二个字节为从设备地址低8位,除此之外与7-bit设备相同。因为 “1111 0xx” 为 IIC 中特地保留的16个特殊指令地址中的一个,所以7-bit设备不会响应该首字节的呼叫,只有10-bit设备会响应,从而实现良好兼容。

 1. 10-bit 设备的写

  10-bit设备的写过程如下图示例,除地址部分外与7-bit相同。

请添加图片描述


 2. 10-bit 设备的读

  10-bit设备的读过程如下图示例,需注意的是,第二次通信过程无需再次发送第2Byte地址。

请添加图片描述


http://chatgpt.dhexx.cn/article/1hZ3U1dc.shtml

相关文章

IIC 通信协议 (二)

目录 引言 子模块设计 思路 单字节 IIC 发送模块 思路 Verilog 源码 多字节发送控制模块 思路 Verilog 源码 仿真 思路 test bench 仿真结果 参考声明 引言 本篇博文承接前文,继续做 IIC 通信协议 FPGA实现相关的内容。用Verilog 编写一个 IIC 通信控…

IIC通信协议(硬件实现IIC通信详解I)

IIC通信协议 什么是IIC协议协议层起始信号和停止信号数据的有效性 什么是IIC协议 I2C(Inter-Integrated Circuit)通讯协议是由 Phiilps 公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准…

详解通信协议之IIC通信协议

详解通信协议之IIC通信协议 本文结合AT24C02对IIC通信协议原理进行了描述。 IIC通信协议(以AT24C02为例) IIC通讯协议(Inter-Integrated Circuit)是由 Philips 公司开发双向同步半双工串行总线,只需要两根线(SDA、SCL)即可在连接于总线上的器件之间传…

IIC(I2C)通信协议详解

简介 I2C 是飞利浦公司设计的,一种很常见的总线协议, I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候 SCL 和 SDA …

IIC 通信协议

一、IIC 通信协议介绍 IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。 如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统…

三大通信协议(二):IIC通信协议

目录 1. 概念2. 硬件连接3. 数据传输协议3.1 开始信号3.2 地址位3.3 读写位(R/W)3.4 应答位(ACK / NACK)3.5 数据位(8Bit)3.6 停止信号 4. 软件编写4.1 初始化4.2 开始信号4.3 IIC发送一个字节数据4.4 IIC读…

IIC通信协议总结

(1)概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时…

IIC通信协议,搞懂这篇就够了

注:公众号后台发送 “IIC” 即可获取基于STM32上实现软件模拟IIC的完整代码。 I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于一主多从(一个主设备(Master),多个从设备…

IIC通讯协议

一、简介 IIC(Inter-integerted Circuit)集成电路总线,该通信协议由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场景下使用,传输距离短,任意…

搜狗搜索正式接入微信公众号

搜狗搜索正式接入微信公众号 6月9日中午消息,搜狗搜索今日宣布正式接入微信公众号数据。用户将在搜狗搜索页面查询和浏览微信公众号文章。 据悉,在搜狗搜索框中输入微信公众号关键词,便可在搜索结果页中查看相关微信公众号的文章列表&#xf…

Python爬虫 selenium自动化 利用搜狗搜索爬取微信公众号文章信息

少年最好的地方就是:虽然嘴上说要放弃,心底却总会憋着一口气。——刘同 文章目录 一、需求和网页分析二、selenium爬虫一、需求和网页分析 URL:https://weixin.sogou.com/ 你是否有特别喜欢的一些公众号文章,比如说关于网易云热评的。 我那么多遗憾,那么多期盼,你知道…

RSS订阅微信公众号初探-feed43

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

python爬虫爬取微信公众号历史文章链接

一、最近公司有了要爬取微信公众号文章链接的需求,之前最初接触爬公众号文章的时候,用的是搜狗微信,在这个上面可以搜到相关的微信公众号文章,但是这些链接是有时效性的,第二天链接就打不开了(不知道现在是…

python抓取搜狗微信公众号文章

初学python,抓取搜狗微信公众号文章存入mysql mysql表: 代码: import requests import json import re import pymysql# 创建连接 conn pymysql.connect(host你的数据库地址, port端口, user用户名, passwd密码, db数据库名称, charsetut…

搜狗微信文章采集php,[造轮子]爬取搜狗微信公众号文章

背景:想做一个公众号文章资源APP,发现搜狗有搜索公众号文章功能,果断开撸。http://wxiread.com (用CMS搭了个简易的站)。 Step1.分析栏目及接口 搜狗分了20个栏目,分别是 热门,推荐,段子手,养生堂,私房话… 对应地址从 /pcindex/p…

微信公众号的“温柔一刀”,搜狗微信搜索部分功能将被下线

作为搜狗的单一最大股东,腾讯与搜狗之间的联系向来就很紧密,其中包括搜搜被并入搜狗、微信公众号的搜索功能划分给搜狗、腾讯新闻、QQ浏览器等腾讯系产品的搜索功能全部换成搜狗。腾讯对搜狗的支持是显而易见的,但若有利益冲突的情况下&#…

【scrapy爬虫】最新sogou搜狗搜索 机智操作绕过反爬验证码(搜狗微信公众号文章同理)

前情提要 此代码使用scrapy框架爬取特定“关键词”下的搜狗常规搜索结果,保存到同级目录下csv文件。并非爬取微信公众号文章,但是绕过验证码的原理相同。如有错误,希望大家指正。 URL结构 https://www.sogou.com/web?query{关键词}&p…

利用搜狗抓取微信公众号文章

微信一直是一个自己玩的小圈子,前段时间搜狗推出的微信搜索带来了一丝曙光。搜狗搜索推出了内容搜索和公众号搜索两种,利用后者可以抓取微信公众号的最新内容,看了下还是比较及时的。 每个公众号都有一个openid,最早可以直接利用…

html语言判断水仙花数,水仙花数判断讲解

今天要讲解的这道题是 水仙花数判断 题目要求 本题要求实现一个函数,判断任一整数是否为水仙花数(必须是三位数,且数的每一位上数字的立方和与数本身相等)。例如1531^35^33^3112527153,而1或155则不是水仙花数。如果是水仙花数,则…

水仙花数的求解思路

目录 水仙花数输入一个数,求解从0到这个数的所有水仙花数 解题思路源代码:注意事项 水仙花数 在以前的博客之中写过求解水仙花数的博客 详情见下面链接: 求解水仙花数 在这里就主要写求解水仙花数的思路 输入一个数,求解从0到这…