I²C简介
前言
I²C(Inter-Integrated Circuit, 内置集成电路)总线是由Philips公司(现属于恩智浦)在上世纪80年代开发的两线式串行通信总线,用于连接微控制器及其外围设备,控制设备之间的通信。
I²C总线的物理拓扑示意图如下:

组成I²C总线的两个信号为时钟SCL(Serial Clock)和数据线SDA(Serial Data)
- SCL: 串行时钟线,用于同步信号
- SDA: 串行数据线,用于数据的双向传输
I²C仅仅使用SCL、SDA这两根信号线,就可实现在连接于总线上的器件之间的数据交互,极大简化了对硬件资源和PCB板布线空间的占用。
I²C通信只有一根SDA数据线用来传输通信数据,在同一时间只能是由一方单向传输给另一方的,而不能双方同时发送,所以I²C通信是半双工通信模式。
并且I²C采用主从模式,其中发起和控制通信的叫做主设备(Master),主导整个通信过程,响应主机指令的设备叫做从设备(slave)。I²C总线上的设备都可以作为主机或从机,举一个例子:
假设有一个名叫环境检测器的传感器和一个微控制器(MCU),两者之间通过I²C总线连接,在不同场景下,它们之间主机和从机的角色可能互换:
- 正常操作模式下,MCU定期去读取传感器数据(温度、湿度),这时候MCU作为主机,主动发起通信请求,向传感器读取数据;传感器作为从机,响应请求并返回数据
- 紧急事件模式下,传感器检测到异常的值(比如温度过高),需要立即通知MCU, 这时候传感器作为主机,主动向MCU发起通信请求;而MCU就扮演从机的角色,接收传感器传来的信号,并触发紧急处理程序
一. I²C总线协议
了解了I²C总线的物理设计,以及主设备和从设备的概念后,接下来就可以看一下I²C的通信过程是怎样的。一个完整的I2C通信过程包括如下几个步骤:
- 主设备发送一个起始信号;
- 主设备接着发送8bit数据,其中7位是从设备的地址,一位表示此次主设备是要读数据还是写数据;
- 和主设备发送的地址匹配的从设备发出一个ack响应信号;
- 主/从设备将数据发送到SDA总线上,每次传输都是8bit数据;
- 主/从设备从SDA线上接收数据,并发送一个ACK响应信号;
- 还可以接着n个发送和接收的过程;
- 主设备发送停止信号,停止本次通信;
接下来看一下上面讲述的通信过程,在时序上时如何体现的
1. 空闲状态
总线空闲时,上拉电阻使SDA和SCL线都保持高电平。

2. 起始\停止
2.1 开始位
I²C协议规定,总线上的数据传输必须以一个起始信号为条件,这个信号由主设备产生,叫做开始位,它是当SCL稳定在高电平时,主机将SDA线由高电平切换到低电平(即生成一个下降沿)产生的。

主设备通过将SDA线从高电平切换到低电平,再将SCL线从高电平切换到低电平,来向每个连接的从机发送启动条件,这样做是为了唤醒总线上的空闲节点器件。起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I²C器件无法访问总线。
2.2 停止位
反过来,I²C协议规定,当需要结束此次通信时,主设备(Master)会产生一个停止位作为传输的停止条件,它是当SCL处于高电平时,主设备将SDA由低电平切换到高电平(即上升沿)产生的。停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态,即SCL和SDA都处于高电平状态。

主设备通过将SDA线从高电平切换到低电平,再将SCL线从高电平切换到低电平,来向每个连接的从设备发送启动条件,这样做是为了唤醒总线上的空闲节点器件
3. 发送从设备地址
主设备发出起始信号后,总线上的所有从设备都在侦听它们的设备地址,以监听主设备这次是否要和自己通信,主设备接着会发送1字节(8bit)的地址信息,这个地址字节跟随在随后的时钟脉冲上,这8位信息中包含了两部分信息:

- 前7位为设备地址。用于指定主设备通信的对象地址,每个连接到总线上的设备都有唯一的地址,以确保不同设备之间访问的准确性,处于监听状态下的从设备会响应并激活内部电路完成初始化操作准备接收或发送数据。
- 最后1位为读\写标志。用于指定SDA上数据的传输方向。此位为0的话,表示主设备写数据,即由主设备向从设备发送数据,从设备接收数据;此位为1的话,表示读数据,即由从设备向主设备发送数据,主设备接收数据。
找到地址匹配的从机继续侦听最后一位(即读\写位),以确认主设备是要从从机读取数据还是向从机写入数据。
随着I²C设备数量越来越多,7bit的地址逐渐不够用了,于是从机地址由7bit扩展到了10bit,并且同一条I²C总线上可以同时兼容7bit和10bit地址的设备。
10-bit 地址的I²C设备需要 2个字节 来传输从机的地址信息,10bit的地址设计如下

其中第一个字节为 1111 0 + 地址高两位(第10、9bit) + 读写控制位,第二个字节为从设备地址低8位,因为 “1111 0xx” 为 I²C中特地保留的16个特殊指令地址中的一个,所以7-bit设备不会响应该首字节的呼叫,只有10-bit设备会响应,从而实现良好兼容。
4. 从设备响应(ACK\NACK)
I²C总线一个重要的特点就是有应答机制,或响应机制,当一方向另一方发送了一帧数据,这无论是当前说的这个地址帧,还是后面要提到的数据帧,另外一方都会给出一个回应,表明自己是否有成功接收到对方传来的这帧数据,根据回应的结果不同,分为ACK和NACK两种。
4.1 ACK
I²C总线上的每个从设备接收到主设备的地址帧后,会将主机发送的地址与自己的地址进行比较,地址匹配的那个从设备会回复一个应答信号来通知主设备表示“我收到了”,这个信号叫做ACK(是Acknowledge的简写)信号,如前面的时序图所示,这个ACK信号出现在地址帧(1个字节)传输完成之后,即第9个SCL时钟周期内产生的。
细节一点描述的话,就是主设备在发送完地址帧后,此时主设备需要释放SDA总线,即把总线控制权交给从设备,由于上拉电阻的作用,把总线拉为高电平,如果从设备正确的收到了主设备发来的地址帧,就会在接下来这个始终周期里把SDA拉低,表示应答响应,即产生ACK应答信号。
4.2 NACK
与ACK相反,NACK(Not Acknowledge)信号用于指示接收方未能成功接收到数据字节。具体来说,在SCL为高电平时,如果SDA被拉高,则表示NACK信号。这意味着当发送方发出的数据字节未得到接收方确认时,接收方会在第9个时钟周期内将SDA线保持为高电平,以此来传达NACK信号,表明接收端不接受当前传输的数据字节。
5. 传输数据
主设备检测到来自从设备的ACK位之后,主\从设备就可以根据前面地址帧的读\写位决定的数据传输方向,准备第一帧数据的传输了。
- 发送方将数据发送到SDA总线上,每次传输都是1字节的数据,从MSB(Most Significant Bit,最高有效位) 开始传输;
- 接收方从SDA线上接收数据,并在SCL的下一个时钟周期,发送一个ACK\NACK响应信号;虽然ACK和NACk是在前面从设备响应那一节提到,但它其实不只限用于从设备响应地址帧,也会用于数据传输过程中接收方响应发送方:发送端将SDA总线拉高,然后释放总线的控制权,如果接收端在第9个周期将SDA拉低,就是发出了ACK信号;如果在第9个周期SDA一直是高电平,则代表没有发出ACK信号,即NACK。
- 还可以接着N个这样的发送和接收的过程;
整个的数据传输时序图如下图所示:

小结
整个I²C总线的通信可以简化成如下这样子

另外还有一点就是,除了起始信号和停止信号外,在SCL为高电平期间,SDA线上的数据必须保持稳定,只有当SCL为低电平期间,SDA线上的数据才可以发生变化。
二. 仲裁机制
前面介绍了 I²C总线上两个设备之间的通信,但 I²C总线上往往挂载有多个设备,如果有两个及以上的设备都同时向总线发送起始信号,并启动传输,这样就形成了冲突,这时就需要一个机制来防止数据损坏和确保只有一个设备能够成功控制主线并传输数据,这个机制就是总线仲裁机制。
总线仲裁机制的基本原理:
- “线与”逻辑。“线与”逻辑是指两个或两个以上的输出直接互连就可以实现“与”的逻辑功能,I²C总线上任意器件输出低电平都会使相应总线上的信号线变低,而此时,发送高电平的设备就会失去仲裁。
- SDA回读机制。总线被启动后,每个参与争用总线的主设备会在发送每一位之后检查SDA线上实际存在的电平状态,检测的电平与自己发出的电平一致,就会继续占用总线,并发送下一位数据;如果不一致,比如某个主设备想要写入高电平(逻辑1),却发现SDA被其它节点拉到了低电平(逻辑0),那么这个主设备就会意识到自己失去了此次争夺,并立即停止继续发送后续的数据。
举一个例子:
假设有两个主机Host1和Host2,它们同时尝试启动总线传输,假设Host1要发送的数据为“101....”, Host2要发送的数据位“100”。
在前两位数据时,两个主机发送的都是“10”,因此总线上呈现的电平与两个主机发送的都一致,仲裁继续进行;但是在第三位数据时,Host1发送的是1,Host2发送的是0,由于总线具有“线与”功能,最后SDA上呈现的电平会是0,此时Host1检测到总线上呈现的电平跟自己发送的数据是不一致的,因此Host1退出竞争,放弃对总线的控制权,而Host2则继续发送数据,因为它发送的数据与总线上呈现的电一致。

所以,Host2赢得了仲裁,成为总线的唯一控制者,并继续发送剩余的数据,Host1则需要等待下一次机会再尝试占用总线。这个过程确保了I²C总线上多个主机之间的有序通信,避免了数据冲突和破坏。同时由于仲裁机制是逐位比较的,因此也不会丢失任何信息。
三. I²C设备的内部结构
I²C设备的内部结构示意图如下

- PCLK是I²C总线SCL的时钟来源。PCLK_PSYS是系统时钟,I²C内部经过分频后得到I²C控制器的时钟,主设备会通过SCL线将时钟信号传给从设备。
- I²C总线的控制单元里面有两个重要的寄存器:I²CCON和I²CSTAT。控制单元会对PCLK_SYS时钟信号进行两级分频,产生通信需要的时序信号:实际编程中要发送起始位、停止位、接收ACK等都是通过这两个寄存器(背后所代表的电路模块)实现的
- Address Register和Comparator是当设备作为从设备时会用到,Address Register保存的是自己作为从设备的地址,Comparator是比较器,比较此次I²C设备收到的地址是否与自己的地址相等,如果相等就表示主设备是要和自己进行通信,如果不等,就不用理会此次通信
- Shift Register和I²CDS: I²CDS是保存接收/发送的数据,Shift Register是移位寄存器,如果当前设备是发送模式,则Shift Register负责将I²CDS寄存器里的数据一位一位地发送到SDA总线上;或者反过来,如果当前设备是接收模式,则Shift Register将SDA上的数据一位一位地存到I²CDS总线上。
四. 总结&补充
简单总结一下I²C总线协议,I²C总线两线式串行通信总线,采用主从模式,通信双方按角色分为主设备和从设备,它们的定义和功能如下:
- 主设备(Master)
定义:发起和控制通信的设备
职责:
- 生成时钟信号(SCL)
- 发起start条件(开始位)
- 发送从机地址(7bit/10bit)
- 控制数据传输方向
- 终止通信的stop条件
- 处理总线仲裁
2. 从设备(slave)
定义:响应主机指令的设备
职责:
- 监听总线上的自身地址
- 通过ACK/NACK响应主机
- 根据主机指令进行数据的发送和接收
I²C总线特点:
- I²C总线简单有效,在电路板上占用的空间很小
- 芯片引脚数量少,设计成本低。
- 串行。I2C属于串行通信,所有的数据以位为单位在SDA线上串行传输。
- I²C总线支持多主控模式。任何能够进行发送和接收的设备都可以成为主设备。
- 冲突和仲裁。多主控模式下,能够处理多个主设备尝试控制总线的情况,通过仲裁机制决定哪个设备获得控制权。在任意时刻只能有一个主控,主控能够控制数据的传输和时钟频率
- 同步通信。就是通信双方工作在同一个时钟下,数据传输由时钟信号控制,确保数据传输的同步性
- 低速率。 I²C一般是用在同一个板子上的2个IC之间的通信,而且用来传输的数据量不大,所以本身通信速率很低。一般有这4种模式:标准模式(100kbit/s)、快速模式(400kbit/s)、高速模式(3.4Mbit/S)和超快速模式(5Mbit/s),当然实际中还是具体要看设备是否有支援到这些规格。
- 半双工通信。因为 I²C通信只有一个SDA数据线用来传输通信数据,所以一个通信周期只能是由一方发送给另一方,而不能双方同时发送,所以是半双工通信模式。
- 数据应答机制。带有应答(ACK)和非应答(NACK)信号,确保数据传输的可靠性。
- 字节格式。每次传输数据都是以1字节(8bit)为单位,加上开始位和停止位以及可选的应答位。
相关文章:
I²C简介
前言 IC(Inter-Integrated Circuit, 内置集成电路)总线是由Philips公司(现属于恩智浦)在上世纪80年代开发的两线式串行通信总线,用于连接微控制器及其外围设备,控制设备之间的通信。 IC总线的物理拓扑示意…...
Spring容器扩展点
Spring容器扩展点 BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessorImportSelectorImportBeanDefinitionRegistorBeanPostProcessorInstantiationAwareBeanPostProcessor--postProcessBeforeInstantiationSmartInstantiationAwareBeanPostProcessor--determineCan…...
spring boot知识点3
1.spring boot能否使用xml配置 可以,但是很繁琐,现在都建议走JavaConfig 2.spring boot的核心配置文件 application.properties application.yml 3.bootstrap.properties和application.properties的区别 b:用于远程配置 a:…...
Linux后台启动命令nohup并且MobaXterm后台启动断网也不关闭软件
nohup主要作用就是可以在后台运行,并可以选择将日志输出到指定文件。如启动一个程序,若使用./demo的方式启动程序当窗口关闭的时候程序也停止了,而且日志会直接输出到控制台非常不直观,nohup启动就可以解决这两个问题。 nohup与&…...
C++(23):unreachable
C++23在头文件 "><utility>定义了std::unreachable(),用于指示编译器,该段代码不应该被允许,因此编译器可以对该位置进行优化,如果一旦允许了该位置的代码,行为未定义: #include <utility> #include <iostream>using namespace std;int func(…...
【Vue+python】Vue调用python-fastApi接口实现数据(数值、列表类型数据)渲染
前言:之前做的一直都是SpringBootVue的应用,但现在需要实现一个能将python实现的算法应用展示在前端的界面。想法是直接Vue调用python-fastApi接口实现数据渲染~ 文章目录 1. 变量定义2. axios调用python3. 跨域问题解决4. 数据渲染4.1 数值数据渲染4.2 …...
构建高效智能对话前端:基于Ant Design X 的deepseek对话应用
文章目录 实现的效果前言Ant Design X添加欢迎组件创建对话气泡存储对话历史渲染对话气泡 输入组件WebSocket 连接总结 实现的效果 待机页面: 等待页面: 完成页面: 前言 随着人工智能技术的飞速发展,大模型对话系统已成为…...
四元数如何用于 3D 旋转(代替欧拉角和旋转矩阵)【ESP32指向鼠标】
四元数如何用于 3D 旋转(代替欧拉角和旋转矩阵) 在三维空间中,物体的旋转可以用 欧拉角、旋转矩阵 或 四元数 来表示。 四元数相比于欧拉角和旋转矩阵有 计算更高效、避免万向锁、存储占用少 等优点,因此广泛用于 游戏开发、机器…...
Cloud: aws:network: limit 含有pps这种限制
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshooting-ena.html#statistics-ena 这个是调查网络问题的一个网页; 在里面,竟然含有pps这种限制:ethtool -S;其实是比较苛刻的安全相关的策略? [ec2-user ~]$ ethtool -S ethN NIC statistics:tx_timeout: …...
Python MoviePy 视频处理全攻略:从入门到实战案例
第1章 环境安装与配置 # 案例1:安装MoviePy及FFmpeg !pip install moviepy # Windows安装FFmpeg:https://ffmpeg.org/download.html # Linux: sudo apt-get install ffmpeg# 验证安装 from moviepy.editor import * print("MoviePy版本:", __…...
数据结构之BST、AVL、红黑树、哈夫曼树与B族树
数据结构之BST、AVL、红黑树、哈夫曼树与B族树 数据结构之BST、AVL、红黑树、哈夫曼树与B族树一、二叉搜索树(Binary Search Tree, BST)1. 什么是二叉搜索树?重要性质 2. 二叉搜索树实现1. 节点结构定义2. 核心操作接口3. 插入算法实现4. 删除…...
开源多商户商城源码最新版_适配微信小程序+H5+APP+PC多端
在数字化时代,电子商务已经成为各行业不可或缺的一部分,开源多商户商城源码为中小企业和个人开发者提供了快速搭建和定制电商平台的利器。分享一款最新版的开源多商户商城源码,它能够适配微信小程序、H5、APP和PC等多个端口,满足商…...
第3章 .NETCore核心基础组件:3.1 .NET Core依赖注入
3.1.1 什么是控制反转、依赖注入 杨老师在书中进行了一系列的文字阐述,总结一下就是:软件设计模式中有一种叫做【控制反转】的设计模式,而依赖注入是实现这种设计模式的一个很重要的方式。也就是说学习依赖注入,是学习怎样实现控…...
cesium基础设置
cesium官网下载:https://cesium.com/downloads/ 1.安装cesium 选择下载到本地使用,或者通过npm下载到项目中 2.代码书写 (1)创建容器 <div id"cesiumContainer" style"width: 100%; height: 100%"><…...
Spring-GPT智谱清言AI项目(附源码)
一、项目介绍 本项目是Spring AI第三方调用整合智谱请言(官网是:https://open.bigmodel.cn)的案例,回答响应流式输出显示,这里使用的是免费模型,需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…...
文件夹上传到github分支最后github上面还是没有文件和文件夹
环境: github 问题描述: 文件夹上传到github分支最后github上面还是没有文件和文件夹, 和这样一样 解决方案: 从 git ls-tree -r HEAD 的输出中可以看到,metahuman-stream 文件夹显示为如下内容: 160000 commi…...
面试题之箭头函数和普通函数有什么区别?
箭头函数(Arrow Function)和普通函数(Regular Function)是 JavaScript 中两种不同的函数定义方式,它们在语法、上下文(this)、原型链等方面存在显著区别。以下是它们的主要区别: 1. …...
【文献精读】AAAI24:FacetCRS:打破对话推荐系统中的“信息茧房”
标题FacetCRS: Multi-Faceted Preference Learning for Pricking Filter Bubbles in Conversational Recommender System期刊The Thirty-Eighth AAAI Conference on Artificial Intelligence (AAAI-24)年份2024关键词Conversational Recommender System (CRS), Filter Bubbles,…...
[vs2017][qt]MSB4019 未找到导入的项目QtMsBuild\Qt.prop
问题场景: vs2017qt5.9.9新建vs项目报错MSB4019 未找到导入的项目QtMsBuild\Qt.prop 报错解决方案: 由QtMsBuild导致的问题不需要像其他博客里说的那样各种环境变量配置,以及大费周章去查看一些系统的东西。 第一步: 只需要将…...
网络安全推荐的视频教程 网络安全系列
第一章 网络安全概述 1.2.1 网络安全概念P4 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。 1.2.3 网络安全的种类P5 (1…...
什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用
什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用 目录 什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用Embedding(嵌入)RAG(检索增强生成)Function calling(函数调用)Pr…...
基于Python的深度学习音乐推荐系统(有配套论文)
音乐推荐系统 提供实时音乐推荐功能,根据用户行为和偏好动态调整推荐内容 Python、Django、深度学习、卷积神经网络 、算法 数据库:MySQL 系统包含角色:管理员、用户 管理员功能:用户管理、系统设置、音乐管理、音乐推荐管理、系…...
长文档处理痛点:GPT-4 Turbo引文提取优化策略与替代方案讨论
引言 随着GPT-4 Turbo的发布,其支持的128K上下文窗口(约300页文本)被视为处理长文本的突破性升级。然而,实际应用中,用户发现模型在提取长文档中的引文时存在显著缺陷:文档前三分之一的引文数量远多于中间…...
javacv将mp4视频切分为m3u8视频并播放
学习链接 ffmpeg-demo 当前对应的 gitee代码 Spring boot视频播放(解决MP4大文件无法播放),整合ffmpeg,用m3u8切片播放。 springboot 通过javaCV 实现mp4转m3u8 上传oss 如何保护会员或付费视频?优酷是怎么做的? - HLS 流媒体加密 ffmpe…...
Swagger 转 Word 技术方案
项目概述 本项目旨在提供一种便捷的工具,将 Swagger API 文档转换为 Word 文档,方便开发人员和团队进行文档管理和分享。通过简单的配置和操作,用户可以快速生成包含 API 接口信息、请求参数、返回参数等内容的 Word 文档。 技术架构 本项目基于 Java 开发,采用 Spring …...
MVTEC数据集笔记
前言 网上的博客只有从论文里摘出的介绍,没有数据集文件详细的样子,下载数据集之后,对数据集具体的构成做一个补充的笔记。 下载链接:https://ai-studio-online.bj.bcebos.com/v1/7d4a3cf558254bbaaf4778ea336cb14ed8bbb96a7f2a…...
[数据结构]红黑树,详细图解插入
目录 一、红黑树的概念 二、红黑树的性质 三、红黑树节点的定义 四、红黑树的插入(步骤) 1.为什么新插入的节点必须给红色? 2、插入红色节点后,判定红黑树性质是否被破坏 五、插入出现连续红节点情况分析图解(看…...
国家地理信息公共服务平台的天地图
文章目录 一、国家地理信息公共服务平台的天地图二、地图转换1.GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)2.读入数据 总结 一、国家地理信息公共服务平台的天地图 三大地图付费后,仍可…...
【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析⑤】
ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase05 作者:车端域控测试工程师 更新日期:2025年02月15日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-005测试用例 用例ID测试场景验证要点参考条款预期…...
JavaScript中字符串的常用方法
JavaScript中字符串的常用方法 1.查询类2.拼接3.截取4.大小写5.去掉空格6.重复7.填充8.分隔9.模版匹配方法 可以通过查看String对象的原型来看有哪些方法: console.dir(String.prototype)1.查询类 charAt(index):返回指定位字符 console.log("abc".charAt(1));//b…...
