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. Python开发【第二章】:模块和运算符

    一.模块初识: Python有大量的模块,从而使得开发Python程序非常简洁.类库有包括三中: Python内部提供的模块 业内开源的模块 程序员自己开发的模块 1.Python内部提供一个 sys ...

  2. [tomcat] 连接池参数maxActive、maxIdle 、maxWait 等

    maxActive 连接池支持的最大连接数,这里取值为20,表示同时最多有20个数据库连接.设 0 为没有限制.maxIdle 连接池中最多可空闲maxIdle个连接 ,这里取值为20,表示即使没有数 ...

  3. beego入门笔记

    Beego Learn Note 示例环境在Deepin系统下. deepin 15.9.3 ├── Beego : 1.11.2 ├── GoVersion : go1.12.4 ├── GOOS ...

  4. pyrhon 第一个小购物车例子

    product_list=[[],[],[],[]] shopping_list=[] salary = input("请输入你的工资:") if salary.isdigit() ...

  5. 笔记 - C#从头开始构建编译器 - 2

    视频与PR:https://github.com/terrajobst/minsk/blob/master/docs/episode-02.md 作者是 Immo Landwerth(https:// ...

  6. iOS - The file “XXX.app” couldn’t be opened because you don’t have permission to view it.

    当引入第三方的框架的时候 容易产生以下问题: The file “XXX.app” couldn’t be opened because you don’t have permission to vi ...

  7. arm-none-eabi/bin/ld: build/com.zubax.gnss.elf section `.text' will not fit in region `flash'

    出现如下错误: /arm-none-eabi/bin/ld: build/com.zubax.gnss.elf section `.text' will not fit in region `flas ...

  8. 阿里云服务器(Ubuntu16.04 64位)的使用

    购买阿里云服务器 1.打开阿里云官方网站,账号登录,选择产品中的云服务器 ECS 2.根据自身需求,选择合适的阿里云服务器系统,(1)点击一键购买,(2)选择地域,(3)根据自身需求,选择系统,这里选 ...

  9. OpenStack kilo版(4) Glance部署

    Glance简介 Glance-api:接受云系统镜像的构建.删除.读取请求 Glance-Registry:云系统的镜像注册服务 部署在controller节点 配置数据库 MariaDB [(no ...

  10. 阿里云给自己实例扩容-扩展分区和文件系统_Linux系统盘

    阿里云买了台服务器ecs 磁盘容量40g 发现已经用了30g了  赶紧扩容 进入 e'cs实例 进入左边菜单 存储与快照 然后选择右边的扩容 然后支付 成功后 进入服务器 df -h 发现怎么还是没变 ...