一文速通 IIC I2C子系统驱动 通信协议原理 硬件 时序 深度剖析

news/2024/12/22 19:06:26/

本文作为一个引入,作用是让读者理解熟知IIC协议关键内容,结合实际手册内容,深度解析协议本质,作为后续嵌入式linux驱动IIC子系统的一个铺垫。

目录

1. 硬件连接

IIC%E4%BC%A0%E8%BE%93%E6%97%B6%E5%BA%8F-toc" style="margin-left:0px;">2. IIC传输时序

2.1.写操作

2.2.读操作

I2C%E4%BF%A1%E5%8F%B7-toc" style="margin-left:40px;">2.3.I2C信号

IIC%E5%8D%8F%E8%AE%AE%E7%BB%86%E8%8A%82-toc" style="margin-left:0px;">3.IIC协议细节

IIC%E5%8D%8F%E8%AE%AE%E7%B1%BB%E6%AF%94%20SPI%E3%80%81UART-toc" style="margin-left:0px;">4.IIC协议类比 SPI、UART


1. 硬件连接

I2C在硬件上的接法如下所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻。(之前在我们的硬件篇有提到上拉电阻 还想系统性的了解上拉电阻的可以参考学习 接下来我们也会对IIC硬件中的上拉电阻进行分析)

由此我们可以得知以下信息,这些都是重点,读者需要牢牢记住。

同步、串行、半双工、多主机总线、近距离、低速、芯片与芯片之间的通信;

接口:两线制:SDA数据线、SCL时钟线 成本低

可以挂载多设备、主机是使用总线权利者、从机只可以听取从机、被主机管理;

 我们接下来就是分析下上拉电阻的问题了。

我们知道由于芯片在输出高低电平的时候,内部通常会有两个mos管(针对mos管的知识在硬件篇也有系统的讲 不懂的读者也可以回顾学习),上面的MOS管导通输出高电平,下方的MOS管导通输出低电平。

因此我们熟知IIC是需要多设备通信,假设我们把两个IO口都挂在到一个总线上,很简单的可以发现当一个芯片输出高电平,一个芯片输出低电平,此时就短路了,因此IIC对于设备的IO口做了一些阉割,去掉了上面的mos管,只保留下方的mos管,但是问题也暴露出来了,虽然解决了短路的问题,但是设备只可以输出低电平,另一种情况的电平就是未知的状态,浮空,为了避免这种情况,我们需要引入上拉电阻,这样完美了解决这个问题,同时也体现了IIC硬件设计的驱动能力。

同时我通过IIC手册对于IIC硬件设计规范图图例进行实例的调研,如下所示:

可以清楚的看出,正如我们先前总结的一样,这就是IIC的上拉电阻的作用。

IIC%E4%BC%A0%E8%BE%93%E6%97%B6%E5%BA%8F">2. IIC传输时序

2.1.写操作

流程如下:

  • 主芯片要发出一个start信号

  • 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)

  • 从设备回应(用来确定这个设备是否存在),然后就可以传输数据

  • 主设备发送一个字节数据给从设备,并等待回应

  • 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。

  • 数据发送完之后,主芯片就会发送一个停止信号。

下图:白色背景表示"主→从",灰色背景表示"从→主"

2.2.读操作

流程如下:

  • 主芯片要发出一个start信号

  • 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)

  • 从设备回应(用来确定这个设备是否存在),然后就可以传输数据

  • 从设备发送一个字节数据给主设备,并等待回应

  • 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。

  • 数据发送完之后,主芯片就会发送一个停止信号。

下图:白色背景表示"主→从",灰色背景表示"从→主"

I2C%E4%BF%A1%E5%8F%B7">2.3.I2C信号

I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。

  • 开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。

  • 结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

  • 响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA

  • SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化

I2C协议信号如下:

IIC%E5%8D%8F%E8%AE%AE%E7%BB%86%E8%8A%82">3.IIC协议细节

  • 如何在SDA上实现双向传输? 主芯片通过一根SDA线既可以把数据发给从设备,也可以从SDA上读取数据,连接SDA线的引脚里面必然有两个引脚(发送引脚/接受引脚)。

  • 主、从设备都可以通过SDA发送数据,肯定不能同时发送数据,怎么错开时间? 在9个时钟里, 前8个时钟由主设备发送数据的话,第9个时钟就由从设备发送数据; 前8个时钟由从设备发送数据的话,第9个时钟就由主设备发送数据。

IIC%E5%8D%8F%E8%AE%AE%E7%B1%BB%E6%AF%94%20SPI%E3%80%81UART">4.IIC协议类比 SPI、UART

特性I2CUARTSPI
通信方式多主多从同步通信全双工异步通信主从同步通信
通信线数2 条(SCL、SDA)2 条(TX、RX,可能附加GND)4 条(SCLK、MOSI、MISO、CS)
通信速率标准模式:100kbps;
快速模式:400kbps;
高速模式:3.4Mbps
通常 9600bps - 1Mbps通常最高几十Mbps,依设备支持而定
拓扑结构菊花链总线点对点主从结构,支持多从设备
总线仲裁支持,基于时序和逻辑(多主控制)不支持不支持
时钟信号由主设备提供不需要(内部分频产生波特率)由主设备提供
传输效率较高,支持多个从设备,但有协议开销较低,数据包中通常有起始位、停止位和校验位高,直接传输数据
硬件复杂性适中,依赖外部上拉电阻简单,仅需基本串口硬件较高,需额外的片选线和主控支持
多设备支持支持多个从设备(地址唯一)每个 UART 端口仅支持一对设备支持多个从设备(需独立片选信号)
全双工支持不支持(半双工)支持支持
数据传输可靠性较高,有 ACK/NACK 确认机制依靠硬件/协议,无确认机制较高,无明确协议确认机制
典型应用场景传感器(如温湿度、气压传感器)、EEPROM调试接口、低速外设通信高速外设(如显示屏、ADC、DAC)
易用性中等,需要配置设备地址简单,常用于调试与低速数据传输复杂,需要主控与从设备紧密配合

http://www.ppmy.cn/news/1557265.html

相关文章

中间件介绍

中间件是一种位于操作系统和应用软件之间的系统软件,它提供了数据交换、应用集成、流程管理和安全保障等服务。以下是中间件的一些基本概念和应用场景: 中间件的定义 中间件是一种独立的系统软件或服务程序,它位于操作系统和应用软件之间&…

字符串解析 Python Basic (工业设备通用语言)

Basic: 通过字符串的操作来进行数据解析。先按照字母将字符串分割,然后对每个部分取合适的子串以得到需要的值。 代码 s "X79.004Y73.0022U0.0108444ALL" parts [] start 0 for i in range(1, len(s)): if not s[i].isdigit() a…

方正畅享全媒体新闻采编系统 reportCenter.do Sql注入漏洞复现(附脚本)

0x01 产品描述: 方正畅享全媒体新闻生产系统是以内容资产为核心的智能化融合媒体业务平台,融合了报、网、端、微、自媒体分发平台等全渠道内容。该平台由协调指挥调度、数据资源聚合、融合生产、全渠道发布、智能传播分析、融合考核等多个平台组成,贯穿新闻生产策、采、编、…

类似于GitHub的平台

当然有类似于GitHub的平台,这些平台提供了类似的代码托管、版本控制、协作开发等功能。以下是不少于20个的类似GitHub的平台: GitLab: 自托管的Git存储库管理工具,提供代码托管、版本控制、问题跟踪、CI/CD等功能。支持自建部署&a…

flask-admin的modelview 实现list列表视图中扩展修改状态按钮

背景: 在flask-admin的模型视图(modelview 及其子类)中如果不想重构UI视图,那么就不可避免的出现默认视图无法很好满足需求的情况,如默认视图中只有“新增”,“编辑”,“选中的”三个按钮。 材…

qt 鼠标点击事件

大概就这几种, 按左键右键 void QtWidgetsApplication7::mousePressEvent(QMouseEvent *event) {//如果是鼠标左键按下if (event->button() Qt::LeftButton) {QCursor cursor;cursor.setShape(Qt::ClosedHandCursor);QApplication::setOverrideCursor(cursor)…

springboot java ffmpeg 视频压缩、提取视频帧图片、获取视频分辨率

用到的maven依赖&#xff1a; lombok依赖就不贴出来了 <dependency><groupId>org.bytedeco</groupId><artifactId>ffmpeg-platform</artifactId><version>4.3.2-1.5.5</version></dependency><dependency><groupId&…

电脑除尘更换cpu和显卡硅脂过程及安装win11系统中遇到的问题

原由 电脑是2022款的显卡TRX3050ti 的Y7000p,在使用过程中发现电脑风扇声音很大&#xff0c;想来也是用很久没有清理过灰尘了&#xff0c;在拆卸视频中发现一个换硅脂的&#xff0c;刚好手头有&#xff0c;想来也没换过&#xff0c;所以就直接换了。但修完后直接打开却出现了无…