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

I2C基础知识

引言

      这里祝大家新年快乐!前面我们介绍了串口通讯协议,现在我们继续来介绍另一种常见的简单的串行通讯方式——I2C通讯协议


一、什么是I2C

        I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司在上个世纪80年代开发的,其英文翻译过来实际上是【内部集成电路】,所以他就是为内部集成电路与其他各种模块进行简单的串口通讯设置的这样一个协议

关于I2C的叫法,简单说明一下:

       根据英文缩写,应该是写成IIC,不过通常我们读的时候会把两个I读成I2(I的平方的意思,标准写法的2应该是在I的右上角)。之所以平时描述时直接写I2C,主要是因为打角标相对麻烦,所以就出现这样的写法。当然了,字母旁边跟着的“2”一般是表示“to”,所以很多时候会看见比如【P2P】这样的写法,这其实就是【Point to Point点对点】的意思。同时有些老外也会直接叫“I to C”,主要原因还是因为“I方C”说起来的话那个平方square念起来比较长,显得麻烦,所以为了简单就直接叫I to C了,所以关于I2C的叫法主要会存在这两种说法。

       总的来说,关于I2C的叫法标准来说就是“I方C”,叫“I2C”相对显得没那么准确,也问题不大


二、I2C有什么特点

       I2C主要优点是引脚少、硬件单路实现比较简单、可扩展性强,其通讯相对来说还是非常稳定的。后来飞利浦公司将其知识产权完全放开,任何人都能随意使用,成为了一个通用的通讯协议。不需要 USART、CAN等通讯协议的外部收发设备,加之其简单易用等特点,因此现在被广泛的使用在系统内多个集成电路(IC)间的低速串行通讯当中。

I2C是一种简单的双向两线制总线协议标准,支持同步串行半双工通讯。也就是说I2C通讯使用两根线实现数据的传输;同时他是双向的,既可以收,也可以发。由于其支持的是同步通讯,因此两根线中必有一根是时钟信号线,因此只有一条线进行数据的收发,因此其只能支持串行半双工通讯,这也是I2C通讯与串口通讯的一个显著区别。

三、I2C通讯的速度如何

       I2C通讯其在标准模式下的传输速率为100kbit/s快速模式下传输速率为400kbit/s高速模式下可达到3.4Mbit/s,目前大多I2C设备上不支持高速模式。

可见,I2C通讯的速度实际上也比较慢,毕竟其硬件简单,对比串口通讯,前面设置的波特率一般是115200,也就是115.2,速率也差不多,最快的是450,理论上串口还会比I2C快一点点,当然也都快的有限,所以他们都算是一种低速串行通讯。所以I2C的硬件可能会更简单,而串口通讯可能还相对复杂一点,主要是因为其同时又要收又要发,所以有一个通用的异步收发器UART在里面。

四、I2C的物理层

这里,我们来了解一下I2C的物理层,看看其硬件设备到底是如何进行设计的。

1、两种总线

先介绍两种总线,分别是SCL和SDA

SCL:Serial CLock,串行时钟总线,用于数据的收发同步

SDA:Serial DAta,串行数据总线,用高低电平表示数据

2、通讯设备的连接

        知道了使用的两根线,那么设备他是怎么连接的呢?前面介绍串口通讯时我们知道,串口两根线连接设备时是点对点的连接,有一个对应关系。而这里I2C通讯我们就一根数据线SCL,很显然我们这里将会把各种设备挂在一根线上,进行数据的收或发。

       如上图,也就是说,这实际上是一种总线连接的传输方式。也就是我们可以在SCL时钟线和SDA数据线之间挂载多个I2C通讯设备。当然了,所有的这些I2C设备就相当于电路上的一种并联的方式将通讯设备连接在了总线上。

       其可以连接多个I2C设备,其中多个设备中必须要有一个主设备,另外其他的可以是从设备。同时I2C通讯协议支持一主多从,也支持多主多从

这里简单解释一下,什么叫主从设备?

主从设备是指总线上连接的设备,按其对总线有无控制功能可分为主设备和从设备两种。


主设备,英文名Master,主人,起到一个控制的作用。这里主要是控制时钟信号,相当于跑步时喊121的人,控制一个整体的节奏。

从设备,就相当于是听指令的人,主从设备相当于一种主仆关系

这里有一个疑问:如果多个设备同时要收发数据的话,全部在总线上进行,那数据不会乱吗?

实际上,为了避免这种问题,我们I2C通讯协议规定,为了区分不同的设备,每个设备都会有一个唯一的地址,主设备会通过这个地址来与相应的从机进行通讯。然后总线连接方式下,我们使用的工作模式应该是开漏输出,默认会处于一个高阻态,这时候就需要在外面接一个上拉电阻。

还有一个疑问:如果现在有多个主设备和从设备之间要进行数据的传递,全都要占用总线,那怎么办呢?

       首先,总线是不能直接让所有的设备都占用的,所以默认情况下总线会处于高阻态。总线通过上拉电阻接到电源。设备空闲时,输出高阻态;当所有设备都空闲时,都输出高阻态时,由上拉电阻把总线拉成高电平。

       当总线上有一个设备为0,就相当于设备接地,这时候整个数据总线上就都会被接地拉低,置为0,告诉数据总线上的其他所有设备该设备将要占用总线,然后就开始输出数据。

一般情况下,主从设备是不能占用时钟信号线的

       但在特殊情况下,也可以往时钟线上输出0:在STM32的I2C模块中有一个特殊的功能——时钟扩展,即在I2C的主从通信过程中,总线上的SCL时钟总是由主机来产生和控制的,但如果从机跟不上主机的速率,I2C协议规定:在开启时钟延展功能后,从机可以通过将SCL时钟线拉低来暂停一个传输的,直到从机释放掉SCL线,传输继续进行。

五、I2C的协议层

       为了了解I2C通讯的数据传输需要怎么做,具体怎么样规定要开始发送、结束发送、以什么样的方式进行传输,数据是否有效等等问题的答案,我们需要来看看关于I2C通讯的相关协议部分。

1、位传输

      前面提到,I2C通讯也是一种低速串行通讯方式。所以在数据传输方式上,作为串行通信,I2C时按照位进行传输,一般时高位先行。(与串口通讯是相反的)

2、起始信号

       知道数据时如何传输后,接下来我们就要讨论数据什么时候开始传输了。也就是当出现什么信号后,就预示着我们要开始进行数据传递了。

       由于在没有设备进行数据传递,也就是总线处于空闲时,总线上是处于高阻态,同时外接了上拉电阻接到电源,因此在没有发送数据传递时总线或者说SDA线上应该处于高电平。因此我们可以给SDA低电平作为开始发送数据传递的起始信号。当然了,为了保证起始信号的独特性,避免SDA线的低电平被视作一位数据,前提需要时钟线SCL是处于高电平,这样才能作为I2C通讯传递信号的起始信号。

简单来说,起始信号:SCL是高电平时,SDA线从电平向电平切换。  用start的S表示

3、停止信号

同理,停止信号就是SDA线由低电平又变成高电平,出现的上升沿信号。

即,停止信号:SCL是高电平时,SDA线从电平向电平切换。用stop的P表示

4、传输地址

       知道了什么时候进行或者结束数据传递后,我们当然就要开始进行数据传递了,这时候就会出现一个问题:我们和谁进行数据传递?此时就涉及到通讯设备的地址了。

       为了对应设备进行数据传递,主机会通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机。其中,I2C协议规定设备地址可以是7位或10位,实际中7位的地址应用比较广泛。可见,7位设备地址就可以有2^7种设备同时去进行通信,再不够可以扩展成10位,即2^10种设备同时进行数据传递。

       如上图所示,一般设备地址占7位,然后紧跟着的一个数据位用来表示数据传输方向,他是数据方向位(R/W),通常是第8位或第11位。其中,数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。

5、数据的有效性

       确定了设备地址,那就真的要开始进行数据传递了。这时候就会涉及到另一个问题:系统他不会随随便便把一个信号当做传递的数据,所以I2C协议规定了什么情况下的数据才是有效数据。

       I2C协议规定SDA线的高低电平状态只有在SCL时钟信号线处于低电平才能改变,同时SDA线上的数据必须在SCL时钟信号线处于高电平周期保持稳定

       也就是说,SCL线上处于高电平的时候,SDA线上的数据必须要保持稳定,相当于要做一个数据信号线的采样;如果此时SDA线上处于一个下降沿,就意味着要开始传递数据;如果此时SDA线上处于一个上升沿,就意味着要停止传递数据。然后SCL线处于低电平时,SDA线上才能进行电平转换。

6、响应

      I2C协议规定,当数据发送方发送数据以后,如果接收方收到了数据就必须给发送方一个响应(ACKnowledge),表示接收方收到数据了。

由上图可知,按照主机控制的时钟信号,每次时钟信号高电平时在数据信号线上进行数据采样,然后当数据线产生停止信号时表示数据传递结束,释放SDA线。此时接收方就要发出响应,这里有两种响应

       1、应答响应ACK:接收器会给发送方一小段低电平信号;

       2、非应答响应NACK:接收器会给发送方一个高电平信号。


以上便是本次文章的所有内容,欢迎各位朋友在评论区讨论,本人也是一名正在学习的小白,愿大家共同努力,一起进步吧!

鉴于笔者能力有限,难免出现一些纰漏和不足,望大家在评论区批评指正,谢谢!

相关文章:

I2C基础知识

引言 这里祝大家新年快乐!前面我们介绍了串口通讯协议,现在我们继续来介绍另一种常见的简单的串行通讯方式——I2C通讯协议。 一、什么是I2C I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司在上个世纪80年代开发的&#…...

护眼好帮手:Windows显示器调节工具

在长时间使用电脑的过程中,显示器的亮度和色温对眼睛的舒适度有着重要影响。传统的显示器调节方式不仅操作繁琐,而且在低亮度下容易导致色彩失真。因此,今天我想为大家介绍一款适用于Windows系统的护眼工具,它可以帮助你轻松调节显…...

MongoDb user自定义 role 添加 action(collStats, EstimateDocumentCount)

使用 mongosh cd mongsh_bin_path mongosh “mongodb://user:passip:port/db”这样就直接进入了对应的db 直接输入: 这样 role “read_only_role" 就获得了3个 action, 分别是 查询,列举集合,集合元数据查询 P.S: 如果没有 …...

mysql学习笔记-数据库其他调优策略

1、如何定位调优问题 用户的反馈(主要) 日志分析(主要) 服务器资源使用监控 数据库内部状况监控 2、调优的维度和步骤 第1步:选择适合的 DBMS 第2步:优化表设计 第3步:优化逻辑查询 第4步&am…...

Office / WPS 公式、Mathtype 公式输入花体字、空心字

注:引文主要看注意事项。 1、Office / WPS 公式中字体转换 花体字 字体选择 “Eulid Math One” 空心字 字体选择 “Eulid Math Two” 使用空心字时,一般不用斜体,取消勾选 “斜体”。 2、Mathtype 公式输入花体字、空心字 2.1 直接输…...

(done) MIT6.S081 2023 学习笔记 (Day6: LAB5 COW Fork)

网页:https://pdos.csail.mit.edu/6.S081/2023/labs/cow.html 任务1:Implement copy-on-write fork(hard) (完成) 现实中的问题如下: xv6中的fork()系统调用会将父进程的用户空间内存全部复制到子进程中。如果父进程很大,复制过程…...

SYN Flooding的攻击原理

SYN Flooding是一种常见的网络攻击方式,属于拒绝服务攻击(DoS)的一种,其攻击原理主要是利用了TCP协议的三次握手过程,以下是具体介绍: TCP三次握手正常流程 第一次握手:客户端向服务器发送一个…...

MYSQL--一条SQL执行的流程,分析MYSQL的架构

文章目录 第一步建立连接第二部解析 SQL第三步执行 sql预处理优化阶段执行阶段索引下推 执行一条select 语句中间会发生什么? 这个是对 mysql 架构的深入理解。 select * from product where id 1;对于mysql的架构分层: mysql 架构分成了 Server 层和存储引擎层&a…...

cmd命令行无法进入D:盘怎么办

我找到了一个方法就是 增加一个/d cd /d d: 如下图,我不仅可以进入d盘符下,还可以访问盘符下的文件夹...

CRC校验详解

CRC校验即循环冗余校验(Cyclic Redundancy Check),是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。首先看两个概念,后续会用到。 模2除法:也叫模2运算,就是结果除以2后取余数。模2除法每一位除的结果不影响其它位,即不向上一位借位,所以实际…...

windows系统本地部署deepseek及webui界面

一、官网下载ollama 二、使用ollama下载deepseek r1模型 根据显存选择多少b的参数的模型 ollama run deepseek-r1:32b 三、安装conda curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe Miniconda3-latest-Windows-x86_64.exe 四、构建…...

(算法竞赛)使用广度优先搜索(BFS)解决迷宫最短路径问题

在这个充满奇思妙想的世界里,每一次探索都像是打开了一扇通往新世界的大门。今天,我们将踏上一段特别的旅程,去揭开那些隐藏在代码、算法、数学谜题或生活智慧背后的秘密。🎉😊 所以,系好安全带&#xff0…...

Sqoop源码修改:增加落地HDFS文件数与MapTask数量一致性检查

个人博客地址:Sqoop源码修改:增加落地HDFS文件数与MapTask数量一致性检查 | 一张假钞的真实世界 本篇是对记录一次Sqoop从MySQL导入数据到Hive问题的排查经过的补充。 Sqoop 命令通过 bin 下面的脚本调用,调用如下: exec ${HAD…...

嵌入式系统|DMA和SPI

文章目录 DMA(直接内存访问)DMA底层原理1. 关键组件2. 工作机制3. DMA传输模式 SPI(串行外设接口)SPI的基本原理SPI连接示例 DMA与SPI的共同作用 DMA(直接内存访问) 类型:DMA是一种数据传输接口…...

leetcode——将有序数组转化为二叉搜索树(java)

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答…...

冯诺依曼结构和进程概念及其相关的内容的简单介绍

目录 ​编辑 冯诺依曼体系结构 操作系统(Operator System) 进程 引入 基本概念 描述进程-PCB task_ struct内容分类 进程 ID (PID)和查看进程 进程状态: 进程创建: 进程终止: 进程间通信 (IPC): 冯诺依曼体系结构 冯诺依曼体系结构是现代计算机的基础架构&#xf…...

Native Memory Tracking 与 RSS的差异问题

一 问题现象 前一段时间用nmt查看jvm进程的栈区占用的内存大小。测试代码如下 public class ThreadOOM {public static void main(String[] args) {int i 1;while (i < 3000) {Thread thread new TestThread();thread.start();System.out.println("thread : "…...

在K8s中部署动态nfs存储provisioner

背景 之前&#xff0c;我已经在一台worker node上安装了local lvm 的provisioner来模拟需要本地高IOPS的数据库等stafeful应用的实现。 为了后续给虚拟机里的K8s集群安装可用的metrics和logs监控系统&#xff08;metrics和logs的时序数据库需要永久存储&#xff09;&#xff0…...

家庭财务管理系统的设计与实现

标题:家庭财务管理系统的设计与实现 内容:1.摘要 摘要&#xff1a;随着家庭经济的日益复杂&#xff0c;家庭财务管理变得越来越重要。本文旨在设计并实现一个功能强大的家庭财务管理系统&#xff0c;以帮助用户更好地管理家庭财务。通过对家庭财务管理需求的分析&#xff0c;我…...

数据结构-Stack和栈

1.栈 1.1什么是栈 栈是一种特殊的线性表&#xff0c;只允许在固定的一段进行插入和删除操作&#xff0c;进行插入和删除操作的一段称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵顼后进先出LIFO&#xff08;Last In First Out&#xff09;的原则&#xff0c;就像一…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...