【外设篇】I2C工作原理

news2024/12/23 9:47:05

目录

一、I2C 简介 

二、I2C 主设备与从设备的关系 

三、I2C 数据传输过程 

3.1 总线空闲状态 

3.2 开始位和停止位的产生

3.3 主设备处于等待状态 

3.4 ACK 应答位的产生

3.5 有效的数据传输

3.6 数据的传输

总结


一、I2C 简介 

I2C(内置集成电路) 是由 Philips 公司开发的两线式串行总线,产生于 20 世纪 80 年代,用于连接微控制器及外围设备。I2C 总线简单而有效,占用 PCB(印制电路板)空间很小,芯片引脚数量少,设计成本低。I2C 总线支持多主控(Multi-Mastering)模式,任何能够进行发送和接收的设备都可以成为主设备。主控能够控制数据的传输和时钟频率,在任意时刻只能有一个主控。

1. I2C 总线由两根双向信号线组成:数据线(SDA)和时钟线(SCL);

2. I2C 总线通过上拉电阻接正电源。当总线空闲时,上拉电阻使 SDA 和 SCL 线都保持高电平(SDL=1; SCL=1);

3. 为了避免总线信号混乱,要求各设备连接到总线的输出端必须是开漏输出或集电极开路输出的结构。根据开漏输出或者集电极开路输出信号的 "线与" 逻辑,连到 I2C 总线上的任一器件输出低电平,都会使相应总线上的信号变低。

二、I2C 主设备与从设备的关系 

2.1 系统的所有外围器件都有一个7位的从器件专用地址码(其中高4位位器件类型,由出厂商制定,而低3位为器件引脚地址,由用户自定义)。由于 I2C 总线由二线组成,不需额外的外围器件片选线,因此主控器件可直接通过地址码建立多机通信机制,这样总线上是可以挂接多个器件的;

2.2 I2C 总线上,有主设备和从设备之分,主设备必须带有 CPU 逻辑模块,在同一总线上同一时刻只可使能一个主设备,但是可以有多个从设备,只是从设备的数量会因受到地址空间和总线的最大电容 400pF 而受到限制;

2.3 I2C 设备上的 SDA(串行数据线)是双向的,输出电路用于向总线发送数据,输入电路用于接收总线的数据;

2.4 同样地,SCL(串行时钟线)也是双向的,主设备主要是用来控制 SCL 线的,而从设备对主设备产生响应(即从设备需按总线上 SCL 的信息发送或接收 SDA 的数据),不过从设备也可向 SCL 发出低电平信号以延长总线时钟信号周期;

2.5 主设备和从设备,两者都可以传输数据,只是从设备不能发起传输信息,且传输信号是受到主设备控制的。 

三、I2C 数据传输过程 

3.1 总线空闲状态 

I2C 总线空闲时,上拉电阻使 SDA 和 SCL 线都保持高电平。 

3.2 开始位和停止位的产生

开始位和停止位都由 I2C 主设备产生,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。如图 2.10 所示。

3.2.1 开始位:当 SCL 稳定在高电平时,SDA 由高到低跳变将产生一个开始位;

3.2.2 停止位:当 SCL 稳定在高电平时,SDA 由低到高跳变则产生一个停止位。

3.3 主设备处于等待状态 

从设备(接收器件)收到一个完整的数据字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将 SCL 线拉成低电平,从而使主设备处于等待状态。直到接收器件准备好接收下一个字节时,再释放 SCL 线使之为高电平,从而使数据传送可以继续进行。 

3.4 ACK 应答位的产生

每个字节发送完后,在第 8 个时钟周期之后,主控方应该释放 SDA 数据线 ,在 SCL 的第 9 个上升沿到来之前,由接收方发出一个应答信号(ACK 位)。

有效应答位(ACK 位):应答信号为低电平时,表示接收方已经成功地接收了该字节;

非应答位(NACK 位) :应答信号为高电平时,表示接收方没有成功接收该字节。 

对于发送有效 ACK 位的要求是,接收方在第 8 个时钟周期之后的低电平期间将 SDA 线拉低,并且确保在第 9 个时钟周期的高电平期间 SDA 稳定为低电平。如果接收方是主控器,则在它收到最后一个字节后,发送一个 NACK 位,以通知被控发送器结束数据发送,并释放 SDA 线,以便主控接收器发送一个停止位。 

3.5 有效的数据传输

I2C 总线进行数据传输时,SCL 时钟信号为高电平期间,SDA 数据线上的数据必须保持稳定,只有在 SCL 时钟线上的信号为低电平期间,SDA 数据线上的高电平或低电平状态才允许变化。 如图所示。 

3.6 数据的传输

在 I2C 总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在 SCL 串行时钟的配合下,在 SDA 上逐位地串行传送每一位数据。数据位的传输是边沿触发。 

开始位和停止位都由 I2C 主设备产生。在选择从设备时,如果从设备采用 7 位地址,则主设备在发起传输过程前,需先发送 1 个字节的地址信息,前 7 位为设备地址,最后 1 位为(R/W)读写标志。之后,每次传输的数据也是 1 个字节,从 MSB(最高有效位)开始传输。每个字节传输完后,在 SCL 的第 9 个上升沿到来之前,接收方应该发出 1 个 ACK 位。SCL 上的时钟脉冲由 I2C 主控方发出,在第 8 个时钟周期之后,主控方应该释放 SDA,I2C 总线的时序如图 2.11 所示。

总结

1. I2C(Inter-Integrated Circuit)是一种串行通信总线标准,它使用两根线(时钟线和数据线)来传输数据。它是一种多主机、多从机的通信模式,可以在这两种设备之间进行数据传输和控制。时钟线由主机掌控并用于同步数据传输,而数据线用于传输实际的数据。因此,I2C是一种串行通信总线,但不是采用串行工作模式的。

2. I2C 是一种半双工的通信模式。在I2C协议中,数据的传输是双向的,但是同一时间内只能有一方发送数据,另一方接收数据。这意味着I2C总线上的设备可以作为主机(发送数据)或从机(接收数据)来进行通信。主机负责发起通信并生成时钟信号,而从机则根据主机发送的时钟信号进行数据的接收或发送。因此,I2C是一种半双工的通信模式。 

3. 在 I2C 通信中,读写操作的标志位是通过设备地址的最后 1 位来确定的。这一位可以被称为读/写位或命令位。当这一位为 0 时,表示是写操作;当这一位为 1 时,表示是读操作。当主机想要向从机写入数据时,它会发送一个带有从机地址、写操作位(0)和数据的帧。当主机想要从从机读取数据时,它会首先发送一个带有从机地址和写操作位(0)的帧,然后发送一个带有从机地址和读操作位(1)的帧,并接收从机传输的数据。通过读写标志位来区分读写操作,I2C通信可以实现双向的数据传输。

4. 开始位和停止位都由 I2C 主设备产生,数据从 MSB(高位)开始传输,只有在 SCL 时钟线上的信号为低电平期间,SDA 数据线上的高电平或低电平状态才允许变化。

5. 每个字节发送完后,在第 8 个时钟周期之后,主控方应该释放 SDA 数据线 ,在 SCL 的第 9 个上升沿到来之前,由接收方发出一个应答信号(ACK 位)。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浏览器 html通知权限已经开了,但是还不提醒

如果您已经在Chrome浏览器中开启了HTML5通知,但是仍然不收到提醒,可能有几种可能的原因。下面是一些建议的解决方法: 检查浏览器设置: 确保HTML5通知在Chrome浏览器中正确启用。您可以按照以下步骤检查设置: 在Chrome中输入 chrom…

【Nacos源码系列】Nacos服务发现的原理

文章目录 服务发现是什么客户端服务发现服务端发现总结 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 上篇文章介绍了 Nacos服务注册的原理 ,本篇文章将从客户端和服务端的…

微服务保护——Sentinel【实战篇二】

一、线程隔离 🍉 线程隔离有两种方式实现: 线程池隔离信号量隔离(Sentinel默认采用) 线程隔离(舱壁模式)🥝 在添加限流规则时,可以选择两种阈值类型: QPS:…

LiveNVR监控流媒体Onvif/RTSP功能-支持无人机、IPC等设备RTMP推流转码分发H5无插件播放也支持GB28181输出

LiveNVR支持无人机、IPC等设备RTMP推流转码分发H5无插件播放也支持GB28181输出 1、无人机推流转国标2、获取RTMP推流地址2.1、RTMP推流地址格式2.2、推流地址示例 2、设备RTMP推流3、配置拉转RTMP3.1、直播流地址格式3.2、直播流地地址示例3.3、通道配置直播流地址 4、配置级联…

螺杆支撑座的加工工艺

螺杆支撑座是重要的传动元件,一般与滚珠螺杆搭配使用,滚珠螺杆的固定座可选择使用深沟球轴承C7精度,磨削螺杆的固定座可选择用角接触轴承的C5精度,C5的精度更高。 支撑侧没有精度,一般使用深沟球轴承,如果螺…

linux 系统编程-进程中的通信

目录 1 IPC 方法 2管道 2.1管道的概念 2.2 pipe 函数 2.3管道的读写行为 2.4 管道缓冲区大小 2.5 管道的优劣 2.6 FIFO 3.共享存储映射 3.1 文件进程间通信 3.2 存储映射 I/O 3.3 mmap 函数 3.4 munmap 函数 3.5 mmap 注意事项 3.6 mmap 父子进程通信 3.7 mmap …

JAVA 面试准备

这里写自定义目录标题 一、JAVA基础1.ArrayList2.HashMap3.Concurrenthashmap4.Stream5.synchronized6.线程池7.CompletableFuture8.Fork/join9.数组与链表的区别10.单例模式1.饿汉模式2.懒汉模式10.1、 为啥使用synchronized?10.2、 又为啥使用volatile?10.3、 那又又为啥用…

【MySQL进阶(一)】MySQL在Linux中的配置信息和数据备份工具

MySQL在Linux中安装的话可以看这篇博客:MySQL在Linux中的安装,我觉得总结的很好。 my.cnf 中的配置信息 当 MySQL 启动的时候,会从安装目录中加载软件数据,即使用 mysqld 工具初始化设置的 --basedir,会从数据目录中…

GaussDB云数据库配套工具UGO

目录 一、前言 二、数据库和应用迁移UGO定义 1、UGO定义 2、异构数据库迁移简图 三、数据库迁移的痛点 四、数据库和应用迁移UGO能力介绍 五、数据库和应用迁移UGO方案简图介绍 六、小结 一、前言 在数字化时代,企业面临着越来越多的数据库和应用迁移需求。…

SpringBoot解决跨域问题的几种方式

本文参考自:SpringBoot 解决跨域问题的 5 种方案!_springboot跨域问题解决方案_肥肥技术宅的博客-CSDN博客 SpringBoot解决ajax跨域问题-腾讯云开发者社区-腾讯云 跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它的初衷…

认识C++继承

认识继承 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由…

Protobuf数据交互实战

"no one gonna make me down" 在之前呢,我们介绍了什么protobuf以及它的语法、数据类型。 一句老话说得好,"多说不练,假把式!"。因此,本篇会选择以protobuf的语法,完成一个简易的通讯…

uniapp 微信小程序 自定义弹框+picker下拉选择列表+输入表单:拒绝-选择理由弹窗

效果&#xff1a; 1、template <!-- 拒绝-选择理由弹窗--> <view class"reason-popover" v-if"showReasonDialog"><view class"reason-modal"><view class"reason-title"><text>请选择拒绝理由<…

文心一言 VS 讯飞星火 VS chatgpt (64)-- 算法导论6.5 3题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;64&#xff09;-- 算法导论6.5 3题 三、要求用最小堆实现最小优先队列&#xff0c;请写出 HEAP-MINIMUM、HEAP-EXTRACT-MIN、HEAP DECREASE-KEY 和 MIN-HEAP-INSERT 的伪代码。 文心一言&#xff1a; 以下是使用最小堆实现最小…

界面控件DevExpress WPF数据编辑器组件,让数据处理更灵活!(二)

界面控件DevExpress WPF编辑器库可以帮助用户提供直观的用户体验&#xff0c;具有无与伦比的运行时选项和灵活性。WPF数据编辑器提供了全面的掩码和数据验证支持&#xff0c;可以独立使用&#xff0c;也可以作为容器控件(如DevExpress WPF Grid和WPF TreeList)中的单元格编辑器…

ubantu 安装 sudo apt install ubuntu-restricted-extras. 如何 OK

在安装的时候&#xff0c;不知道如何 Ok 使用 回车键&#xff0c;空格键 均不行&#xff0c;使用 Tab 键 &#xff0c;然后再使用 回车键。 Configuring ttf-mscorefonts-installer 答案是使用 Tab 键。

【Python】pyecharts 模块 ③ ( 使用 pyecharts 模块绘制折线图 )

文章目录 一、使用 pyecharts 模块绘制折线图1、折线图绘制过程2、完整代码示例 pyecharts 画廊网站 : https://gallery.pyecharts.org/#/ 在该网站可查看官方示例 一、使用 pyecharts 模块绘制折线图 1、折线图绘制过程 首先 , 导入 折线图 Line 对象 , 该类定义在 pyecharts…

Go http.Get不需要defer res.Body.Close()

前戏&#xff1a; go net/http包&#xff0c;必须要手动关闭嘛&#xff1f;非也。线上程序为啥协程数量直线上升&#xff0c;因为使用的姿势不对&#xff0c;请换个姿势。 干货&#xff1a; 手动关闭&#xff0c;释放资源 defer res.Body.Close() &#xff08;这是一个好习…

LeetCode[剑指Offer51]数组中的逆序对

难度&#xff1a;Hard 题目&#xff1a; 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制&#xff1a; 0 < 数组…

C++【STL】queue和deque 容器详解

C【STL】queue和deque 容器详解 一级目录 二级目录 三级目录 1. 什么是queue容器&#xff1f; Queue是一种先讲先出( First In First Out,FIFO )的数据结构&#xff0c;它有两个出口。 queue模版类的定义在头文件中。 include 定义queue对象的示例代码如下∶ queue<i…