ZYNQ_project:IIC_EEPROM

news2024/12/23 22:36:57

EEPROM简介:

EEPROM(Electrically Erasable Progammable Read Only Memory, E2PROM)是指带电可擦可编程只读存
储器,是一种常用的非易失性存储器(掉电数据不丢失), E2PROM 有多种类型的产品,我们领航者 ZYNQ
开发板上使用的是 ATMEL 公司生产的 AT24C 系列的 AT24C64 这一型号。 AT24C64 具有高可靠性,可对所
存数据保存 100 年,并可多次擦写,擦写次数达一百万次。
它的存储容量:256页每页32个字节。256 x 32 = 8192 (byte字节)

8192 x 8 = 65536(bit比特)

65536  /  1024 = 64 (Kbit)。。。。所以是AT24C系列,64Kbit存储容量。

AT24C64 采用两线串行接口的双向数据传输协议——I2C 协议实现读写操作,所以我们有必要了
解一下 I2C 协议。

IIC协议简介:

简单,双向,二线制总线标准。多用于主机与从机在数据量不大且短距离的(主从)通信。

主机启动总线,并产生时钟用于传送数据,此时任何接收数据的器件均被认为是从机。
IIC总线由数据线SDA和时钟线SCL构成通信线路,各种iic通信器件并联在总线上,通过器件地址识别器件(与器件通信前先要找到这个器件,发地址,等响应,找到对应要通信的从设备)。

IIC总线物理结构拓扑原理结构图:

 图中的 I2C_SCL 是串行时钟线, I2C_SDA 是串行数据线,由于 I2C 器件一般采用开漏结构与总线相连,
所以 I2C_SCL 和 I2C_SDA 均需接上拉电阻,也正因此,当总线空闲时,这两条线路都处于高电平状态,当
连到总线上的任一器件输出低电平,都将使总线拉低,即各器件的 SDA 及 SCL 都是“线与”关系。
I2C 总线支持多主和主从两种工作方式,通常工作在主从工作方式,我们的开发板就采用主从工作方式。
在主从工作方式中,系统中只有一个主机,其它器件都是具有 I2C 总线的外围从机。在主从工作方式中,主
机启动数据的发送(发出启动信号)并产生时钟信号,数据发送完成后,发出停止信号。

IIC的协议层

仔细观察图 33.1.2 可知 IIC 协议的整体时序由四个部分构成,上图中分别使用①、②、③、④进行区
分。
图中①: 总线空闲状态, 在 I2C 器件开始通信(传输数据)之前,串行时钟线 SCL 和串行数据线 SDA
线由于上拉的原因处于高电平状态,此时 I2C 总线处于空闲状态。
图中②: 起始信号, 如果主机(此处指 FPGA)想开始传输数据,只需在 SCL 为高电平时将 SDA 线拉
低,产生一个起始信号。
图中③: 数据传输状态, 主机可以向从机写数据,也可以读取从机输出的数据,数据的传输由双向数据
线(SDA)完成。
图中④: 停止状态, 当数据传输完成,主机只需产生一个停止信号,告诉从机数据传输结束,停止信号
的产生是在 SCL 为高电平时, SDA 从低电平跳变到高电平,从机检测到停止信号后,停止接收数据,并且
I2C 总线跳转回总线空闲状态。

数据传输的具体时序:

scl为高时,sda产生下降沿,产生起始信号。(告诉从机,要开始数据通信了)。

在scl为低时,sda可以改变数据;scl为高时,sda数据保持;

8bit数据一组,也就需要8个时钟周期;

第九个时钟周期:主机释放总线,从机控制总线产生应答位0.若为高,则说明无应答,这组数据是无效的传输。

scl为高时,sda产生上升沿,表示停止信号。(主机结束与从机的通信)

 器件地址:

当多个 I2C 器件挂接在总线上时,怎样才能与我们想要传输数据的器件进行通信。这就涉及到了器件地址(也称从机地址, SLAVE ADDRESS)。
有两种器件地址:7bit全都是固定的,与部分bit固定,部分bit可编程。

AT24C64,起始位+1010+A2A1A0.最低三位可编程。

WR位为0,表示主机要进行写操作,1表示读操作。

 IIC 读写时序

写时序:(字节写和页写)

字节写:

主机发送完字地址,从机正确应答后就把内部的存储单元地址指针指向该单元。如果读写控制位 R/W位为“0”即写命令,从机就处于接收数据的状态,此时,主机就开始写数据了,写数据可分为单次写(对于 E2PROM 而言,称为字节写)和连续写(对于 E2PROM 而言,称为页写)。下面我们先分别介绍 E2PROM的单次写与连续写。

从左上角开始按行往右看。

(1)主机先产生开始标志信号:scl == 1 sda产生下降沿。

(2)然后发送器件地址(MSB~LSB高位在前)最后一位是读写控制标志位,读写控制信号位,0写;1读。

(3)然后从机产生应答位。

 (4)然后发送字地址(存储器的存储空间的地址,相当于指针,相当于门牌号(学过C语言的都应该不陌生))由于AT24C64,存储空间为64Kbit,8bit只能表示256byte(2的8次方 = 256)(256x8/1024 == 2Kbit).

64Kbit : 64x1024/8= 8192

2的13次方,才能表示完8192个数据。

iic以字节传数据,所以AT24C64要用两字节的字地址。

从机指针指向对应的字地址,准备接收数据。

每传递一字节数据后从机会在下一个时钟周期产生应答位。(主机释放总线,从机拉低总线)

(5)然后从机产生应答位。

(6)然后主机开始发送数据:8bit数据位,

(7)然后从机产生应答位。

(8)然后主机产生停止信号,结束位。

页写:

接下来我们开始介绍 E2PROM 的连续写(页写)时序:

 (1)主机产生起始信号。

(2)主机发送器件地址+指令bit。

(3)从机应答。

(4)主机发送第一个字节,从机应答。第二个字节,从机应答。

(5)传递一字节的数据,高位在前。

(6)从机产生应答位。每(正确)传递一字节数据,从机就会给出应答位。

(7)主机发送停止信号。

两者的区别在于发送完一字节数据后,是发送结束信号还是继续发送下一字节数据,如果发送的是结束信号,就称为单次写,如果继续发送下一字节数据,就称为连续写。

要注意的是, 所有 I2C 设备均支持单字节数据写入操作,但只有部分 I2C 设备支持页写操作,对于
AT24C64 的页写,是不能发送超过一页的单元容量的数据的,而 AT24C64 的一页的单元容量为 32Byte,当
写完一页的最后一个单元时,地址指针指向该页的开头,如果再写入数据,就会覆盖该页的起始数据。

读时序:

I2C 写时序介绍完毕后,接下来我们开始 I2C 读时序部分的介绍。根据一次读操作读取数据量的多少,
读操作可分为随机读操作和顺序读操作。

读数据有三种方式:当前地址读,随机读,连续读。

当前地址读方式:

当前地址读是指在一次读或写操作后发起读操作。由于 I2C 器件在读写操作后,其内部的地址指针自动加一,因此当前地址读可以读取下一个字地址的数据。也就是说上次读或写操作的单元地址为 02 时,当前地址读的内容就是地址 03 处的单元数据。

 (1)主机发送起始信号。

(2)主机发送器件地址+读命令(1).

(3)从机发送响应信号,从机应答。

(4)从机发送数据8bit,高位在前。

(5)主机非应答,高电平无应答信号.

(6)主机发送停止信号。

随机读取方式:

并不随机,指定地址并读取一字节数据。

(1)主机发送起始信号。

(2)主机发送器件地址+写指令(0).原因是,接下来是要写入字地址(存储器的地址),所以是写指令。从机产生应答位。

(3)主机发送第一字节地址,从机产生应答位。

(4)主机发送第二字节地址,从机产生应答位。

(5)主机发送起始信号。又一次发送起始信号。

(6)主机发送期间地址+读指令(1).从机产生应答位。

(7)从机发送8bit数据。主机产生无应答位。

(8)主机发送停止信号。

需要注意理解的是随机地址读在发送完器件地址和字地址后,竟然又发送起始信号和器件地址,而且第一次发送器件地址时后面的读写控制位为“ 0”,也就是写命令,第二次发送器件地址时后面的读写控制位为“1”,也就是读。为什么会有这样奇怪的操作呢?这是因为我们需要使从机内的存储单元地址指针指向我们想要读取的存储单元地址处,所以首先发送了一次Dummy Write 也就是虚写操作,只所以称为虚写,是因为我们并不是真的要写数据,而是通过这种虚写操作使地址指针指向虚写操作中字地址的位置,等从机应答后,就可以以当前地址读的方式读数据了。

当前地址读下的连续读:

当前地址读和随机读都是一次读取一个字节,连续读是将当前地址读或随机读的主机非应答改成应答,表示继续读取数据。

(1)主机发送起始信号。

(2)主机发送器件地址+读命令(1),从机产生应答信号。

(3)从机发送8bit数据,主机产生应答信号(0).

(4)从机发送下一字节数据,主机产生应答信号(0).

.................

(5)从机发送下一字节数据,主机产生无应答信号(1).

(6)主机发送停止信号。

随机地址连续读:

有当前地址连续读,当然也有随机地址连续读,随机地址连续读是在图 33.1.10 随机地址读时序的基础上,主机非应答改成应答,表示继续读取数据。

(1)主机发送起始信号。

(2)主机发送器件地址+写指令(0).原因是”虚写“。从机产生应答位。

(3)主机发送第一字节地址,从机产生应答位。

(4)主机发送第二字节地址,从机产生应答位。

(5)主机发送起始信号。又一次发送起始信号。

(6)主机发送期间地址+读指令(1).从机产生应答位。

(7)从机发送8bit数据。主机产生应答位(0)。

(8)从机发送下一字节的8bit数据。主机产生应答位(0)。

................

(10)从机发送8bit数据。主机产生无应答位。

(11)主机发送停止信号。

总结:

所以器件地址为1010_000

实验任务:

本节的实验任务是先向 E2PROM(AT24C64)的存储器地址 0 至 255 分别写入数据 0~255;写完之后再读取存储器地址 0~255 中的数据,把读到的数据通过串口发送给上位机,验证数据正确否。
 

明天完成部分

模块框图:

时序图:

代码:

仿真:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么我不能给shopify的图片添加alt

首先我们要明白是什么ALT标签,为什么要添加这个标签,这个标签有什么用 ALT标签是什么 ALT属性是HTML的一部分,它为那些无法查看图像的用户提供替代的文本描述。 ALT标签有什么用 使用ALT属性还可以帮助搜索引擎爬虫更好地理解您的网站内容。有…

npm管理发布包-创建与发布

创建与发布 我们可以将自己开发的工具包发布到 npm 服务上,方便自己和其他开发者使用,操作步骤如下 创建文件夹,并创建文件indexjs,在文件中声明函数,使用 module.exports 暴露npm初始化工具包,package.j…

LeetCode Hot100 42.接雨水

题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 方法一(相向双指针):竖着计算面积 代码: class Solution {public int trap(int[] he…

docker 安装elasticsearch集群

准备工作 docker 安装好,docker compose 安装好编辑好docker-compose.yml文件(本文会提供)生成elastic-certificates.p12密钥,与docker-compose文件在同一个目录(本文会介绍生成方式)准备elasticsearch配置…

浅谈Python中的鸭子类型和猴子补丁

文章目录 前言一、鸭子类型二、猴子补丁关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 Python 开发者可能…

2020年1月31日 Go生态洞察:pkg.go.dev的未来步骤

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

如何运用AppLink平台中的数据连接器组件

AppLink平台组件组成 AppLink平台组件分成三个板块触发事件组件、基础组件和数据连接器 数据连接器组件里面有10个组件,目前也在不断新增更多的数据连接器,那他们在AppLink平台里的原理、触发动作以及怎么使用呢?接下来用MySQL和TimescaleD…

Text-to-SQL小白入门(九)InstructGPT论文:教你如何训练ChatGPT

论文概述 InstructGPT和ChatGPT 的训练流程基本一致 ,ChatGPT是改进后的InstructGPT,比如InstructGPT是基于GPT-3训练,而ChatGPT是基于GPT-3.5训练。 基本信息 英文标题:Training language models to follow instructions with h…

【鸿蒙应用ArkTS开发系列】- 选择图片、文件和拍照功能实现

文章目录 前言创建多媒体Demo工程创建MediaBean 实体类创建MediaHelper工具类API标记弃用问题动态申请多媒体访问权限实现选择图片显示功能打包测试 前言 在使用App的时候,我们经常会在一些社交软件中聊天时发一些图片或者文件之类的多媒体文件,那在鸿蒙…

当TinyMCE富文本编辑器遇到Vue3+nuxt+ts项目,分享引入成功案例及过程中踩的那些坑

文章目录 前言遇到的坑插入上传图片插件上传图片请求与返回值处理本地文件引入报错解决源码 前言 如果你的前端项目技术栈使用的是Vue3nuxtts,并且老大让你集成一下那个传说中非常丝滑的TinyMCE富文本编辑器,那么恭喜你和我一样中大奖了。 网上找了好久…

uniapp 导航分类

商品分类数据&#xff0c;包括分类名称和对应的商品列表点击弹出 列表的内容 展示效果如下&#xff1a; 代码展示 ①div部分 <view class"container"><view class"menu-bar"><view class"menu"><view class"menu-sc…

CSDN最新最全python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)

经过之前的学习铺垫&#xff0c;我们尝试着利用pytest框架编写一条接口自动化测试用例&#xff0c;来厘清接口自动化用例编写的思路。 我们在百度搜索天气查询&#xff0c;会出现如下图所示结果&#xff1a; 接下来&#xff0c;我们以该天气查询接口为例&#xff0c;编写接口测…

C语言——字符函数和字符串函数(上)

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数&#xff0c;接下来我们就学习⼀下这些函数。 一、 字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的&#xff0c;也就是⼀个字…

[含泪解决]OSError: [Errno 99] Cannot assign requested address__踩坑记录——app.py绑定IP失败

踩坑记录下。 是这个样子的&#xff0c;前几天帮别人部署Python的Flask项目到云服务器上&#xff0c;然后在 app.run(host"xxx.xxx.xxx.xxx",port8080) 这行代码中&#xff0c;xxx.xxx.xxx.xxx代表我的IP地址&#xff0c;port代表我的端口号。 然后不是要部署到服…

Layui框架弹出框form表单中单选按钮状态不刷新

1、问题描述 如下图&#xff1a;当我们点击编辑按钮的时候&#xff0c;实现如果性别(stu_sex)的值为0男生被选中&#xff0c;如果性别的值为1&#xff0c;女生被选中。但是在使用Layui框架的过程中&#xff0c;发现性别的单选按钮无法实现刷新&#xff0c;使用不正常。 1.1、…

PLC:200smart

PLC&#xff1a;200smart 第十章、数据类型、数据存储1、数据类型1.1、有符号数1.2、有符号数 2、传送指令 第十一章、比较指令、整数、浮点数的运算1、比较指令1、运算指令1.1、浮点数运算1.2、整数运算 第十章、数据类型、数据存储 1、数据类型 数据类型分为两大类 无符号数…

k8s部署jenkins

1.先决条件 1.因为国内的容器镜像加速器无法实时更新docker hub上的镜像资源.所以可以自己进行jenkins的容器镜像创建,. 2.这里用到了storageClass k8s的动态制备.详情参考: k8s-StoargClass的使用-基于nfs-CSDN博客 3.安装docker服务.(用于构建docker image) 2.构建jenki…

使用docker-compose优雅部署nacos

查看代码中引入nacos版本 在应用的pom.xml中搜索nacos关键字&#xff0c;找到相关的nacos依赖 点击以来左边的图标&#xff0c;找到依赖管理器中的pom.xml&#xff0c;并全局搜索nacos&#xff0c;即可找到对应的nacos客户端版本 使用docker-compose部署nacos version: 3s…

React Native 更换淘宝镜像提升包下载速度

React Native 更换淘宝镜像提升包下载速度 每次运行项目的时候都是卡在包下载的命令上&#xff0c;每次一等就要 1h20m 极度崩溃&#xff0c;那是因maven镜像源为Google导致无法正常下载。 那么我们就可以切换maven镜像源&#xff0c;方法如下&#xff1a; 找到项目下的**/an…

20分钟拥有自己的ChatGPT4,高效低成本,小白必看

准备工作 1、准备一个3.5的账号 2、一张虚拟卡 开始步骤 从ChatGPT第一版发布到现在&#xff0c;还不到一年的时间中&#xff0c;可是它使用的GPT架构已经从3.5版本进化到现在的4.0版本&#xff0c;随之而来的是其能力的极大提升。下面是GPT-4在其官网的介绍中的一句话&…