zoukankan      html  css  js  c++  java
  • IIC时序详解

    Verilog IIC通信实验笔记

    Write by Gianttank

    我实验的是 AT24C08的单字节读,单字节写,页读和页写,在高于3.3V系统中他的通信速率最高400KHZ的,我实验里用的是100KHZ的速率。图1是硬件原理图clip_image002[5] 

    图1

     clip_image004

     图2

    图2是器件地址,我的原理图是A2接高。

    IIC通信协议中要注意的地方:

    1. 当时钟线SCL 高电平时,如果把数据线SDA 从高电平拉到低电平,则表示通信开始(START);如果把数据线SDA 从低电平拉到高电平,则表示通信结束(STOP)。SDA数据不变,视为数据采样。

    2. 前一个STOP 结束后。与下一个START开始要保证5ms的间隔。

    3. 页写有字节限制,而页读没有,可以一次读出所有的数据。

    4. SDA信号在FPGA为接受方时要设置为高阻态。

    5. 应答信号永远是接收方发送的,这个很重要,我就是卡在这里几天没找到原因。FPGA在读数据的时候,第9个周期是FPGA发低电平给EEPROM的。

    图3为RTL视图clip_image006

    图3

    引脚定义

    信号名称

    方向

    描述

    clk

    input

    50M的主时钟

    rst_n

    input

    复位信号

    sw1

    input

    按键1 低电平有效 按下执行字节写

    sw2

    input

    按键2 低电平有效 按下执行字节读

    sw3

    input

    按键3 低电平有效 按下执行页写

    sw4

    input

    按键4 低电平有效 按下执行页写

    SDA

    inout

    IIC数据端口

    SCL

    output

    IIC时钟端口

    leddata

    output

    数码管段选

    ledcom

    output

    数码管位选

    代码中分了两个模块,iic_com 模块除了执行和I2C 通信有关的代码设计外,还有按键检测部分,而ledshow 模块只是驱动数码管显示读出的数据。对于这个通信的过程,内部使用了一段式状态机进行设计。图4是状态机的状态图。具体每个状态见程序。

     clip_image008

    4

    1.字节写

    clip_image010

    5

    Modelsim后仿真的图

    clip_image012

    蓝色为sda数据线高阻态,fpga接受eeprom应答。写入数据88h。

    2.字节读

    clip_image014

    6

    Modelsim后仿真的图

    clip_image016

    3.页写

    clip_image018

    7

    因为我只有8个数码管,所以我程序里的页写,页读都只有4个数据。

    Modelsim后仿真的图

    clip_image020

    可以看到写入数据位21h,43h,65h,87h。

    4.页读

    clip_image022

    8

    随机字节读和当前字节读都能触发页读,我只做了随机字节读

    Modelsim后仿真的图

    clip_image024

    这里就是 应答是fpga应答给eeprom的。

    最后希望这篇文档能帮助对IIC协议还不够了解的同学。

    源程序在下一篇文章中。

  • 相关阅读:
    应用市场高速下载以及网页端调起APP页面研究与实现
    linux系统下,添加硬盘并挂载到操作系统的shell 脚本范例
    linux系统下,新加硬盘并把现有的/home目录扩容。
    Java打印裴波那契数列
    JAVA排序的方法
    Java语言输出菱形图型
    Oracle中的sql脚本语言中的循环语句介绍
    Oracle存储过程的创建实例和调用实例
    数组常用方法3---新增元素
    数组常用方法2——修改数组元素。
  • 原文地址:https://www.cnblogs.com/lize19940412/p/7094612.html
Copyright © 2011-2022 走看看