『FPGA通信接口』串行通信接口-IIC(2)EEPROM读写控制器

在这里插入图片描述

文章目录

  • 1.EEPROM简介
  • 2.AT24C04简介
  • 3.逻辑框架设计
  • 4.随机读写时序
  • 5.仿真代码与仿真结果分析
  • 6.注意事项
  • 7.效果
  • 8.传送门

1.EEPROM简介

EEPROM (Electrically Erasable Programmable read only memory) 是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。在嵌入式控制系统中常常用来保存设备初始化所需数据。发展过程:ROM – > PROM –> EPROM –> EEPROM,大概就是从只能复杂的一次写入,发展到后来的电子可擦除。三种类型的存储器大概的区别,FLASH用于存放程序,在程序运行过程中不能更改,我们编写的程序是烧录到FLASH中的;RAM用作程序运行时的数据存储器;EEPROM用于存放数据,是用来保存掉电后用户不希望丢的数据,开机时用到的参数。运行过程中可以改变。多数EEPROM器件用到的都是IIC协议,本节以ATMEL(现属于MicroChip)的AT24C04芯片为例,基于IIC协议,提供一种驱动写法,完成对EEPROM的读写操作。本例用到的资料和工程链接见文末🎈

2.AT24C04简介

该系列芯片包含了AT24C01,AT24C02,AT24C04,AT24C08,AT24C16,AT24C32,AT24C64,AT24C128,AT24C256,其中不同的后缀代表不同的容量,单位是kbit,如AT24C04代表容量为4kbit。一个地址对应一个大小为8bit的数据单元,4kbit=512Bytes,即需要9bit二进制表示512个地址。因此写操作就是通过IIC协议分别写入EEPROM内部地址和相应数据即可,读操作也是类似的。由于存在协议的开销,如果按照这种方法进行读写效率会很低,于是生成芯片的厂家将内部地址分为“页”,在同一个“页”内可以连续读写,而不需要重新发起IIC的起始信号。例如AT24C04容量为4kbit分为了32页,每页16Bytes。即可以连续写的个数是16次,如下图所示(页写,或者叫连续写),一次IIC传输,发送了一次EEPROM地址,随后就连续发送数据,芯片内部会自动处理,但是当数据个数超过当前页中的字节时,会覆盖当前页中的第一个字节。当进行读操作时会自动翻页。需要注意的是,内部地址有9位,低8位作为单独的字节,第9位是器件地址部分的最后一位。芯片的器件地址为1010,其地址控制字格式为1 0 1 0 A2 A1 P0 R/W,1010为固定的值,而A2 A1是芯片引脚,具体值看板卡连接,P0代表内部地址的第9位。其他特性包括,两线串行接口(IIC);400kHz兼容性;具有写保护引脚,当该引脚拉高的时候,禁止所有写操作,用于硬件数据保护;高可靠性,100万次写入周期,数据可保留100年。
在这里插入图片描述

3.逻辑框架设计

假定一个应用场景是,向EEPROM最低位地址写入一个数据值为0x5a,然后在读出来,二者相等则认为读写正确。在这个应用中,何时对EEPROM执行什么操作,读写几个数,把这个问题且叫做“应用层“要解决的问题;而不同的EEPROM器件读写操作略有不同,例如容量大的器件可能需要两个地址字节,从另一个角度看,不同IIC的器件对数据传输顺序也有不同的要求,把区分器件称之为“器件层”;在此场景中,FPGA读写EEPROM使用的是IIC协议,因此一定有一层是解决驱动问题,称之为驱动层。通过这三层协调,完成应用需求。具体协调如下图所示。
在这里插入图片描述

应用层根据应用需求,产生信号告诉器件层执行一次动作,例如,执行一次EEPROM写入操作,当然要提供写入的数据内容和写入的地址。器件层将一次EEPROM写入操作分解为,首先要写器件地址与从机设备通信,然后写入EEPROM内部地址,最后写入数据,调用驱动层完成这些数据的下发。驱动层将按照器件层的指示,将数据打包成IIC协议的数据放到SDA线上发送,并完成起始位、终止位的生成和从机响应的接收和处理,以完成一次应用层指示的操作。请结合代码将有更准确的认识,关于驱动层请参考 上一篇:FPGA实现IIC接口协议这样做的好处是,当换成其他器件或者相同器件不同应用的时候,需要修改的地方很明确,便于程序的扩展和移植。

4.随机读写时序

在这里插入图片描述 随机读时序如上图所示,随机写时序如下图所示。连续读或连续写的时序略有不同,请查看芯片手册。@的含义是,当是AT24C08的时候@为第9bit地址即A9,而当是AT24C04的时候@为芯片引脚A1。
在这里插入图片描述

5.仿真代码与仿真结果分析

仿真顶层文件sim_ctrl,解复位之后,其执行步骤如下所示,步骤与图中示意序号对应一致。

①下面代码为应用层代码,指示器件层,生成一条“向0地址写入数据0xA5的指令”

②iic_ctrl模块接到上层eep_en的指令,将所有携带信息全部寄存,并产生eep_busy信号指示ctrl模块状态。

③根据上层模块的指示,例如是EEPROM的读还是写操作,读几个地址,这些情况将这些指示分解成多个8bitIIC操作,然后下发。如图所示,首先在收到eep_en信号后,1状态判断读还是写,2状态分解并“调用”写操作任务,8状态等待iic_busy信号就绪(一个周期),3状态等待busy信号清零。 另外关注,一个上层的读写命令被iic_en和cmd信号,以及data信号分解成了几种不同的8bit操作。

④可以在图中清晰的看到,iic_driver模块接到上层模块的指示,SCL信号生成400KHz时钟,SDA信号按照既定顺序输出bit(上拉电阻,因此无需输出高电平)。(下图中第二个eep_en脉冲指示读出操作,依照上述代码执行出来仿真结果是对的)
在这里插入图片描述
仿真代码如下:

module sim_ctrl();
reg clk_50;
reg rst_n;
reg eep_en;
reg eep_rw;
wire [7:0]eep_rd_data;
wire eep_rd_valid;
wire eep_busy;
reg [7:0]eep_wr_data;
reg [8:0]eep_addr;
wire iic_clk;
wire iic_data;
initial begin
    rst_n = 0;
    clk_50 = 1;
    eep_en = 0;
    eep_rw = 0;
    #1000
    rst_n = 1;
    //写入操作
    #1000
    eep_en = 1;
    eep_rw = 0;
    eep_wr_data = 8'hA5;
    eep_addr = 9'd0;
    #20
    eep_en = 0;
    @(negedge eep_busy)
    #20
    eep_en = 1;
    eep_rw = 1;
    eep_addr = 9'b0; 
    #20
    eep_en = 0;
end
always #10 begin
    clk_50 = ~clk_50;
end
iic_ctrl sub_for_one_rw(
    .clk_50(clk_50),
    .rst_n (rst_n),
    .eep_en(eep_en), //eep前缀代表eeprom,代表执行一次eeprom操作
    .eep_rw(eep_rw),
    .eep_wr_data(eep_wr_data),
    .eep_addr(eep_addr),
    .eep_rd_data(eep_rd_data),
    .eep_rd_valid(eep_rd_valid),
    .eep_busy(eep_busy),
    .iic_clk(iic_clk),
    .iic_data(iic_data)
);
endmodule

​

6.注意事项

(1)工程里有三种读写操作指示信号需要区分

①第一种是在cmd[0]指示,1为读操作,0为写操作。此指令指示的是向iic_driver模块指示一个8bit操作时,该8bit操作是读还是写。例如eeprom执行一次随机读操作,那首先要写入器件地址,然后要写入要读取的地址,在写入器件地址,最后才能读取数据。上述四个步骤中,只有最后一步读取数据,iic_driver模块执行的是读8bit操作。

②第二种是顶层应用模块中的eep_rw,该信号指示的是是执行器件的读还是写操作,例如1代表执行eeprom读操作。

③第三种是IIC协议要求的,指示该次通信是读还是写,“该次通信”是指在一个起始位和一个终止位之间的通信称之为一次通信,该读写指示位应该在带起始位的8bit操作中的最后一个bit打出。例如,一次随机EEPROM读操作分为两次IIC通信,第一个为写入器件地址加写入内部地址,该通信是写操作;第二次是写入器件地址,读出有效数据,该次通信是读操作。这个通信指示位是按照8bit操作中的数据部分进行的。

(2)写保护功能,手册中:When the WP pin is connected directly to V CC , all write operations to the protected memory are inhibited.当该引脚接高电平时,禁止写操作,接低电平时可以写操作,如果悬空也可以写操作,但建议明确上下拉。实际应用中,在产品出厂之前拉低该信号以写入初始化配置等,在产品交付后拉高以禁止写操作。

(3)在写完一次之后 应该等待时间,等待写入数据进入到EEPROM内部电路,才能开始下一次的读写操作,否则无法正确操作,手册中是t WR ,即 self-timed write cycle。During the internally self-timed write cycle, any attempts to read from or write to the memory array will not be processed. 至少是5ms.如未达到5ms间隔,强行写入或者读出,将导致从机应答失败,反过来想,当从机应答失败时,这是很可能的原因。
在这里插入图片描述
(4)在en信号发出之后应该间隔一个周期等待busy信号,否则busy无法快速响应造成程序出错。
(5)器件硬件设计原理图参考,需要上拉,因此在HDL代码中,高电平不用输出,靠管脚电平即可。
在这里插入图片描述

7.效果

上板调试,使用ILA可以抓取到有效读出数据与写入数据一致,均为0xA5。 当前演示的是基于AT24C04的工程上板之后的效果,此外还提供了M24C64的读写源码,24LC64的读写源码,下载链接在文末。
在这里插入图片描述

8.传送门

  • 我的主页
  • FPGA通信接口专栏汇总导航
  • 上一篇:IIC接口协议
  • 本例用到的资料和工程链接
END

🔈文章原创,首发于CSDN论坛。
🔈欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🔈欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/566583.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉 CV 八股分享 [自用](更新中......)

目录 一、深度学习中解决过拟合方法 二、深度学习中解决欠拟合方法 三、梯度消失和梯度爆炸 解决梯度消失的方法 解决梯度爆炸的方法 四、神经网络权重初始化方法 五、梯度下降法 六、BatchNorm 七、归一化方法 八、卷积 九、池化 十、激活函数 十一、预训练 十二…

【Python-Pygame】

Python-Pygame ■ Pygame-简介■ Pygame-安装■ Pygame-Rect区域位置■ Pygame-Draw绘图函数■ Pygame-■ Pygame-■ Pygame-■ Pygame-事件监听■ Pygame-Event事件模块■ Pygame-游戏循环■ Pygame-Display显示模块■ Pygame-Time时间控制■ Pygame-Font文本和字体■ Pygame-…

2024企业数字化转型资料包(10G,1000+份,数字化转型有这份就够了!!!)

2022新时代数字政府建设与发展若干思考-119页.pptx 2023产业数字化建设方案-51页.pptx 2023人工智能与数字化转型的业财融合.pptx 2023企业数字化转型大数据湖一体化平台项目建设方案.pptx 2023供应链数字化转型顶层架构设计方案-37页.pptx 2023国企智改数转之道解决方案.pptx …

QT客户端开发的应用场景

QT 是一跨平台应用程序开发框架,支持多种操作系统,包括 Windows、macOS、Linux、Android、iOS 和嵌入式系统等。这使得 QT 非常适合开发需要在多种平台上运行的应用程序。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交…

花房短剧小程序视频怎么下载到本地#下载高手

本文就教你如何使用下载高手下载花房短剧小程序 本文用到的工具我已经给大家打包好了,有需要的自己取一下 链接:https://pan.baidu.com/s/1KtR6830x8GciKtNcSRhQMg?pwd1234 提取码:1234 --来自百度网盘超级会员V10的分享 1.首先退出微信,记得必须右…

【LeetCode刷题记录】21. 合并两个有序链表

21 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 [], l2 …

AI大模型探索之路-资料篇:大模型开发相关地址信息收藏

文章目录 前言一、OpenAI大模型二、LangChain开发框架三、RAGA评估框架四、GLM大模型五、搜索服务1. Tavily Search API 六、文本LLM大模型七、多模态LLM模型八、模型排行榜1.大模型评测体系(司南OpenCompass)2.大模型排行榜(DataLearner AI&…

校园能源消耗监测管理系统,为您提供节能减排方案

现如今 ,在全球加快推动能源转型、减少碳排的背景下,节能减排已成为各行各业的共同诉求。作为最具示范效应的教育机构,学校在节能减排领域引领着重要的作用。 学效能源消耗监测管理系统是一套涵盖、教学楼、办公楼、图书馆、学生公寓、体育场…

SpringBoot+layuimini实现左侧菜单动态展示

layuimini左侧菜单动态显示 首先我们看一下layuimini的原有菜单显示格式 {"homeInfo": {"title": "首页","href": "page/welcome-2.html?t2"},"logoInfo": {"title": "LAYUI MINI","…

如何加盟共享wifi项目?了解套路有哪些?

自共享wifi项目推出在市场火爆后,各路资本都看到了该项目的广阔前景,纷纷开始研发程序,想要趁机分一杯羹。但对于普通人而言,独立研发程序显然不大现实,于是,共享wifi项目如何加盟便成为了绝大多数人最为关…

安卓手机如何改ip地址?探索方法与注意事项

在数字时代,IP地址成为了我们在线身份的重要标识。对于安卓手机用户而言,了解如何修改IP地址可能涉及多种场景,那么,如何安全、有效地进行这一操作呢?下面将为您提供相关方法,并探讨修改IP地址时的注意事项…

一句话或一张图讲清楚系列之——IDELAYE2的用法

主要参考: Xilinx IDELAYE2应用笔记及仿真实操-CSDN博客 xilinx原语介绍及仿真——IDELAYE2 & IDELAYCTRL_idelayctrl原语使用说明-CSDN博客 1 原理 IDELAYE2一般用于对输入lvds高速信号进行延时微调,可以把时钟和数据都单独微调;如果数…

OmniFocus Pro 4.2.1正式激活版 最好用的GTD效率工具

OmniFocus 是一款功能强大的任务管理软件,适合忙碌的专业人士。借助有助于平息混乱的工具,您可以在正确的时间专注于正确的任务。 OmniFocus Pro 4.2.1正式激活版下载 随时随地轻松创建任务,并通过项目、标签和日期进行整理。在任何设备上&am…

Python 基于docker部署的Mysql备份查询脚本

前言 此环境是基于docker部署的mysql,docker部署mysql可以参考如下链接: docker 部署服务案例-CSDN博客 颜色块文件 rootbogon:~ 2024-04-18 16:34:23# cat DefaultColor.py ######################################################################…

面试宝典(1)——数据库篇(MySQL)

面试宝典(1)——数据库篇(MySQL) 1.什么是索引? 索引是一种用于加快数据库查询速度的数据结构。 索引可以帮助数据库快速定位到数据库表中特定列的记录,从而加快数据检索和查询的速度。 通过在表的列上…

【数据结构(邓俊辉)学习笔记】绪论03——递归分析

文章目录 意图目标1. 线性递归数组求和线性递归减而治之 2. 递归分析递归跟踪递推方程典型递推方程 3. 递归模式多递归基多向递归 4. 递归消除空间成本尾递归及其消除 5. 二分递归分而治之数组求和 6 . 效率7. 算法设计优化总结前n项计算算法 意图 数据结构中经常用到递归&…

谷歌广告B2C实战特训营,500+谷歌账户经验,实战演示从0-1搭建广告账户

结合数据优化搜索、购物(PMax)、再营销、展示、视频广告类型,提升ROI稳定增长 课程背景: 不同的电商产品(如大件家具、假发、服饰等)适合的广告类型、组合策略、预算配置大不相同。 为了让大家最快掌握不同产品的投放策略找到最适合自己的打法&#x…

【前端】vue3树形组件使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、树形组件简介二、树形组件使用三、总结 前言 随着开发语言及人工智能工具的普及,使得越来越多的人学习使用vue前端工具,本文主要是…

sql server 恢复数据库、单表数据的方法

1、查看备份文件在哪个路径、一般文件夹名都是叫:Backup 2、下面开始还原(恢复)数据库,对着【数据库】右键--【新建数据库】--然后随便命名,如下图 3、你要是想改路径的话就拉过来,2行都要改、不想多事就直…

解决zabbix中文乱码问题

目录 1、遇到的问题 2、解决方法 第一步:在windows电脑上可以搜索simkai.ttf文件,上传到 /usr/share/zabbix/assets/fonts文件夹 第二步:删除软链接 第三步:创建软链接 第四步:重启服务 3、检查问题是否被解决 1、遇到的问…