I 2C 接口控制器理论讲解

IIC系列文章:
(1) I 2C 接口控制器理论讲解
(2) I2C接口控制设计与实现

文章目录

  • 一、 IIC协议
  • 二、IIC协议解析
    • 1.特点
    • 2.规定
    • 3.器件地址
    • 4.存储地址
  • 三、IIC写时序
    • 1.单字节写时序
    • 2.连续写时序(页写时序)
  • 四、IIC读时序
    • 1.单字节读时序
    • 2.连续读时序(页读取)


一、 IIC协议

I2C(Inter-Integrated Circuit BUS) 集成电路总线,它是一种串行通信总线,使用多主从架构,由 Philips 公司开发的一种简单、双向二线制同步串行总线,只需要两根线即可在连接于总线上的器件之间传送信息。 I2C 通讯协议和通信接口在很多工程中有广泛的应用,如数据采集领域的串行 AD,图像处理领域的摄像头配置,工业控制领域的 X 射线管配置等等。除此之外,由于 I2C 协议占用引脚特别少,硬件实现简单,可扩展型强,现在被广泛地使用在系统内多个集成电路 (IC)间的通讯。IIC数据传输速率有标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),另外一些变种实现了低速模式(10 kbps)和快速+模式(1 Mbps)。

下图是一个基于FPGA的主机仅通过2根线的IIC总线控制多个IIC外设的典型应用图:
在这里插入图片描述

二、IIC协议解析

1.特点

1、它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
2、一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
3、每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
4、总线通过上拉电阻接到电源。当 I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
5、多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线

2.规定

在时钟(SCL)为高电平的时候,数据总线(SDA)必须保持稳定,所以数据总线(SDA)
在时钟(SCL)为低电平的时候才能改变。
在这里插入图片描述

 在时钟(SCL)为高电平的时候,数据总线(SDA)由高到低的跳变为总线起始信号,在时钟(SCL)为高电平的时候,数据总线(SDA)由低到高的跳变为总线停止信号。

在这里插入图片描述

 应答,当 IIC 主机(不一定是发送端还是接受端)将 8 位数据或命令传出后,会将数据总线(SDA)释放,即设置为输入,然后等待从机应答(低电平 0 表示应答,1 表示非应答),此时的时钟仍然是主机提供的。

在这里插入图片描述
数据帧格式,I2C 器件通讯的时候首先是要发送“起始信号”,紧跟着就是七位器件地址,第八位是数据传送方向位(0:代表写,1:代表读),再后面就是等待从机的应答。当然传送结束后,“终止信号”也是由主机来产生的。发送数据的时候是高位先发送。

3.器件地址

每个 I2C 器件都有一个器件地址,有的器件地址在出厂时地址就设置好了,用户不可以更改(例如 OV7670 器件地址为固定的 0x42),有的确定了几位,剩下几位由硬件确定(比如常见的 I2C 接口的 EEPROM 存储器,留有 3 个控地址的引脚,由用户自己在硬件设计时确定)。严格讲,主机不是直接向从机发送地址,而是主机往总线上发送地址,所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向总线发出一个响应信号。主机收到响应信号后,开始向总线上发送数据,与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。通常情况下,主从器件的角色是确定的,也就是说从机一直工作在从机模式。不同器件定义地址的方式是不同的,有的是软件定义,有的是硬件定义。

I2C 协议在进行数据传输时,主机需要首先向总线上发出控制命令,其中控制命令就包含了从机器件地址和读写控制,然后等待从机响应。如图所示为 I2C 控制命令传输的数据格式。

在这里插入图片描述
I2C 传输时,按照从高到低的位序进行传输。控制字节的最低位为读写控制位,当该位为 0 时表示主机对从机进行写操作,当该位为 1 时表示主机对从机进行读操作。

4.存储地址

每个支持 I2C 协议的器件,内部总会有一些可供读写的寄存器或存储器,例如,EEPROM 存储器,内部就是顺序编址的一系列存储单元;型号为 OV7670 的 CMOS 摄像头(OV7670 的该接口叫 SCCB 接口,其实质也是一种特殊的 I2C 协议,可以直接兼容 I2C 协议),其内部就是一系列编址的可供读写的寄存器。因此,我们要对一个器件中的存储单元(寄存器和存储器,以下简称存储单元)进行读写,就必须要能够指定存储单元的地址。I2C 协议设计了有从机存储单元寻址地址段,该地址段为一个字节或两个字节长度,在主机确认收到从机返回的控制字节响应后由主机发出。地址段长度视不同的器件类型,长度不同,具体是一个字节还是两个字节,与器件的存储单元数量有关。下方图 1 和图2 分别为 1 字节地址和 2 字节地址器件的地址分布图
在这里插入图片描述

在这里插入图片描述

三、IIC写时序

1.单字节写时序

不同器件,I2C 器件地址字节不同,这样对于 I2C 单字节写时序就会有所差别,下图 1 和下图 2 分别为 1 字节地址段器件和 2 字节地址段器件单字节写时序图。

在这里插入图片描述

根据时序图,从主机角度来描述一次写入单字节数据过程如下:
单字节地址写单字节数据过程:
1、主机设置 SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为 0,表明为写操作;
4、主机设置 SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置 SDA 为输出,传输 1 字节地址数据;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置 SDA 为输出,传输待写入的数据;
8、设置 SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机产生 STOP 位,终止传输。
双字节地址写单字节数据过程:
1、主机设置 SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为 0,表明为写操作;
4、主机设置 SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置 SDA 为输出,传输地址数据高字节;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置 SDA 为输出,传输地址数据低字节;
8、设置 SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机设置 SDA 为输出,传输待写入的数据;
10、设置 SDA 为三态门输入,读取从机应答信号;
11、读取应答信号成功,主机产生 STOP 位,终止传输。

2.连续写时序(页写时序)

注:I2C 连续写时序仅部分器件支持。
连续写(也称页写,需要注意的是 I2C 连续写时序仅部分器件支持)是主机连续写多个字节数据到从机,这个和单字节写操作类似,连续多字节写操作也是分为 1 字节地址段器件和 2 字节地址段器件的写操作,下图 1 和下图 2 分别为 1 字节地址段器件和 2 字节地址段器件连续多字节写时序图。

在这里插入图片描述

根据时序图,从主机角度来描述一次写入多字节数据过程如下:
单字节地址器件连续多字节写数据过程:
1、主机设置 SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为 0,表明为写操作;
4、主机设置 SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置 SDA 为输出,传输 1 字节地址数据;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置 SDA 为输出,传输待写入的第 1 个数据;
8、设置 SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功后,主机设置 SDA 为输出,传输待写入的下一个数据;
10、设置 SDA 为三态门输入,读取从机应答信号;n 个数据被写完,转到步骤 11,若数据未被写完,转到步骤 9;
11、读取应答信号成功,主机产生 STOP 位,终止传输。

双字节地址器件连续多字节写数据过程:
1、主机设置 SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为 0,表明为写操作;
4、主机设置 SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置 SDA 为输出,传输地址数据高字节;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置 SDA 为输出,传输地址数据低字节;
8、设置 SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机设置 SDA 为输出,传输待写入的第 1 个数据;
10、设置 SDA 为三态门输入,读取从机应答信号;
11、读取应答信号成功后,主机设置 SDA 为输出,传输待写入的下一个数据;
12、设置 SDA 为三态门输入,读取从机应答信号;n 个数据被写完,转到步骤 13,若数据未被写完,转到步骤 11;
13、读取应答信号成功,主机产生 STOP 位,终止传输。
注:对于 AT24Cxx 系列的 EEPROM 存储器,一次可写入的最大长度为 32 字节。

四、IIC读时序

1.单字节读时序

同样的,I2C 读操作时序根据不同 I2C 器件具有不同的器件地址字节数,单字节读操作分为 1 字节地址段器件单字节数据读操作和 2 字节地址段器件单字节数据读操作。下图 1和下图 2 分别为不同情况的时序图。

在这里插入图片描述
根据时序图,从主机角度来描述一次读取单字节数据过程如下:
单字节地址读取单字节数据过程:
1、主机设置 SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为 0,表明为写操作;
4、主机设置 SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置 SDA 为输出,传输 1 字节地址数据;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机发起起始信号;
8、主机传输器件地址字节,其中最低位为 1,表明为读操作;
8、设置 SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机设置 SDA 为三态门输入,读取 SDA 总线上的一个字节的数据;
10、产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
11、主机产生 STOP 位,终止传输。
双字节地址读取单字节数据过程:
1、主机设置 SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为 0,表明为写操作;
4、主机设置 SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置 SDA 为输出,传输地址数据高字节;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置 SDA 为输出,传输地址数据低字节;
8、设置 SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机发起起始信号;
10、主机传输器件地址字节,其中最低位为 1,表明为读操作;
11、设置 SDA 为三态门输入,读取从机应答信号;
12、读取应答信号成功,主机设置 SDA 为三态门输入,读取 SDA 总线上的一个字节的数据;
13、主机设置 SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
14、主机产生 STOP 位,终止传输。

2.连续读时序(页读取)

连续读是主机连续从从机读取多个字节数据,这个和单字节读操作类似,连续多字节读操作也是分为 1 字节地址段器件和 2 字节地址段器件的读操作,下图 1 和下图 2 分别为字节地址段器件和 2 字节地址段器件连续多字节读时序图。
在这里插入图片描述
在这里插入图片描述

根据时序图,从主机角度来描述一次读取多字节数据过程如下:
单字节地址器件连续多字节读取数据过程:
1、主机设置 SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为 0,表明为写操作;
4、主机设置 SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置 SDA 为输出,传输 1 字节地址数据;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机发起起始信号;
8、主机传输器件地址字节,其中最低位为 1,表明为读操作;
9、设置 SDA 为三态门输入,读取从机应答信号;
10、读取应答信号成功,主机设置 SDA 为三态门输入,读取 SDA 总线上的第 1 个字节
的数据;
11、主机设置 SDA 输出,发送一位应答信号;
12、设置 SDA 为三态门输入,读取 SDA 总线上的下一个字节的数据;若 n 个字节数据
读完成,跳转到步骤 13,若数据未读完,跳转到步骤 11;(对于 AT24Cxx,一次读
取长度最大为 32 字节,即 n 不大于 32)
13、主机设置 SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总
线会被自动拉高);
14、主机产生 STOP 位,终止传输。
双字节地址器件连续多字节读取数据过程:
1、主机设置 SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为 0,表明为写操作;
4、主机设置 SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置 SDA 为输出,传输地址数据高字节;
6、主机设置 SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置 SDA 为输出,传输地址数据低字节;
8、设置 SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机发起起始信号;
10、主机传输器件地址字节,其中最低位为 1,表明为读操作;
11、设置 SDA 为三态门输入,读取从机应答信号;
12、读取应答信号成功,主机设置 SDA 为三态门输入,读取 SDA 总线上的第 1 个字节的数据;
13、主机设置 SDA 输出,发送一位应答信号;
14、设置 SDA 为三态门输入,读取 SDA 总线上的下一个字节的数据;若 n 个字节数据读完成,跳转到步骤 15,若数据未读完,跳转到步骤 13;(对于 AT24Cxx,一次读取长度最大为 32 字节,即 n 不大于 32)
15、主机设置 SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
16、主机产生 STOP 位,终止传输。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙边缘计算网关正式开售

IDO-IPC3528鸿蒙边缘计算网关基于RK3568研发设计,采用22nm先进工艺制程,四核A55 CPU,主频高达2.0GHz,支持高达8GB高速LPDDR4,1T算力NPU,4K H.265/H264硬解码;视频输出接口HDMI2.0,双…

62.不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 动态规…

竞赛项目 深度学习手势识别算法实现 - opencv python

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习手势识别算法实现 - opencv python 该项目较为新颖…

.netcore grpc客户端流方法详解

一、客户端流式处理概述 客户端流式处理方法在该方法没有接收消息的情况下启动。 requestStream 参数用于从客户端读取消息。 返回响应消息时,客户端流式处理调用完成。客户端可以发送多个消息流到服务端,当所有客户端消息流发送结束,调用请…

APP备案明明是好事,为啥有些人反对呢?

我是卢松松,点点上面的头像,欢迎关注我哦! APP和小程序备案, 这事在网上闹的沸沸扬扬,明明是好事,可为啥那么多人反对呢?而且最近出现了好多阴阳怪气的声音。 话说从2005年3月起,国内所有的网…

AI抢饭碗!多部由Midjourney+Runway,制作的电影火了!丨IDCF

ChatGPT等生成式AI正在重塑各个行业的工作模式,尤其是影视领域。最近,多部由MidjourneyRunway生成式AI制作的电影预告片在社交平台上火了。 一部名叫的《芭本海默》的电影从对白、场景、人物、切镜完全由生成式AI制作完成并受到了用户的好评。该片结合了…

IDEA简单拷贝一份新项目记录

IDEA简单拷贝项目记录 拷贝后改项目名,然后iml 配置文件改项目名,然后 .idea 中的compiler.xml 里面的name标签改项目名。 就可以了

3D Web轻量化引擎HOOPS Communicator如何实现对BIM桌面端的支持?

HOOPS Communicator是一款简单而强大的工业级高性能3D Web轻量化渲染开发包,其主要应用于Web领域,主要加载其专有的SCS、SC、SCZ格式文件;HOOPS还拥有另一个桌面端开发包HOOPS Visualize,主要加载HSF、HMF轻量化格式文件。两者虽然…

PyTorch深度学习实战(10)——过拟合及其解决方法

PyTorch深度学习实战(10)——过拟合及其解决方法 0. 前言1. 过拟合基本概念2. 添加 Dropout 解决过拟合3. 使用正则化解决过拟合3.1 L1 正则化3.2 L2 正则化 4. 学习率衰减小结系列链接 0. 前言 过拟合 (Overfitting) 是指在机器学习中,模型…

putty使用记录

在官网下载并安装putty 一、SSH 二、FTP open 192.168.1.118 put -r C:\Users\Administrator\Desktop\test /opt/lanren312/test # 上传(文件夹) get -r /opt/lanren312/test C:\Users\Administrator\Desktop\test2 # 下载(文件夹&#xff…

边缘计算框架 Baetyl v2.4.3 正式发布

导读Baetyl v2.4.3 版本已经发布,对 v2.3.0 版本的部分功能进行了升级优化。公告称,这些新功能继续遵循云原生理念,构建了一个开放、安全、可扩展、可控制的智能边缘计算平台。 Baetyl 项目由百度发起,基于百度天工 AIoT 智能边缘…

【问题解决】Git命令行常见error及其解决方法

以下是我一段时间没有使用xshell,然后用git命令行遇到的一些系列错误和他们的解决方法 遇到了这个报错: fatal: Not a git repository (or any of the parent directories): .git 我查阅一些博客和资料,可以解决的方式: git in…

jQuery基础

目录 基础语法 选择器 层次选择器 属性选择器 基本过滤选择器 可见性过滤选择器 官网下载地址 两种包区别: $(document).ready()与window.onload类似,但也有区别。 基础语法 $(selector).action() 选择器 同html选择器等。 基本选择器包括标签选择器…

竞赛项目 深度学习的智能中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分:4.2 损失函数:4.3 搭建seq2seq框架:4.4 测试部分:4.5 评价NLP测试效果:4.6 梯度截断…

后端人员如何快速上手vue

一、环境搭建 了解更多vue-cli 官网地址:https://cli.vuejs.org/zh/guide/browser-compatibility.html 前提 1.安装node(js代码的运行环境)、npm、cnpm/yarn; nodejs官网:https://nodejs.org/en cnpm安装:https://www.python100.com/htm…

uniapp 微信小程序 订阅消息

第一步&#xff0c;需要先去小程序官方挑选一下订阅模板拿到模板id 订阅按钮在头部导航上&#xff0c;所以 <u-navbar :bgColor"bgColor"><view class"u-nav-slot" slot"left" click"goSubscribe"><image :src"g…

leetcode59. 螺旋矩阵 II

题目&#xff1a;leetcode59. 螺旋矩阵 II 描述&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 思路&#xff1a; 代码&#xff1a; public class Solution {public int[][…

[C#] 简单的俄罗斯方块实现

一个控制台俄罗斯方块游戏的简单实现. 已在 github.com/SlimeNull/Tetris 开源. 思路 很简单, 一个二维数组存储当前游戏的方块地图, 用 bool 即可, true 表示当前块被填充, false 表示没有. 然后, 抽一个 “形状” 类, 形状表示当前玩家正在操作的一个形状, 例如方块, 直线…

弹簧滑块模型微分方程PLC数值求解(Euler和Runge-Kutta法SCL源代码)

龙格库塔法求解微分方程的PLC算法,还可以参看下面这篇文章博客: 微分方程数值解法(Runge-Kutta法PLC实现)_RXXW_Dor的博客-CSDN博客微分方程数值解法之欧拉法请参看下面的博客文章:微分方程数值解法(PID仿真用一阶被控对象库PLC算法实现)_数学微积分算法plc编程实例_RXXW_D…

液体神经网络:LNN是个啥概念?

一、说明 在在人工智能领域&#xff0c;神经网络已被证明是解决复杂问题的非常强大的工具。多年来&#xff0c;研究人员不断寻求创新方法来提高其性能并扩展其能力。其中一种方法是液体神经网络&#xff08;LNN&#xff09;的概念&#xff0c;这是一个利用动态计算功能的迷人框…