树莓派3B读写EEPROM芯片AT24C256

news2025/1/21 10:21:49

AT24C256是一个Atmel公司的EEPROM存储芯片,容量是256K个bit(也就是32K字节),I2C接口,而树莓派正好有I2C接口,如下图蓝框中的4个IO口,
在这里插入图片描述
把AT24C256和这4个口接在一起,这样硬件就准备好了。

本文讲述如何使用树莓派3B来读写AT24C256,其它树莓派版本也是类似的。有2种方法:

  1. 使用树莓派CPU的I2C控制器来读写
  2. 使用AT24C256在Linux系统中映射的文件来读写

读写AT24C256

1. 使能I2C接口

在树莓派系统终端下运行以下命令,

sudo raspi-config

然后弹出以下界面,按上下键来选择“3 Interface Options”并回车,
在这里插入图片描述
在新界面里选择“I4 I2C”并回车,
在这里插入图片描述
在新界面里按左右键来选择“Yes”
在这里插入图片描述
最后回到开始的界面,按左右键选择Finish并回车,
在这里插入图片描述
这样I2C功能就开启了。

2. 使用I2C控制器读写

这里使用i2c-tools来操作,树莓派默认已经安装了这个工具,如果没有就使用下面命令进行安装,

sudo apt install i2c-tools

i2c-tools提供了好几个工具:

  • i2cdetect
  • i2cdump
  • i2cget
  • i2cset
  • i2c-stub-from-dump
  • i2ctransfer

先使用i2cdetect来探测有多少I2C控制器,如下,显示有2个,
在这里插入图片描述
同时在/dev/下也能看到这2个I2C控制器,连接上AT24C256后则会使用i2c-1
在这里插入图片描述
i2cget,i2cset和i2ctransfer都是用来通过I2C控制器来读写eeprom,区别是:i2cget和i2cset适合那种地址是一个字节的eeprom芯片,如AT24C02这种,但是本文使用的是AT24C256,地址需要2个字节,所以只能使用i2ctransfer,同样它也能读一字节地址的eeprom,

i2ctransfer帮助信息如下,

在这里插入图片描述

写数据

使用下面命令进行写,"0x50"是芯片的I2C地址, "0x00 0x05"是eeprom内部的地址,该地址可以存放数据,

i2ctransfer 1 w6@0x50 0x00 0x05 0x55 0x66 0x77 0x88

PS:该命令意思是从eeprom的0x0005位置开始存放4个字节,0x55 0x66 0x77 0x88,不过对于i2ctransfer来说,它只是传输6个字节

显示如下,
在这里插入图片描述

PS:如果想写代码来操作,可以参考i2c-tools的源码

读数据

写完后再执行下面命令进行读,注意这里先要写2个字节,就是eeprom的内部地址0x0005,然后再读4个字节,

i2ctransfer 1 w2@0x50 0x00 0x05 r4

显示如下,可以看到读取出来的数据和写入的是一样的,
在这里插入图片描述

3. 使用EEPROM在Linux系统中映射的文件来读写(推荐)

这个也是推荐的方法,因为EEPROM映射成一个文件,这样可以使用常规的open, read和write来读写EEPROM,但是需要注意的是:这个办法和使用控制器的办法同时只能使用一个,因为映射之后控制器会被占用,就不能直接用控制器去读写了。

先执行下面的命令加载AT24的模块,这个模块是AT24系列芯片的驱动,

sudo modprobe at24

加载完毕后,在/sys/class/i2c-adapter/i2c-1/下会出现new_device和delete_device,
在这里插入图片描述
然后再运行sudo -i进入root模式,这点很重要,最后执行下面的命令,这样可以把芯片型号和I2C地址传给驱动,

echo "24c256 0x50" > /sys/class/i2c-adapter/i2c-1/new_device

实际操作如下,
在这里插入图片描述
最后执行exit回到用户模式。

此时在/sys/class/i2c-adapter/i2c-1/能看到新增的目录1-0050,"1"表示是i2c-1,"0050"表示设备的i2c地址是0x50,
在这里插入图片描述
cd进入1-0050目录,可以看到有个文件eeprom,这个就是AT24C256映射的文件,
在这里插入图片描述

PS:如果想取消映射,可以执行下面命令进行操作,

sudo -i
echo "0x50" > /sys/class/i2c-adapter/i2c-1/delete_device

使用代码进行读写

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>


int main() {
    int fd; // 文件描述符
    char buffer[256]; // 用于读写的缓冲区
    off_t offset;

    // 以读写模式打开文件
    fd = open("/sys/class/i2c-adapter/i2c-1/1-0050/eeprom", O_RDWR, 0644);
    if (fd == -1) {
        perror("无法打开文件");
        exit(EXIT_FAILURE);
    }

    // 向文件写入数据
    uint8_t wr_buf[4] = {0x11, 0x12, 0x55, 0x66};
    ssize_t bytes_written = write(fd, wr_buf, 4);
    if (bytes_written == -1) {
        perror("写入文件时出错");
        close(fd);
        exit(EXIT_FAILURE);
    }
    printf("成功写入 %ld 字节\n", bytes_written);

    // 使用lseek改变文件读写位置到文件开头
    offset = lseek(fd, 0, SEEK_SET);
    if (offset == -1) {
        perror("lseek失败");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 从文件读取数据到缓冲区
    ssize_t bytes_read = read(fd, buffer, 4);
    if (bytes_read == -1) {
        perror("读取文件时出错");
    } else {
        for (uint32_t i = 0; i < 4; ++i)
        {
            printf("==> 0x%x\n", buffer[i]);
        }
    }

    // 关闭文件
    if (close(fd) == -1) {
        perror("关闭文件时出错");
        exit(EXIT_FAILURE);
    }

    return 0;
}

代码以0x0000位置为起始地址,写入"0x11 0x12 0x55 0x66",编译后运行程序并运行,
在这里插入图片描述
可以看到读写都没问题,同时也能发现映射后对eeprom的操作和读写一个普通文件没有区别。

PS:如果想修改起始地址,可以使用lseek函数来设置位置。


总结

本文讲述了2种方法来读写AT24C256,更推荐文件方式的办法,这种更符合Linux“万物皆文件”的思想。

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

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

相关文章

观察者模式在金融业务中的应用及其框架实现

引言 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;使得多个观察者对象同时监听某一个主题对象。当这个主题对象发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自动更新。…

【NodeJs】入门

目录 一、前导 二、 url模块 三、path模块 四、buffer模块 五、fs模块 六、stream流模块 七、os模块 八、crypto模块 九、util模块 十、http模块 nodejs官网 Node.js — 在任何地方运行 JavaScript nmp是Node.js包管理器&#xff0c;用来安装各种库、框架和工具&…

js自定义内容生成二维码,qrcodejs的使用

qrcodejs qrcodejs是基于原生js的文本转换成二维码的库&#xff0c;轻量且使用方法简单&#xff0c;它的实现原理是通过canvas将重新编码的内容绘制在页面元素上&#xff0c; 使用qrcodejs时可以选择引入它的cdn或者使用npm下载 <script type"text/javascript" …

Nacos配置中心客户端源码分析(一): 客户端如何初始化配置

本文收录于专栏 Nacos 推荐阅读&#xff1a;Nacos 架构 & 原理 文章目录 前言一、NacosConfigBeanDefinitionRegistrar二、NacosPropertySourcePostProcessor三、AbstractNacosPropertySourceBuilder总结「AI生成」 前言 专栏前几篇文章主要讲了Nacos作为服务注册中心相关…

vmware安装debian11

安装vmware16 下载镜像 https://repo.huaweicloud.com/debian-cd/ https://repo.huaweicloud.com/debian-cd/11.7.0/amd64/iso-dvd/ 安装 安装完成之后重启&#xff0c;输入账号密码进入&#xff0c;安装ssh服务器即可使用

park unpark

目录 一、基本使用 二、特点&#xff08;与 wait/notify 对比&#xff09; 三、park & unpark 的原理 一、基本使用 1. park 和 unpark 是 LockSupport 中的方法 2. LockSupport.park();// 暂停线程&#xff0c;线程进入 WAIT 状态 3. LockSupport.unpark(被暂停的线…

数据产品经理知识库构建

概述 数据产品经理是企业中负责管理和推动数据产品的专业人员。他们利用数据来辅助决策&#xff0c;优化产品&#xff0c;提升用户体验。用STAR法则&#xff08;Situation, Task, Action, Result&#xff09;来介绍数据产品经理的角色&#xff0c;应该学习的数据产品&#…

Linux安装Node-RED并实现后台运行及开机启动

首先确保系统中已近成功安装Node.js&#xff0c;并保证需要的合适版本&#xff1a; 关于node.js的安装可以参考我的另一篇博文:《AliyunOS安装Node.js》。 然后就可以使用npm工具安装Node-RED了&#xff0c;很简单使用如下命令&#xff1a; sudo npm install -g --unsafe-per…

各维度卷积神经网络内容收录

各维度卷积神经网络内容收录 卷积神经网络&#xff08;CNN&#xff09;&#xff0c;通常是指用于图像分类的2D CNN。但是&#xff0c;现实世界中还使用了其他两种类型的卷积神经网络&#xff0c;即1D CNN和3D CNN。 在1D CNN中&#xff0c;内核沿1个方向移动。1D CNN的输入和…

可信和可解释的大语言模型推理-RoG

大型语言模型&#xff08;LLM&#xff09;在复杂任务中表现出令人印象深刻的推理能力。然而&#xff0c;LLM在推理过程中缺乏最新的知识和经验&#xff0c;这可能导致不正确的推理过程&#xff0c;降低他们的表现和可信度。知识图谱(Knowledge graphs, KGs)以结构化的形式存储了…

模板方法模式在金融业务中的应用及其框架实现

引言 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它在一个方法中定义一个算法的框架&#xff0c;而将一些步骤的实现延迟到子类中。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤。在金融业务中&#xff…

Python技术笔记汇总(含语法、工具库、数科、爬虫等)

对Python学习方法及入门、语法、数据处理、数据可视化、空间地理信息、爬虫、自动化办公和数据科学的相关内容可以归纳如下&#xff1a; 一、Python学习方法 分解自己的学习目标&#xff1a;可以将学习目标分基础知识&#xff0c;进阶知识&#xff0c;高级应用&#xff0c;实…

【简易版tinySTL】 哈希表与移动语义

基本概念 哈希表&#xff08;HashTable&#xff09;是一个重要的底层数据结构, 无序关联容器包括unordered_set, unordered_map内部都是基于哈希表实现。 哈希表是一种通过哈希函数将键映射到索引的数据结构&#xff0c;存储在内存空间中。哈希函数负责将任意大小的输入映射到…

谷歌开发者新号上架攻略:开发者实战经验分享

前段时间&#xff0c;不少开发者朋友们在纷纷在吐槽新账号没法上架成功。以前谷歌对新号是真的很严格&#xff0c;但现在情况似乎有所好转。 今天&#xff0c;和大家聊聊如何在新号成功上架上“快人一步”&#xff0c;以及怎样增加账号权重提高上架成功率。 首先&#xff0c;我…

Spring MVC中的DispatcherServlet、HandlerMapping和ViewResolver的作用

在Spring MVC框架中&#xff0c;DispatcherServlet、HandlerMapping和ViewResolver是核心组件&#xff0c;它们各自承担着不同的角色和任务&#xff1a; 1.DispatcherServlet&#xff1a;它是Spring MVC生命周期中的前端控制器&#xff0c;负责接收HTTP请求并将它们分发给相应的…

Echarts地图实现:各省市计划录取人数

Echarts地图实现&#xff1a;各省市计划录取人数 实现功能 本文将介绍如何使用 ECharts 制作一个展示中国人民大学2017年各省市计划录取人数的地图。我们将实现以下图表形式&#xff1a; 地图&#xff1a;基础的地图展示&#xff0c;反映不同省市的录取人数。散点图&#xf…

vue3+ts+vite项目中使用spreadjs,通过script标签引入spreadjs可以提高打包速度

https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/quickstart/quickstart-js 右键另存这个官方的示例页面可以下载全部js文件 https://demo.grapecity.com.cn/SpreadJS/WebDesigner/index.html spread.html: <!DOCTYPE html> <html lang"zh">…

问题处理记录与深入:系统线程耗尽,Java无法调用native方法新建线程

1. 问题处理记录 1.1 问题描述 公司使用Presto作为OLAP查询引擎&#xff0c;Presto的coordinator节点在运行过程中报错 java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reachedat java.base/java.lang.Thre…

用Roofline模型去分析pytorch和Triton算子

用Roofline模型去分析pytorch和Triton算子 1.参考链接2.测试环境3.安装相关依赖4.锁频5.获取理论算力6.创建测试脚本7.运行测试程序生成Roofline图8.NVIDIA Nsight Compute生成Roofline9.效果图A.nn.LinearB.Triton实现 本文演示了如何用Roofline模型去分析pytorch和Triton算子…

Mx Admin 基于react18的后台管理系统

前言 Mx Admin 基于React18 vite5 antd5的后台管理系统&#xff0c; 基于RBAC的权限控制系统&#xff0c;动态菜单和动态路由支持tab路由缓存嵌套菜单支持多种菜单布局模式亮暗色主题切换