Arduino 入门学习笔记12 读写外置EEPROM

news2024/12/26 21:41:19

Arduino 入门学习笔记12 读写外置EEPROM

  • 一、准备工作
    • 1. 外置 EEPROM 简介
    • 2. Arduino操作外置 EEPROM 流程
  • 二、读写操作流程
    • 1. 写操作流程
    • 2. 读操作
  • 三、示例代码

在这里插入图片描述

一、准备工作

1. 外置 EEPROM 简介

外置I2C接口的EEPROM是一种常用的非易失性存储器,通过I2C总线与微控制器或其他设备进行通信。它通常用于存储持久性数据,如配置设置、日志、校准数据等。以下是一些常用的外置I2C接口的EEPROM型号以及它们的特点:

  • 24C系列:Microchip的24C系列EEPROM是一些常见的I2C接口EEPROM型号。它们分为24C01到24C512等不同容量的型号,容量从128字节到64K字节不等。这些EEPROM设备在I2C总线上占用7位或8位的设备地址,并且通常具有多个页,可实现更高的写入速度。

  • AT24系列:AT24系列是Atmel(现在的Microchip)生产的I2C EEPROM。它们也提供不同容量的选项,从AT24C01到AT24C512。这些设备通常具有低功耗特性,适用于电池供电的设备。

  • CAT24系列:Catalyst(现在的ON Semiconductor)的CAT24系列EEPROM是一种具有扩展温度范围和多个页的EEPROM。它们适用于工业和汽车应用。

  • M24系列:STMicroelectronics的M24系列EEPROM提供了多种不同容量的型号,具有低功耗和低工作电流特性。

  • TC24系列:Microchip的TC24系列EEPROM针对温度敏感的应用提供了增强的温度范围。

  • FM24系列:Fremont Micro Devices的FM24系列EEPROM采用了更大的页大小,以实现更高的写入速度。

  • LC24系列:Excelon™ Ultra-Low-Power EEPROM是Microchip的一个系列,适用于需要极低功耗的应用。

下图是AT24系列引脚示例:
在这里插入图片描述

2. Arduino操作外置 EEPROM 流程

在Arduino中,读写外部EEPROM(电可擦除可编程只读存储器)的流程与内置EEPROM类似,但需要通过I2C通信来与外部EEPROM设备进行交互。基本流程是:

  1. 连接硬件:首先,将外部EEPROM设备与Arduino连接,通常使用I2C通信协议。确保连接SCL(时钟线)和SDA(数据线)引脚,并将设备的电源(VCC和GND)连接到适当的电源引脚。

  2. 安装I2C库:在Arduino IDE中,需要安装Wire库,它用于I2C通信。在"工具"菜单下的"管理库"中搜索"Wire"并安装它。

  3. 编写读写代码:根据外部EEPROM的规格和通信协议,编写Arduino代码来读写EEPROM。

一般EEPROM 的 I2C 地址从 0x00开始。

二、读写操作流程

1. 写操作流程

当使用writeEEPROM函数时,一个外部EEPROM设备通过I2C总线与我们建立了通信,以实现数据写入到特定地址的存储单元。以下是writeEEPROM函数的步骤解释:

  1. 开启通信:首先,我们使用Wire.beginTransmission(EEPROM_ADDR)来开始I2C通信,发送一个起始信号,这标志着写入操作的开始。在这里,EEPROM_ADDR是外部EEPROM设备的I2C地址。

  2. 发送高位地址:接着,我们使用Wire.write((int)highByte(address))发送了地址的高字节部分。这个高位地址指示了我们希望将数据写入的确切存储单元。

  3. 发送低位地址:继续,我们使用Wire.write((int)lowByte(address))发送了地址的低字节部分。这个低位地址更精确地指定了写入的位置。

  4. 发送数据:此时,我们使用Wire.write(data)将待写入的数据发送出去。

  5. 结束通信:随后,我们调用了Wire.endTransmission()来结束I2C通信。这意味着我们已经将数据和地址都传送给了外部EEPROM设备。实际上,这是向设备发送了一个写入请求。

  6. 等待写入完成:为确保写入操作成功完成,我们添加了delay(5)。这个短暂的等待时间允许EEPROM完成数据写入的操作,确保数据被正确存储。

需要注意的是,EEPROM写入通常需要一些时间,所以在调用writeEEPROM函数后,等待一段时间非常重要。EEPROM的写入周期可以从设备的规格表中获知。

2. 读操作

当我们使用readEEPROM函数时,我们与外部EEPROM设备通过I2C总线建立了通信,以从特定地址的存储单元读取数据。以下是readEEPROM函数的步骤解释:

  1. 开始通信:首先,我们使用Wire.beginTransmission(EEPROM_ADDR)开启I2C通信,发送了一个起始信号,这表明读取操作的开始。在这里,EEPROM_ADDR是外部EEPROM设备的I2C地址。

  2. 发送地址:然后,我们使用Wire.write((int)highByte(address))发送地址的高字节部分。这个高位地址指示了我们希望读取数据的确切存储单元。

  3. 发送低位地址:接下来,我们使用Wire.write((int)lowByte(address))发送地址的低字节部分。这个低位地址更精确地指明了读取的位置。

  4. 结束通信:随后,我们调用了Wire.endTransmission()来结束I2C通信。这意味着我们已经向外部EEPROM设备发送了读取请求。

  5. 请求数据:然后,我们使用Wire.requestFrom(eepromAddress, 1)请求从EEPROM读取1字节数据。

  6. 等待数据:我们使用while (Wire.available() == 0)来等待数据的到达。这确保了在数据准备好之前,我们不会继续执行。

  7. 获取数据:一旦数据可用,我们使用Wire.read()来读取并返回这个数据。

总结:通过readEEPROM函数,我们使用I2C通信协议成功地从外部EEPROM设备读取数据。我们发送地址和读取请求,然后等待数据的到达。这样,我们能够从EEPROM的指定地址成功地获取数据。

需要注意的是,EEPROM读取也需要一些时间,所以在调用readEEPROM函数后,等待一段时间也是必要的。EEPROM的读取速度可以从设备的规格表中找到。

三、示例代码

#include <Wire.h>

const byte EEPROM_ADDR = 0x57;  // I2C address

#define start 0x25
#define BUF_SIZE 50
char myMessage[BUF_SIZE] = { "Hello, I'll save Data to EEPROM demo." };
char MEM[BUF_SIZE];


void setup() {
  Serial.begin(9600);
  Wire.begin();

  Serial.println();
  Serial.println("Writing to Ext.EEPROM...");

  for (unsigned int i = 0; i < sizeof(myMessage); i++) {
    writeEEPROM(i + start, myMessage[i]);
    delay(5);
  }
  Serial.println("Write Complete.");


  Serial.println();
  Serial.println("Reading Ext.EEPROM...");

  for (unsigned int j = 0; j < sizeof(MEM); j++) {
    byte data = readEEPROM(j + start);
    Serial.print("Address 0x");
    Serial.print(j + start, HEX);
    Serial.print(": 0x");
    Serial.print(data, HEX);
    Serial.print(" '");
    
    if (data >= 32 && data <= 126) {
      Serial.print((char)data);
    } else {
      Serial.print(".");
    }
    
    Serial.println("'");
  }

  Serial.println("Read Complete.");
}

void loop() {
}


void writeEEPROM(unsigned int address, byte data) {
  Wire.beginTransmission(EEPROM_ADDR);
  Wire.write((int)highByte(address));
  Wire.write((int)lowByte(address));
  Wire.write(data);
  Wire.endTransmission();
  delay(5);  // wait to complete the write cycle
}


byte readEEPROM(unsigned int address) {
  byte data;
  Wire.beginTransmission(EEPROM_ADDR);
  Wire.write((int)highByte(address));
  Wire.write((int)lowByte(address));
  Wire.endTransmission();
  Wire.requestFrom(EEPROM_ADDR, (byte)1);
  while (Wire.available() == 0)
    ;  // wait for data
  data = Wire.read();
  return data;
}

运行效果:
在这里插入图片描述

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

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

相关文章

opencv 进阶10-人脸识别原理说明及示例-cv2.CascadeClassifier.detectMultiScale()

人脸识别是指程序对输入的人脸图像进行判断&#xff0c;并识别出其对应的人的过程。人脸识别程 序像我们人类一样&#xff0c;“看到”一张人脸后就能够分辨出这个人是家人、朋友还是明星。 当然&#xff0c;要实现人脸识别&#xff0c;首先要判断当前图像内是否出现了人脸&…

分享一个可以录制限制录屏的方法

随着智能手机的普及&#xff0c;录屏已经成为了很多人记录生活的重要方式。然而&#xff0c;在使用录屏应用时&#xff0c;我们可能会遇到一些限制&#xff0c;例如无法录制某些应用程序的屏幕。下面将介绍一些方法&#xff0c;帮助你在这种情况下仍然能够轻松地录制屏幕。 使用…

3D数据转换工具HOOPS Exchange概览

HOOPS Exchange SDK是一组C软件库&#xff0c;使开发团队能够快速为其应用程序添加可靠的2D和3D CAD导入和导出功能。这允许访问广泛的数据&#xff0c;包括边界表示&#xff08;BREP&#xff09;、产品制造信息&#xff08;PMI&#xff09;、模型树、视图、持久ID、样式、构造…

亚马逊无限买家号如何注册?

如果想要拥有大批量的亚马逊买家号&#xff0c;可以使用亚马逊鲲鹏系统进行自动注册操作。在注册之前我们需要先准备好账号所需要的资料&#xff1b; 1、Ip&#xff1a;软件系统支持11个亚马逊站点使用&#xff0c;因此注册哪一个国家的买家号时就需要购买相应国家的ip&#x…

React请求机制优化思路 | 京东云技术团队

说起数据加载的机制&#xff0c;有一个绕不开的话题就是前端性能&#xff0c;很多电商门户的首页其实都会做一些垂直的定制优化&#xff0c;比如让请求在页面最早加载&#xff0c;或者在前一个页面就进行预加载等等。随着react18的发布&#xff0c;请求机制这一块也是被不断谈起…

docker部署springboot应用

一、下载安装docker curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 启动&#xff1a;systemctl start docker 二、配置国内镜像源 &#xff08;1&#xff09;在/etc/docker目录中添加daemon.json文件&#xff0c;内容如下&#xff1a; { …

花生十三 判断推理(二)论证类(归因论证、一般质疑、比例类论证、解释说明类、支持与前提假设、易错选项

论证类 归因论证 形式&#xff1a;既成事实 原因分析 &#xff08;有些题目省略原因分析&#xff09; 题型 对比实验 形式&#xff1a; 有完整的对比实验过程&#xff0c;根据结果给出原因分析、结论 解题思路 质疑 另有他图&#xff1a;画图法&#xff0c;需分组正确…

14 anaconda+pycharm环境管理以及源管理

文章目录 环境管理博主使用的环境环境设置conda常用指令pycharm与环境的连接&#xff08;新2023版本后&#xff09;设置国内镜像&#xff08;源管理&#xff09;常用操作 环境管理 博主使用的环境 Anaconda3-2023.03-Windows-x86_64 pycharm-professional-2023.2 环境设置 …

0基础小白,到底怎样成功转行做软件测试?

软件测试的门槛低没错&#xff0c;但如果100个人竞争同一岗位&#xff0c;企业方一定会选择更优秀的那个应聘者&#xff0c;而没有工作经验、0基础的小白只是充当了陪跑的角色。 所以建议转岗做软件测试的小伙伴&#xff0c;一定要提前做好这些准备&#xff1a; 1、了解软件测…

【数据结构】链表常见题目

文章目录 链表合并两个有序链表反转链表复制带随机指针的链表环形链表环形链表II相交链表移除链表元素链表中倒数第k个节点链表分割链表的回文结构链表的中间节点旋转链表链表排序链表求和 (逆序求)链表求和II (正序求)重排链表奇偶链表反转链表II <==> 链表内指定区间反…

C/C++:C/C++在大数据时代的应用,以及C/C++程序员未来的发展路线

目录 1.C/C在大数据时代的应用 1.1&#xff1a;C/C数据处理 1.2&#xff1a;C/C数据库 1.3&#xff1a;C/C图像处理和计算机视觉 1.3.1&#xff1a;导读 2.C/C程序员未来的发展路线 2.1&#xff1a;图导 1.C/C在大数据时代的应用 C/C在大数据时代中仍然是一种被广泛应用的编…

HttpMessageConverter(消息转换器)

文章目录 1. HttpMessageConverter 的概述2. HttpMessageConverter的使用2.1 RequestBody请求体注解2.2 RequestEntity请求封装对象2.3 ResponseBody响应体注解2.4 ResponseEntity响应封装对象 3. 自定义消息转换器3.1 步骤一&#xff1a;自定义消息转化器3.11 FastJson、Gson …

前馈神经网络正则化例子

直接看代码&#xff1a; import torch import numpy as np import random from IPython import display from matplotlib import pyplot as plt import torchvision import torchvision.transforms as transforms mnist_train torchvision.datasets.MNIST(root…

【云原生】kuberneter中Helm入门到实践

引言 helm是k8s的包管理工具&#xff0c;使用helm&#xff0c;可以使用更为简化和系统化的方式对k8s应用进行部署、升级。 helm是CNCF已毕业的项目&#xff0c;社区也是相当活跃的&#xff0c;在 https://artifacthub.io/ 上&#xff0c;能找到很多现成的helm chart&#xff…

轻松学会网络编程

目录 一、UDP 和 TCP 特点对比 1、有连接和无连接 2、可靠传输和不可靠传输 3、面向字节流和面向数据报 4、全双工和半双工 二、UDP 的 socket.api 1、DatagramSocket 2、DatagramPacket 回显服务器的实现 &#xff08;1&#xff09;服务器代码 &#xff08;2&#…

GaussDB数据库SQL系列-子查询

目录 一、前言 二、GaussDB SQL子查询表达式 1、EXISTS/NOT EXISTS 2、IN/NOT IN 3、ANY/SOME 4、ALL 三、GaussDB SQL子查询实验示例 1、创建实验表 2、EXISTS/NOT EXISTS示例 3、IN/NOT IN 示例 4、ANY/SOME 示例 5、ALL示例 四、注意事项及建议 五、小结 一、…

投资不识筹码峰,炒遍A股也枉然? | 如何用python计算筹码分布数据

你听说过股市上著名的丁蟹效应吗&#xff1f; 你知道丁蟹报仇点到为止&#xff0c;丁蟹报恩家破人亡吗&#xff1f; 你又是否曾在微信群中见过这些表情包&#xff1f; 01 大时代 不知道大家有没有看过《大时代》这部剧&#xff0c;看过的欢迎点我头像交流讨论。 剧中逆天强运…

Java:JVM虚拟机的三种模式

在JVM中有三种模式&#xff1a; 混合模式&#xff1a;解释器热点代码编译 编译模式&#xff1a;启动快&#xff0c;执行慢 解释模式&#xff1a;启动慢&#xff0c;执行快 使用 在我们的JVM虚拟机中一般默认的是混合模式 如上所示&#xff0c;我们可以看到后面有mixed&#xf…

【mysql异常】Specified key was too long; max key length is 1000 bytes

最近在创建数据库的时候&#xff0c;报错内容如下所示&#xff1a; Caused by: java.sql.SQLSyntaxErrorException: Specified key was too long; max key length is 1000 bytesat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-conn…

Vue中实现自动匹配搜索框内容 关键字高亮文字显示

实现效果如下: 1.首先需要给输入框进行双向绑定 2.拿到搜索的结果去渲染页面 将返回的结果和搜索的关键字进行比对 如果相同的 就变红 上代码 html部分 //输入框<div class"search"><div class"shuru"><input type"请输入要查询的…