FPGA实现I2C读写EEPROM

I2C简介及时序

I2C 总线由数据线 SDA 和时钟线 SCL 两根线构成通信线路,既可用于发送数据,也可接收数据。I2C_SCL 和 I2C_SDA 均需接上拉电阻,也正因此,当总线空闲时,这两条线路都处于高电平状态。

图1 I2C整体时序图

图2 I2C具体时序图

在串行时钟线 SCL 为低电平状态时, SDA 允许改变传输的数据位,在 SCL 为高电平状态时, SDA 要求保持稳定,相当于一个时钟周期传输 1bit 数据,经过 8 个时钟周期后,传输了 8bit 数据,即一个字节,第 8 个时钟周期末,主机释放 SDA 以使从机应答。在第 9 个时钟周期,从机将 SDA 拉低以应答;如果第 9 个时钟周期, SCL 为高电平时, SDA 未被检测到为低电平,视为非应答,表明此次数据传输失败。第 9 个时钟周期末,从机释放 SDA 以使主机继续传输数据,如果主机发送停止信号,此次传输结束。

EEPROM简介

EEPROM (Electrically Erasable Progammable Read Only Memory, E2PROM)即电可擦除可编程只读存储器,是一种常用的非易失性存储器(掉电数据不丢失)。

本次实验所用的 AT24C64 存储容量为 64Kbit,内部分成 256 页,每页 32 字节, 共有 8192 个字节,且其读写操作都是以字节为基本单位。

器件地址和字节地址

器件地址

       当多个 I2C 器件挂接在总线上时,需要对不同器件进行区分,这就这涉及到器件地址。总线上的每个器件都是有地址的,有些地址是固定的,有些地址是可编程的。

       进行数据传输时,主机首先向总线上发出开始信号,对应开始位 S,然后按照从高到低的位序发送器件地址,一般为 7bit,第 8bit 位为读写控制位 R/W,该位为 0 时表示主机对从机进行写操作,当该位为 1时表示主机对从机进行读操作,然后接收从机响应,对于 AT24C64 来说,其传输器件地址格式如下图所示。

图3 器件地址格式示意图

字地址

        发送完第一个字节(7 位器件地址和一位读写控制位)并收到从机正确的应答后就开始发送字地址(Word Address) 。本次实验用到的 EEPROM 存储器,内部就是一系列顺序编址的存储单元。AT24C64 的存储单元容量为 64Kb=8KB,需要 13 位(2^13=8KB)的地址位,因此需要双字节地址。AT24C64的字节地址为0~8191。

图4 单字节地址

图5 双字节地址

I2C写操作EEPROM

       I2C写操作EEPROM有两种方式,一种是单次写,一种是连续写,具体时序图如图6、7所示。对于 AT24C64 的页写,是不能发送超过一页的单元容量的数据的,而AT24C64 的一页的单元容量为 32Byte,当写完一页的最后一个单元时,地址指针指向该页的开头,如果再写入数据,就会覆盖该页的起始数据

图6 单次写(字节写)时序

图7 连续写时序

I2C读操作EEPROM

        I2C读操作EEPROM有三种方式:1、当前地址读时序;2、随机(任意)地址读时序;3、顺序读时序。

图8 当前地址读时序

图9 随机(任意)地址读时序

​​​​​​​

图10 顺序读时序

四段式状态机实现I2C驱动

本次实验采用四段式状态机完成单次写和随机(任意)读的方式进行 EEPROM 读写测试

图11 I2C驱动模块状态跳转图

在清楚了实现I2C驱动的状态跳转图以后,我们在用四段式状态机来实现改功能。

定义接口信号:

参数

CLK_FRE

系统时钟频率,默认50MHz

SCL_FRE

I2C时钟频率,默认250KHz,最大400KHz

信号

clk

in

输入时钟频率

rst_n

in

复位信号,低有效

scl

out

I2C时钟信号

sda

inout

I2C数据信号

slave_device_addr

in

从机器件地址

bit_ctrl

in

字地址位控制,1为双字节0为单字节

i2c_done

out

I2C读/写一次操作完成

i2c_ask

out    

I2C应答标志 0:应答 1:未应答

user_wr_rd_addr

in

写地址或读地址

user_wr_en

in

写使能,1个时钟周期脉冲

user_wr_data

in

写数据

user_rd_en

in

读使能,1个时钟周期脉冲

user_rd_data

out

读到的数据

状态机实现程序:

FIRST:同步时序的 always 模块,格式化描述次态迁移到现态寄存器。

SECOND:组合逻辑的 always 模块,描述状态转移判断条件。

THIRD:用 assign 定义转移条件

FOURTH:设计输出信号

SCL:

SDA:

仿真结果

        工程利用VIO来设置写入/读取地址、写入数据、写使能、读使能测试EEPROM。

写时序:

读时序:

如有问题欢迎讨论:1149239185@qq.com

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在FPGA实现I2C驱动,可以编写Verilog代码来实现。可以创建两个Verilog文件,一个是顶层模块(i2c_top),另一个是读写模块(i2c_rw)。在顶层模块中,可以实例化读写模块(i2c_rw)和驱动模块(i2c_drive)。读写模块(i2c_rw)可以调用IIC驱动对从机AT24C64模型进行写入和读取操作,并通过比对结果来验证主机对从机的IIC写读是否成功。\[1\] 在I2C总线上,通常有多个设备,其中FPGA是主机器件,而EEPROM存储器、RCT时钟芯片和音频解码芯片属于从机芯片。I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线,只需要两根线即可在连接于总线上的器件之间传送信息。\[2\]\[3\] 因此,通过编写Verilog代码,可以在FPGA实现I2C驱动,实现主机与从机之间的数据传输和通信。 #### 引用[.reference_title] - *1* [FPGA实现IIC协议(二)----IIC总线的FPGA实现(单次读写驱动)](https://blog.csdn.net/wuzhikaidetb/article/details/120752864)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [FPGAI2C的原理及应用(含有源码)](https://blog.csdn.net/weixin_44448586/article/details/118050395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【FPGAFPGA基于i2ceeprom读写](https://blog.csdn.net/weixin_45888898/article/details/122889135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值