I2C是一种串行总线协议。 目前几种常用的串行总线有UART、SPI和I2C协议。UART协议的总线只有两条,发送(Transmit:TX)和接收(Receive:RX),没有时钟信号,这就要求两位数据的间隔要相同,它传送数据有严格的规定,每个数据以相同的位串形式传送,每个位串由起始位、数据位、奇偶位校验和停止位组成。SPI有三线和四线模式,四条总线分别为SCLK(时钟)、MISO(主器件数据输入,从器件数据输出)、MOSI(主器件数据输出,从器件数据输入)、SS(从器件使能信号),SPI总线由主机提供时钟,为同步通信,有两条总线进行数据传输,可以同时进行收发数据,为双工模式。三线不包含SS信号,其相应的数据传输,根据时钟极性和时钟相位的不同有四种情况,其传送数据的格式则与I2C基本类似。I2C总线只有两条,SDA(数据传输)、SCL(时钟),需要双向IO口支持,而且需要上拉电阻的协助,因此狂干扰能力弱,通常用于同一板子上芯片间的通信。

硬件结构:每一个I2C总线器件内部的SDA,SCL引脚结构一样,引脚的输出驱动与输入脉冲连在一起,输出为漏极开路的场效应管,输入为一只高输入阻抗的同相器。SCL和SDK借助上拉电阻行成“线与”关系,引脚在输出信号的同时还将引脚上的电平,检测是否与刚才输出一致。为“时钟同步”和“总线仲裁”提供硬件基础。时间同步的实现:可以在应答信号后使SCL延长低电平时间的方法来通知主机。SCL线上的低电平时间是由时钟低电平最长的器件决定;高电平时间是由时钟高电平最短的器件决定。从而实现时钟同步。

数据传输:主机发送数据传输流程:主机检测到总线处于空闲状态,发送启动信号S(数据线电平由低电平变为高电平);主机发送一个命令字节,该命令字节由7位的外围器件地址和1位读/写控制位(R/W=0);相应的从机收到命令字节后,向主机发送应答信号ACK=0(数据线上为低电平);主机收到从机的应答信号后开始发送下一个数据字节;当主机发送最后一个数据字节并收到从机的ACK时,通过向从机发送一个停止信号P(数据线电平由低电平变为高电平)结束本次通信并释放总线。从机收到信号P后也退出通信。

主机接收数据流程:主机发送启动信号,接着发送命令字节(R/W=1);对应的从机收到地址字节后,返回一个应答信号并向主机发送数据;主机收到数据后向从机反馈一个应答信号;从机收到应答信号后再向主机发送一个数据;主机完成接收数据后,向从机发送一个非应答信号(ACK=1),从机收到应答信号后,便不再发送数据;主机 发送应答信号后,发送一个停止信号,释放总线结束通信。Tips:主机所接收的数量由主机自身决定,发送非应答信号的作用:前一个数据接收成功;停止从机的再次发送。

以一个实例(开发板为EP2C8-2010)分析了解I2C协议基本功能:该例实现通过I2C总线对EEPROM(电可擦可编程只读存储器,掉点后数据不丢失在专用的设备商可擦除)的读写,重点在于对I2C总线协议时序的掌握,即用I2C总线要求的格式将输入写入之后读出。为实现该功能,完成两个器件间的通信,我们需要一个主机和从机,设计实例中的signal模块和EEPROM_WR模块模拟主机,EEPROM模块模拟从机。当写入数据时,EEPROM_WR模块从signal模块调取数据,通过I2C总线向EEPROM写数据。当读出数据时,EEROM_WR仍然通过SDA和SCL总线读出EEPROM中的数据,再输入给signal模块。开发板存在EEPROM器件,而signal模块可以通过创建IP核(基于ram)来实现,因此只有EEPROM_WR模块是要写入FPGA中的可综合模块,而signal模块和EEPROM模块都是 仿真模块。

每个正在接收数据的从机EEPROM在接到一个字节的数据后,通常需要发出一个应答信号。而每个正在发送数据的从机EEPROM在发出一个字节的数据后,通常需要接收一个应答信号。EEPROM读写控制器必须产生一个与这个应答位相联系的额外的时钟脉冲。在EEPROM读写控制器对EEPROM完成的最后一个字节产生一个高的应答位,这叫做非应答信号,随后给EEPROM一个结束信号。

由于开发板EP2C8-2010开发板采用的EEPROM是AT24C02,所以EEPROM_WR模块的编写应该满足AT24C02的写入和读取。如下图所示是AT24C02字节写入帧格式,第一位是启动信号,第2位到第8位是控制字节(从机地址:第2-5位是1010,6-8位是页地址),第9位是写操作(W/R置零),第10位是从机EEPROM给的应答信号0,第11-18位是存储单元地址,19位是应答信号0,第20-27位是写入的数据,第28位是应答信号,29号主机发送停止信号P。

而与之相对应的字节读取格式也大同小异,先写入控制字节和存储地址,然后是启动信号与控制字节信号,这时控制字节第八位(W/R置1),读取数据,完成读取时,主机将SDA拉高作为非应答信号,最后是停止位。

模拟I2C协议学习点滴之原理框架的更多相关文章

  1. 模拟I2C协议学习点滴之复习三极管、场效应管

    晶体三极管分为NPN和PNP型两种结构形式,除了电源极性的不同工作原理是大致相同的.对于NPN管,它是由2块N型半导体夹着一块P型半导体所组成的,发射区与基区之间形成的PN结称为发射结,而集电区与基区 ...

  2. 模拟I2C协议学习点滴之程序相关定义

    由于主机和从机都会给数据线SDA发信号,比如主机先给SDA发送数据后,从机收到数据后发送应答信号将SDA拉低,故SDA类型设定为inout.而DATA设定为inout类型,是起到校验通信的作用(后续的 ...

  3. I2C协议学习笔记

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/wzt_007/article/detai ...

  4. 学习笔记一:I2C协议学习和Verilog实现

    ////////////////////////////////////////////////// //clk = 20 MHz ,一个周期50ns //sck = 100 kHz (scl) ,一 ...

  5. GPIO实现I2C协议模拟(1)

    最近需要用GPIO模拟I2C协议,如果是在Linux下面比较简单,但在Windows下面,是否有没Linux那么简单了. 索性自己对I2C协议还有一些了解,翻了SPEC并结合示波器量出的实际信号分析, ...

  6. I2C总线协议学习笔记 (转载)

    1.I2C协议   2条双向串行线,一条数据线SDA,一条时钟线SCL.   SDA传输数据是大端传输,每次传输8bit,即一字节.   支持多主控(multimastering),任何时间点只能有一 ...

  7. GPIO实现I2C协议模拟(2)

    接着上一节继续补充 结合上一节的描述 写Slave的过程如下(BYTE) 读Slave的过程如下(BYTE) 分为两段 第一段 ,写OFFSET,第二段读数据 WORD的方式与BYTE大同异 读行为 ...

  8. (原创) 巩固理解I2C协议(MCU,经验)

        题外话:这几天天气突然转冷了.今天已是11月23日了,查查黄历,昨天(11月22日)刚好是小雪,一夜温度骤降,果然老祖先的经验有灵验!冬天来了,还是多加加衣服,注意保暖! 1.Abstract ...

  9. STM32F10x_模拟I2C读写EEPROM

    Ⅰ.写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件.但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1.我们有必要学习I ...

随机推荐

  1. PPPoE中间人拦截以及校园网突破漫谈

    本文首发于PPPoE中间人拦截以及校园网突破漫谈,转载请注明出处. PPPoE中间人拦截以及校园网突破漫谈 校园生活快结束了,之前还有点未完成的想法,趁着这两天有兴趣搞搞. 此文面向大众是那种在校园内 ...

  2. Springboot对JPA的支持及使用

    目的: 1.springboot之jpa支持 2.Springboot+bootstrap界面版之增删改查及图片上传 springboot之jpa支持 导入相关pom依赖 <dependency ...

  3. Python、PyCharm、Django框架安装

    一.下载Python环境 1.1 下载Python环境,以下网址: https://www.python.org/downloads/release/python-373/ 下载安装包: 1.2点击安 ...

  4. Spring Boot整合Spring Security自定义登录实战

    本文主要介绍在Spring Boot中整合Spring Security,对于Spring Boot配置及使用不做过多介绍,还不了解的同学可以先学习下Spring Boot. 本demo所用Sprin ...

  5. Jerry带您了解Restful ABAP Programming模型系列之二:Action和Validation的实现

    相信通过Jerry的前一篇文章 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用,想必大家对Restful ABAP Programming模型已经有 ...

  6. 【SpringMVC】统一异常处理

    一.需求 二.统一异常处理解决方案 2.1 定义异常 2.2 异常处理 2.3 配置统一异常处理器 2.4 异常处理逻辑 一.需求 一般项目中都需要作异常处理,基于系统架构的设计考虑,使用统一的异常处 ...

  7. 一个让Java事半功倍的反射库

    在Java和Android中,我们常常会使用反射来达到一些兼容的目的.Java原生提供的反射很是麻烦,使用起来很是不方便.比如我们想要调UserManager的静态方法get,使用原生的实现如下 tr ...

  8. py map reduce filter 总结

    array=[1,3,4,71,2] ret=[] for i in array: ret.append(i**2) print(ret) #如果我们有一万个列表,那么你只能把上面的逻辑定义成函数 d ...

  9. GitHub开源的10个超棒后台管理面板

    目录1.AdminLTE 2.vue-Element-Admin 3.tabler 4.Gentelella 5.ng2-admin 6.ant-design-pro 7.blur-admin 8.i ...

  10. python自动化

    自动化测试一些问题 什么是自动化测试? 自动化测试,顾名思义,自动完成测试工作.通过一些自动化测试工具或自己造轮子实现模拟之前人工点点/写写的工作并验证其结果完成整个测试过程,这样的测试过程,便是自动 ...