单 EEPROM 与 FPGA 间I2C通信的 Verilog 实现思想(授人与渔)

前言:关于 I2C 通信协议时序详细介绍在我的这篇文章“基于 AT24C02 2-Wire serial EEPROM 的 I2C 协议说明”,可以简单回顾一下再来看这篇文章,尤其是 时序 这块。

一、FPGA 与 单EEPROM 的通信链路。
在这里插入图片描述
这里 A0-A2 接地,代表其设备地址为 000 。

二、时序

I2C通信的两个端口 SCL 和 SDA,要做就是如何对这两个端口进行操作。
EEPROM 的 串行时钟 SCL 端由 FPGA 生成,所以必须生成;
SDA 上的所有数据通信都是基于 SCL,所以必须控制好在 SCL 的相应相位上对 SDA 进行相应操作。

1.SCL 串行时钟生成

每个 EEPROM 有自己允许的最高串行时钟频率 fscl,这个需要查需要使用的 DataSheet,以AT24C02 为例,其 DataSheet 中的 fscl 如下图所示:
在这里插入图片描述
这里使用供电电压 VCC 为 3.3V 的话,则 fscl 最高为 400kHz,如果 FPGA 使用的时钟频率 fclk 为 50MHz,若采用 AT24C02 的最高频率,则 clk 每 50M / 400 k /2 = 62.5 个周期,scl 就翻转一次(实际使用不会采取含有小数的周期)。

2.操作数据 SDA 的相位生成

SDA 上数据传输是基于 SCL (回顾开头提到的文章),为了阅读方便将 SDA 的时序再放出来:
在这里插入图片描述

在这里插入图片描述

(1)开始位 START :时钟线 SCL 保持高电平期间,数据线 SDA 电平从高变低,即为启动:
(2)停止位 STOP:时钟线 SCL 保持高电平期间,数据线 SDA 电平从低变高,即为停止;
(3)有效数据包括 DEVICE ADDRESS、WORD ADDRESS、DATA 和 ACK,这些数据 1bit 接着 1bit 的传输,在时钟线SCL为高电平时间段内,要想成功传输数据,数据线 SDA 必须为固定状态(要么高要么低),不允许有跳变,那么就牵涉到 SDA 上传输1bit 数据后,下 1bit 数据什么时候开始转变?

仔细看上图发现:
(1)开始位 START 和 停止位 STOP 是在 SCL 处于高电平期间 由高到底 和 由低到高,为了 SDA 上数据传输的稳定和 方便,可以将 SCL 处于高电平均分为两部分,在两部分的中间对 SDA 数据进行 由高到底 和 由低到高 的跳变就能达到效果;
(2)中间有效数据的跳变,是在 SCL 处于低电平期间,那么同样可以将 SCL 处于低电平均分为两部分,然后进行数据跳变。

综上也即将 SCL 的每个时钟周期分为 4 个部分,就可以达到对 SDA 上所有类型数据的操作。

三、状态机

状态机1——确定读、写状态
state1:读、写操作未开始,此时需要将 SDA 拉高;
state2:写操作;
state3:读操作。

状态机2——读、写操作步骤
(1)读
state1:发送写设备地址;
state2:发送写字节地址;
state3:发送字节数据。

(2)写
state1:发送读设备地址;
state2:发送读字节地址;
state3:再次发送读设备地址(可查看开头提到的文章);
state4:读出字节数据。

状态机3——读、写操作步骤内部
state1—state9:START、8 bit
state10:ACK
state11:STOP
根据读、写操作的不同,上述11个状态会有所不同组合。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值