数字IC基础协议篇(1)——I2C协议

news2024/11/16 21:23:36

数字IC基础协议篇(1)——I2C协议

  • 写在前面的话
    • I2C协议应用框图
    • I2C数据格式
    • 协议注意点
  • I2C读写EEPROM例程(基于iverilog和gtkwave)
    • 软件环境要求
  • 项目框图
  • 总结

写在前面的话

协议介绍:
I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,用于连接在数字系统中的多个集成电路。它是由飞利浦公司(Philips)于上世纪80年代开发的,并在现在被广泛应用于各种电子设备和嵌入式系统中。

I2C协议使用两根线进行通信:SDA(Serial Data Line)和SCL(Serial Clock Line)。SDA是用于传输数据的双向线路,而SCL是一个时钟线路,用于同步数据的传输。这两根线路都需要外部上拉电阻来恢复默认高电平状态。

在I2C通信中,每个设备都有唯一的地址,可以作为主设备(Master)或从设备(Slave)进行工作。主设备负责发起通信并控制总线的操作,而从设备则根据主设备的命令进行响应。

数据传输过程中,主设备发起开始信号(Start)和停止信号(Stop),用于标识通信的开始和结束。开始信号指示着总线空闲状态结束,而停止信号表示着通信的终点。在通信过程中,主设备通过发送地址和数据来与从设备进行通信。从设备根据地址来判断是否需要响应,并通过数据线回复数据。

I2C协议支持不同的数据传输速率,最常见的是标准模式(100 kHz)和快速模式(400 kHz)。此外,还有更高速的Fast Mode Plus(1 MHz)和超高速模式(3.4 MHz)。
I2C协议仅使用两根线路、支持多主设备、可通过总线电源供电等。它被广泛应用于各种应用领域,包括传感器、存储器、显示屏、温度计、实时时钟等。

重要性:

  1. 设备互联:I2C协议是一种常见的串行通信协议,广泛用于数字系统中的设备互联。了解和熟练应用I2C协议可以使工程师能够设计和连接各种集成电路(IC),传感器,存储器,显示屏等设备,构建复杂的系统。
  2. 系统集成:许多数字系统需要与多个设备进行通信,并且这些设备通常使用不同的通信协议。作为数字IC工程师,掌握I2C协议可以将不同设备集成到一个系统中,简化系统设计和布局。
  3. 资源共享:通过I2C总线,多个设备可以共享同一个总线来传输数据。这种资源共享机制可以显著降低系统成本和功耗。掌握I2C协议可以使工程师能够实现设备之间的数据共享和通信,提高系统的效率和性能。
  4. 系统调试和故障排除:在开发和调试数字系统时,I2C协议的理解和熟练使用对于故障排除和调试是至关重要的。通过监视和分析I2C通信,工程师可以定位问题并解决通信故障,确保系统的正常运行。
  5. 设备驱动程序开发:在嵌入式系统中,往往需要编写设备驱动程序来与从设备进行通信。掌握I2C协议可以帮助工程师编写高效可靠的设备驱动程序,实现与各种从设备的数据交换和控制。

对于找工作的帮助:

  1. 简单易学:相对于其他复杂的通信协议,如SPI、CAN等,I2C协议相对简单。它只需要理解两根线路(时钟线和数据线)以及基本的传输格式就可以开始使用。因此,对于初学者来说,I2C协议是较为容易上手的。
  2. 常见应用广泛:I2C协议在各种应用中都有广泛的应用,例如嵌入式系统、传感器网络、数字IC设计等领域。了解I2C协议可以帮助初学者更好地理解和应用实际项目中的通信需求。
  3. 开发资源丰富:针对I2C协议的开发资源(如文档、示例代码、软件库等)非常丰富。许多厂商提供了针对I2C的硬件产品和相关支持,以及开源社区也有很多关于I2C协议的开发资源。初学者能够更轻松地获取学习资料和实践经验。
  4. 实验成本低:使用I2C协议进行实验的成本相对较低。大多数I2C设备价格较为合理,而且可以通过一些常见的开发板和模块来快速构建实验环境。这使得初学者能够以较低的成本进行实际的通信测试和项目开发。
  5. 高度可扩展:尽管I2C协议本身相对简单,但它具有高度可扩展性。初学者可以通过学习I2C协议的基础知识,进一步了解如何应用其他高级功能和特性,例如多主机模式、时序控制、高速模式等。有助于逐步提升技能水平。

I2C协议应用框图

I2C协议应用框图如下:
1)只需要两条总线线路:一条串行数据线(SDA)和一条串行时钟线(SCL)。
2)连接到总线上的每个设备都可通过唯一地址进行软件寻址,并且在任何时候都存在简单的主/从关系;主设备可作为主发送器或主接收器运行
3)这是一条真正的多主总线,包括碰撞检测和仲裁,以防止两个或多个主设备同时启动数据传输时出现数据损坏。
4)串行、面向 8 位的双向数据传输,在标准模式下传输速率最高可达 100 kbit/s,在标准模式下传输速率最高可达 400 kbit/s。在标准模式下最高可达 100 kbit/s,在快速模式下最高可达 400 kbit/s,在高速模式下最高可达 3.4 Mbit/s。
5)串行、8 位定向、单向数据传输,在超高速模式下最高可达 5 Mbit/s
6)片上滤波可拒绝总线数据线上的尖峰,以保持数据的完整性。
7)可连接到同一总线的集成电路数量仅受最大总线电容(默认是400pF)的限制。在某些情况下,可能允许更大的电容。

I2C协议经典应用框图

在这里插入图片描述
I2C总线负载电容
总线负载电容推荐值不超过400pf,超过Spec时需要设置Buffer进行隔离。
在这里插入图片描述

I2C数据格式

I2C协议的数据格式包括以下几个部分:开始信号、设备地址、寄存器地址(可选)、数据、应答位和停止信号。通过这种格式,主设备和从设备能够按照约定的规则进行数据的传输和解析,实现可靠的通信。

  1. I2C协议使用了一种特定的数据格式来进行通信。在传输过程中,数据被分为字节(Byte)单位,并按照特定的格式进行传输和解析。

  2. 每一个字节都有8位(Bit),通信的起始由主设备(Master)发出开始信号(Start)来表示。接下来的第一个字节是设备地址(Address),它用于指示要通信的从设备(Slave)的身份。地址由7位组成,最高位用于表示读取(1)或写入(0)操作。

  3. 在设备地址之后,可能会跟着一个可选的寄存器地址(Register
    Address)。这个寄存器地址用于指定从设备内部的特定寄存器,以便进行读取或写入操作。寄存器地址也是一个字节大小。

  4. 在寄存器地址之后,可以发送多个字节的数据。这些数据可以是要写入寄存器的值,或者是从设备读取到的数据。在写入操作中,主设备将数据逐个字节地发送给从设备。而在读取操作中,主设备发送读取请求后,从设备会按照顺序将数据逐个字节地回复给主设备。

  5. 在每个字节的传输之间,都会有一个应答位(ACK)来确认数据的接收情况。当从设备成功接收到一个字节时,它会发送一个应答位来通知主设备继续发送下一个字节。而如果从设备未能成功接收到一个字节,它会发送一个非应答位(NACK)来终止数据传输。

  6. 在通信的末尾,主设备会发送停止信号(Stop),表示通信结束。

在这里插入图片描述

协议注意点

1. 数据有效性:
SDA线上的数据在时钟的HIGH周期内必须稳定。当SCL线上的时钟信号为LOW时,数据线的LOW状态才能改变。每个数据位对应一个时钟脉冲。
在这里插入图片描述
2. 起始和终止条件:

起始条件:当 SCL 为高电平时,SDA 由高电平转换为低电平。
终止条件:当 SCL 为高电平时,SDA 从低电平转换为高电平。
在这里插入图片描述
3. 数据格式:
SDA 传输的字节长度为 8 位。每次传输的字节数不受限制。每个字节后必须有一个应答位,数据传送时,先传送最高位(MSB)。

如果从机要完成一些其他功能后,例如一个内部中断服务程序,才能接收或发送下一个完整的数据字节。可以使时钟线 SCL 保持低电平迫使主机进入等待状态。 当从机准备好接收下一个数据字节并释放时钟线 SCL 后 数据传输继续
在这里插入图片描述
4. 应答位:
在这里插入图片描述

应答位的信号定义如下:主机在第9位传输期间,在SCL时钟脉冲期间释放 SDA 线(拉高SDA)。以便从机能将 SDA 线拉至低电平,并在该时钟脉冲期间保持稳定的低电平。

通常从机在接收到的每个字节后,除了用 CBUS 地址开头的报文,必须产生一个应答位。当从机不能响应从机地址时,从机必须使数据线保持高电平。主机之后产生一个停止条件终止传输或者产生重复起始条件开始新的传输。

产生非应答的几种情况:

  1. 总线上没有对应传输地址的从机,因此没有设备响应确认。
  2. 从机无法接收或发送,因为它正在执行某些实时 功能,尚未准备好开始与主机通信。
  3. 从机收到不理解的数据或命令。
  4. 从机无法接收更多数据字节。
  5. 主机接收器必须向从机发送器发出传输结束信号。

5. 时钟同步和仲裁
时钟同步:
多个主机可以同时开始在空闲的I2C总线上传输数据,因此必须有一种方法来决定由哪个主机控制总线并完成传输。这是通过时钟同步和仲裁实现的,单主角的系统中不需要时钟同步和仲裁。

时钟同步通过线与连接 I2C 接口到 SCL 线来执行,这就是说 SCL 线的高到低切换会开始数低电平周期,而一旦器件的时钟变低电平,它会使 SCL 线保持这种状态直到时钟的高电平。

在这里插入图片描述
同步 SCL 时钟的低电平周期由时钟低电平周期最长的主机决定,而其高电平周期则由时钟高电平周期最短的主机决定。(SCL是线与连接的)

仲裁:
只有当总线空闲时,主机才能开始传输。两个主机可在启动条件的最短保持时间 (tHD;STA) 内产生一个启动条件,从而在总线上产生一个有效的启动条件。这时需要进行仲裁,以确定由哪个主机完成传输。

由于SDA也是线与连接的,所有主机会在SCL拉高时将自己产生的SDA信号与总线SDA信号进行对比,当检测到和总线不一致时,则退出仲裁,直到SDA总线上信号和该主机一致。

整个仲裁过程不会遗漏发送的SDA信息,仲裁时间的长短和SDA对应的信息正确与否相关,即仲裁所需时间是不确定的。也没有额外的仲裁单元,每个主机内部都会检查SDA总线和自己发送的SDA对应位的信息。
在这里插入图片描述

I2C读写EEPROM例程(基于iverilog和gtkwave)

难度:⭐⭐
推荐度:⭐⭐⭐
推荐天数:1~3天

软件环境要求

要求的软件和EDA环境:
(1)操作系统要求:
Windows
(2)EDA 软件要求:
iverilog & gtkwave

项目学习目的:
(1)熟练掌握I2C协议;
(2)熟悉 Verilog HDL仿真;
(3)熟练掌握EEPROM;
(4)掌握iverilog和gtkwave联合仿真的流程和脚本。

项目框图

整体项目包含两部分,一个是I2C协议的控制模块,另一个是EEPROM模块(M24LC64),在SDA端口上配置一个上拉电阻。
在这里插入图片描述
项目工程文件如下:
1、rtl和tb文件夹分别为设计文件和仿真文件;
2、srcfile.txt 是仿真文件及对应的路径;
3、flow.bat是仿真脚本,进终端运行这个就可以dump出波形并调用gtkwave查看;
4、clr.bat是清除脚本,用于删除仿真的波形数据。

在这里插入图片描述

项目代码:
本项目采用的是iverilog和gtkwave完成前仿,利用bat脚本完成,首先将设计文件和仿真tb文件的路径和名称保存至txt文件中,文件内容如下:
文件名为“srcfile.txt”
在这里插入图片描述
bat脚本:

### clr.bat begin ###
echo "clean the simulation files "
del wave
del wave.lxt
echo "Finished"
### clr.bat end ###

#### flow.bat begin ####
echo "Compile Start"
iverilog -o wave -c srcfile.txt
echo "Compilation completed"
vvp -n wave -lxt2
echo "Generating Waveform Files"
echo "Open Waveform File"
gtkwave wave.lxt
#### flow.bat end  ####

tb文件加入dump波形的代码段:
iverilog和gtkwave仿真时需要在tb文件中加入以下代码:

	 initial begin
        $dumpfile("wave.lxt");
        $dumpvars(0, i2c_control_tb); // dump所有信号波形
    end 

仿真流程:
1、cd到对应的项目文件夹中,查看脚本和对应文件
在这里插入图片描述
2、执行flow.bat脚本
在这里插入图片描述
3、脚本结果和波形查看
在这里插入图片描述
4、gtkwave查看对应波形:
EEPROM读写数据正常,I2C驱动正常。
在这里插入图片描述
在这里插入图片描述
5、附上芯片手册中的读写波形:
支持Byte写和随机读
在这里插入图片描述
在这里插入图片描述

总结

I2C协议是一种串行通信协议,用于在集成电路之间进行数据传输。它使用两根线路,即时钟线(SCL)和数据线(SDA),通过主从模式进行通信。关于I2C协议读写EEPROM的例程总结:

  1. 初始化I2C总线:首先,需要初始化I2C总线,配置相关的硬件参数,例如时钟频率、引脚配置等。这通常由硬件相关的库或函数提供。
  2. 设置EEPROM设备地址:确定要进行通信的EEPROM设备的地址。每个EEPROM设备都有一个唯一的地址,可以通过查看设备的规格说明书或数据手册来获取。
  3. 发送写命令和内存地址:如果要写入EEPROM,首先发送写命令(0xA0)到设备的地址。然后,发送要写入数据的内存地址。
  4. 发送数据:将要写入EEPROM的数据逐个字节地发送到设备。每发送一个字节,需要等待设备的响应确认。
  5. 停止条件:完成数据写入后,发送停止条件(Stop Condition),即在SCL为高电平时,SDA线由低电平转为高电平。
  6. 发送读命令和内存地址:如果要读取EEPROM,首先发送写命令(通常为0xA0)到设备的地址。然后,发送要读取数据的内存地址。
  7. 重复启动条件:再发送一个重复启动条件,即在SCL为高电平时,SDA线由高电平转为低电平。
  8. 发送读命令和设备地址:将读命令(0xA1)发送到设备的地址,指示要读取数据。
  9. 读取数据:通过I2C总线接收从EEPROM设备返回的数据。每接收一个字节,需要发送ACK信号表示继续接收,直到接收完所有需要的数据。

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

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

相关文章

【CNN-FPGA开源项目解析】卷积层03--单格乘加运算单元PE 单窗口卷积块CU 模块

03–单格乘加运算单元PE & 单窗口卷积块CU 文章目录 03--单格乘加运算单元PE & 单窗口卷积块CU前言单格乘加运算单元PE代码模块结构时序逻辑分析对其上层模块CU的要求 单窗口卷积块CU代码逻辑分析 前言 ​ 第一和第二篇日志已经详细阐述了"半精度浮点数"的加…

Strtok函数切割字符串(附代码演示)

目录 1.认识Strtok函数 2.Strtok函数使用认识 3.Strtok使用代码示例 1.认识Strtok函数 C语言中的strtok函数是用来将字符串分割成若干个子串的函数。它的原型如上图所示 char *strtok(char *str, const char *delimiters);函数参数str为要被分割的字符串,参数del…

95 # express 二级路由的实现

上一节实现了兼容老的路由写法,这一节来实现二级路由 二级路由实现核心: 进入中间件后,让对应的路由系统去进行匹配操作中间件进去匹配需要删除 path,存起来出去时在加上 示意图: 代码实现如下: rout…

护理不良事件成因分析及预防措施,你知道哪些

不良事件上报管理系统源码 护理不良事件主要成因分析 1.查对制度不严:因不认真执行各种查对制度,而在实际护理工作中出现的不良事件仍占较高比例。具体表现在用药查对不严,只喊床号,不喊姓名,致使给患者输错…

【算法练习Day5】有效的字母异位词 两个数组的交集快乐数两数之和

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 有效的字母异位词两个数…

基于springboot+vue的青年公寓服务平台

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

K8SYaml文件详解及编写示例

文章目录 一.Yaml文件详解1.Yaml文件格式2.YAML 语法格式 二.Yaml文件编写及相关概念1.查看 api 资源版本标签2.yaml编写案例(1)相关标签介绍(2)Deployment类型编写nginx服务(3)k8s集群中的port介绍&#x…

Unity 内存性能分析器 (Memory Profiler)

一、 安装 安装有两种方式一: add package : com.unity.memoryprofiler方式二: From Packages : Unity Registry 搜索 Memory Profiler 二、 使用 打开:Windows - > Analysis - > Memory Profiler 打开MemoryProfiler界面&#xff0…

深入学习JVM(Java虚拟机)

目录 一.JDK、JRE、JVM的关系 1.1JDK(Java SE Development Kit) 1.2JRE( Java Runtime Environment) 1.3JVM(Java Virtual Machine) 1.4JDK、JRE、JVM的区别与联系 二.Class的生命周期 2.1加载 2.1.1 类加载器 2.1.2类加载机制 2.1.3双亲委派 2.2链接 2.2.1验证 2…

antd-vue 级联选择器默认值不生效解决方案

一、业务场景: 最近在使用Vue框架和antd-vue组件库的时候,发现在做编辑回显时** 级联选择器** 组件的默认值不生效。为了大家后面遇到和我一样的问题,给大家分享一下 二、bug信息: 三、问题原因: 确定不了唯一的值&a…

GEE:根据影像最小值和最大值自适应可视化参数设置

作者:CSDN @ _养乐多_ 本文将介绍根据影像最小值和最大值,自适应的设置影像可视化参数设置。 文章目录 一、核心函数二、代码示例三、代码链接一、核心函数 //计算影像的最小值和最大值,为了可视化 var imageMin = (image.reduceRegion({reduc

使用CRM管理销售渠道的 5 个重要优势

销售渠道的管理是创造积极客户体验的关键因素,对企业来说非常重要。大多数情况下,客户关系管理(CRM)系统可用于高效的销售渠道管理。那么,利用CRM系统管理销售渠道有哪些优势呢? 1) 有效的线索管理 销售渠…

CSS实现鼠标悬停图片上升显示

文章目录 前言一、实现效果二、实现思路 前言 当我们想在图片上面放置一些文字内容时,发现不管怎么放置,要么就是图片影响到文字的观感,要么就是文字挡住图片的细节,那么怎么可以既看到图片的细节又可以看到对图片的文字描述呢&a…

基于R语言分位数回归丨线性回归假设与分位数函数、线性分位数回归 、贝叶斯分位数回归、超越线性分位数回归等

目录 专题一 线性回归假设与分位数函数讲解 专题二 线性分位数回归 【代码实践】 专题三 贝叶斯分位数回归【代码实践】 专题四 超越线性分位数回归(一)【代码实践】 专题五 超越线性分位数回归(二)【代码实践】 更多应用 回…

怎样的外发文件管理办法 能够避免数据外发泄露?

在日常办公中,重要文件保密管理可谓“老生常谈”。但我们往往容易忽视,文件保密管理并非个体所能独立完成,在整个文件运转过程中,存在多名经手人,一人发生疏忽,则整个安全屏障都会被打破。 因此&#xff0c…

膝盖前交叉韧带断裂

等级、治愈(几乎不可能,除非康复阶段做得非常到位。手术后可恢复到90%),饮食,康复训练(完全康复)、心理作用 赔偿:工商(分出两份),伤残证&#x…

Spring Boot 如何实现单点登录(SSO)

当今的应用程序越来越多地采用了微服务架构,这就引出了一个重要的问题:如何实现单点登录(Single Sign-On,简称SSO)来确保用户在多个微服务之间无需重复登录。Spring Boot是一个流行的Java框架,它提供了一些…

旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著作想象和世界一样宽广

旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著作想象和世界一样宽广

AB试验(四)基于规范流程的一个案例分析

AB试验(四)基于规范流程的一个案例分析 确定目标和假设 业务场景:某音乐APP,通过历史数据发现一些便利功能往往有着较高的留存和续订。但是这些便利功能的使用率并不高。调研发现,由于APP崇尚简洁设计,因…

排序算法二 归并排序和快速排序

目录 归并排序 快速排序 1 挖坑法​编辑 2 Hoare法 快排的优化 快排的非递归方法 七大排序算法复杂度及稳定性分析 归并排序 归并排序是建立在归并操作上的一种有效的排序算法,将以有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,在使子序列段间有序.若将两…