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. AS3.0 位图翻转、旋转

    /* * * *-------------------------* * | *** 位图翻转.旋转 *** | * *-------------------------* * * 作 者:fengz ...

  2. AS3动画效果常用公式

    缓动公式: sprite.x += (targetX – sprite.x) * easing;//easing为缓动系数变量 sprite.y += (targetY – sprite.y) * e ...

  3. Redis 如何与数据库事务保持一致

    考虑一个问题,redis 如何 与 数据库保持一致性的问题. 举栗子:如果我们在开发过程中遇到这样的一种情况,我们删除 redis中token 的同时 也需要修改数据库中 储存的 token 的状态为 ...

  4. X5内核浏览器video自动全屏解决办法-canvas

    最近在做手机端上面播放视频的项目,但是在安卓上面,video的播放是脱离页面,置于最顶层的,所以带来了很多问题,为了解决这个问题,查看了多方资料,写了下面简单的demo,方便以后使用. 下面就是运用c ...

  5. iOS 中 UIView 和 CALayer 的关系

    UIView 有一个名叫 layer ,类型为 CALayer 的对象属性,它们的行为很相似,主要区别在于:CALayer 继承自 NSObject ,不能够响应事件. 这是因为 UIView 除了负 ...

  6. flutter常见编译运行等奇怪问题的汇总汇(l转)

    1. flutter ios 卡死在闪屏页:解决办法: 1) flutter doctor 2) flutter clean 3) flutter build ios --release 4) Arc ...

  7. SAP Cloud for Customer的Container应用设计原理

    来自Jerry的同事,Yang Joey. 相信大部分C4C的UI developer包括我刚开始的时候都会比较好奇我们平时写的javascript代码是如何运行在移动设备上的,同样的,我也对这个问题 ...

  8. springcloud工程建立 父工程+公用子模块+微服务提供模块

    建立 Java Working Set:工程多的时候可以展开收缩,方便管理 切换到Package Explorer视图,并点击视图右侧下箭头,选择Working Sets,如下图: 建立父工程,将后续 ...

  9. kvm虚拟机在线调整硬件配置

    #centos5.x版本不支持动态调整内存,CPU,以下是在centos6.x上测试 1.查看虚拟机信息 shell> virsh dumpxml cos_v1 | head -n 10 < ...

  10. DNS服务——搭建企业内网DNS服务器的作用

    前言 DNS服务——服务端 和 客户端 配置 介绍了如何在DNS安装DNS服务,更改一下配置文件就可以依据根提示解析全球域名.既然使用互联网上的DNS服务器就可以解析全球域名,为何还要自掏腰包搭建DN ...