当前位置: 首页 > news >正文

一文讲清楚I2C协议的“三生三世”

I2C(Inter-Integrated Circuit,集成电路间)是由飞利浦(Philips)公司开发的一种同步串行通信协议,核心特点是双线制、多主多从、简单可靠、低速率,广泛应用于嵌入式系统中短距离设备间通信(如传感器、EEPROM、LCD 模块、RTC 时钟等)。

1、 通信协议

1.1通信介质

仅需 2 根线:SDA:串行数据线,SCL:串行时钟线

均为双向 I/O,输出为开漏输出,需外接上拉电阻,通常 4.7kΩ~10kΩ,电源电压 3.3V/5V 兼容。

1.2数据传输方式

分为:单工、半双工、全双工通信。I2C属于半双工通信。

1.3 同步异步通信

I2C输出同步通信方式。UART属于异步通信。

同步通信: 发送端在发送串行数据的同时,提供一个时钟信号,并按照一定的约定(例如:在时钟信号的上升沿的时候,将数据发送出去)发送数据,接收端根据发送端提供的时钟信号,以及大家的约定,接收数据。如:I2C、SPI等有时钟信号的协议,都属于这种通信方式。

异步通信: 接收方并不知道数据什么时候会到达,收发双方可以有各自自己的时钟。发送方发送的时间间隔可以不均,接收方是在数据的起始位和停止位的帮助下实现信息同步的。这种传输通常是很小的分组,比如:一个字符为一组,数据组配备起始位和结束位。所以这种传输方式的效率是比较低的,因为额外加入了很多的辅助位作为负载,常用在低速的传输中。

1.4 数据传输过程

开始位:空闲状态下SDA和SCL为高电平。当主机开始传输数据时,执行下面动作:

  • 将SDA线由高电平切换成低电平;

  • 将SCL 线由高电平切换成低电平;

在 主设备发送 开始条件信号之后,所有从机即使处于睡眠模式也将变为活动状态,并等待接收地址位。

地址位:

地址支持7位地址和10位地址,常用的是7位地址的,10位地址的对应的从机数量可以达到1000多个,应用场景不多。

读写位:

由于I2C是半双工通讯,所以设备需要确定数据传输的方向,故引入了读写位。

  • 如果主设备需要将数据发送到从设备,则该位设置为 0;

  • 如果主设备需要往从设备接收数据,则将其设置为 1 ;

读写位由 主机发送 ;1表示读操作,0表示写操作。

应答位:

I2C最大的一个特点就是有完善的应答机制,从机接收到主机的数据时,会回复一个应答信号来通知主机表示“我收到了”。

应答信号: 出现在1个字节传输完成之后,即第9个SCL时钟周期内,此时主机需要释放SDA总线,把总线控制权交给从机,由于上拉电阻的作用,此时总线为高电平,如果从机正确的收到了主机发来的数据,会把SDA拉低,表示应答响应。

非应答信号: 当第9个SCL时钟周期时,SDA保持高电平,表示非应答信号。

非应答信号可能是主机产生也可能是从机产生,产生非应答信号的情况主要有以下几种:

  • I2C总线上没有主机所指定地址的从机设备;

  • 从机正在执行一些操作,处于忙状态,还没有准备好与主机通讯;

  • 主机发送的一些控制命令,从机不支持;

  • 主机接收从机数据时,主机产生非应答信号,通知从机数据传输结束,不要再发数据了;

数据位:

I2C数据总线传输要保证在SCL为高电平时,SDA数据稳定,所以SDA上数据变化只能在SCL为低电平时

一次传输的数据总共有8位,由发送方设置,它需要将数据位传输到接收方。发送之后会紧跟一个ACK / NACK位,如果接收器成功接收到数据,则从机发送ACK。否则,从机发送NACK。

数据可以重复发送多个,直到接收到停止位为止。

停止位:

当主设备决定结束通讯时,需要发送结束信号,需要执行以下动作:

  • 先将SDA线从低电压电平切换到高电压电平;

这里是因为每一次传输都跟着一个应答信号ACK,ACK应答是SDA信号为低,所以结束时SDA信号总是为低电平。(如果收到了NACK信号,SDA为高,这时怎么处理?)(主机控制SDA信号由高变低,然后再由低变高,满足协议的需求)

2、I2C应用

I2C通信协议只规定了通信的规则,具体读写时序是由满足I2C时序的从机设备决定的,不同的从机设备读写控制时序是不同的。下面给个读写时序的示例,

2.1写时序

向指定寄存器地址写入指定数据操作时序:

主机先发从机编码,选定从机,然后发送从机的寄存器地址,最后发送要写入的数据。

2.2 读时序

从指定寄存器地址读取数据操作时序:

http://www.jsqmd.com/news/542941/

相关文章:

  • Kali Linux下GitHack实战:从下载到CTF解题全流程(附常见错误排查)
  • SecGPT-14B案例分享:某能源企业OT网络异常通信行为识别过程
  • Fun-ASR-MLT-Nano-2512快速上手:Web界面操作,无需代码基础
  • nli-distilroberta-base垂直场景:政务问答系统中政策原文与市民提问关系判定
  • LFM2.5-1.2B-Thinking部署教程:3步实现Python爬虫数据智能处理
  • 大语言模型训练中的显存占用与优化方法简述
  • Java初学者项目需要哪些技术?
  • 【Selenium】并发实战:ThreadPoolExecutor如何让爬虫与测试效率倍增
  • 说一下Spring中的ApplicationContext和BeanFactory的区别?
  • 公司内部业务系统,其实无需专门开发,用免费低代码平台就够了
  • 路径规划:遗传、麻雀、狼群、粒子群与差分进化算法实战
  • 像素幻梦工坊实战落地:数字艺术教育机构像素创作课AI教具部署
  • 六(4)班新制度 (闲人勿进)
  • SEO_新手必看的SEO优化入门教程与核心方法(361 )
  • 解锁音乐自由:ncmdump突破格式限制的全场景解决方案
  • Qwen2.5-7B-Instruct效果展示:农业病虫害图像描述→防治方案生成
  • ZooNavigator实战:Docker与snap双模式部署指南
  • NaViL-9B部署稳定性报告:7×24小时双卡运行内存泄漏监测
  • SEO_避开这些常见误区,让你的SEO效果翻倍
  • UG/NX二次开发必备:C#和C++项目DLL自动签名与拷贝全攻略(附避坑指南)
  • 霜儿-汉服-造相Z-Turbo实战体验:输入一句话,秒获专属汉服少女AI写真
  • Qwen3-Reranker Semantic Refiner实操手册:错误日志分析与常见问题排查
  • CSP202512C. 图片解码 100分做法
  • 优化算法避坑指南:为什么你的梯度下降总跑出可行域?聊聊可行方向与投影的妙用
  • Ostrakon-VL-8B模型剪枝与量化入门:降低部署资源消耗
  • 如何用winget-install解决Windows软件安装难题?
  • DDColor季节变换:单图生成四季效果
  • YOLOv10镜像实测:一键部署,快速体验无后处理目标检测
  • 基于springboot框架的课程实验教学项目管理系统的设计与实现
  • ContextMenuManager:3个步骤快速清理Windows右键菜单的终极工具