树莓派3B读写EEPROM芯片AT24C256

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.mzph.cn/web/37122.shtml

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

相关文章

Django 页面展示模型创建表的数据

1&#xff0c;添加视图函数 Test/app8/urls.py from django.shortcuts import render from .models import Userdef create_user(request):if request.method POST:username request.POST.get(username)email request.POST.get(email)# ... 获取其他字段的值# 创建用户实例…

【Python学习篇】Python实验小练习——异常处理(十三)

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

【教程】5分钟直接了解随机森林模型

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、什么是随机森林模型1.1.随机森林模型介绍1.2.为什么随机森林要用多棵决策树 二、怎么训练一个随机森林模型2.1.训练一个随机森林模型 随机森林模型是机器学习中常用的模型之一&#xff0c;它是决策树模型的一…

Node.js全栈指南:静态资源服务器

上一章【认识 MIME 和 HTTP】。 我们认识和了解了 MIME 的概念和作用&#xff0c;也简单地学习了通过浏览器控制台查看请求和返回的用法。 通过对不同的 HTML、CSS、JS 文件进行判断&#xff0c;设置不同的 MIME 值&#xff0c;得以让我们的浏览器正正确地接收和显示不同的文…

八爪鱼现金流-031,宽带到期记一笔负债

到期了&#xff0c;新弄的网络&#xff0c;记录一下负债包。 八爪鱼现金流 八爪鱼

英英词典(汇编实验)

功能要求&#xff1a; 1.单词及其英文解释的录入、修改和删除 (1 ) 录入新单词&#xff0c;把它插入到相应的位置(按词典顺序)&#xff0c;其后跟英文解释、同义词、反义词&#xff1b;&#xff08;此功能要求在文件中完成&#xff0c;其它功能可以将单词放在数据段中&#xf…

数据库原理之数据库基本概念

目录 前言 基本概念 数据库完整性 前言 今天我们来看看数据库的基本概念&#xff0c;帮助大家对数据库有一点点最基本的了解 基本概念 4个基本概念 数据data&#xff1a;描述事物的符号&#xff0c;数据库中存储的基本对象。 数据库Database&#xff1a;长期存储在计算机…

山东大学多核并行2024年回忆版

2024.6.13回忆版 矩阵向量乘不可整除代码 集合通信与点对点通信的区别 块划分、循环划分、循环块划分&#xff08;14个向量&#xff0c;4个进程&#xff09; 按行访问还是按列访问快 SISD系统问题 循环依赖问题 问题&#xff1a;为什么不能对这个循环并行化&#xff0…

Python逻辑控制语句 之 综合案例

需求&#xff1a; 1. 提示⽤户输⼊登录系统的⽤户名和密码 2. 校验⽤户名和密码是否正确(正确的⽤户名:admin、密码:123456) 3. 如果⽤户名和密码都正确&#xff0c;打印“登录成功!”&#xff0c;并结束程序 4. 如果⽤户名或密码错误&#xff0c;打印“⽤户名或密码错误!”…

Django 对模型创建的两表插入数据

1&#xff0c;添加模型 Test/app8/models.py from django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email models.EmailField(uniqueTrue)password models.CharField(max_length128) # 使用哈希存储密码first_name …

DM 的断点续传测试

作者&#xff1a; 大鱼海棠 原文来源&#xff1a; https://tidb.net/blog/4540ae34 一、概述 DM有all、full、incremental三种数据迁移同步方式&#xff08;task-mode&#xff09;&#xff0c;在all同步模式下&#xff0c;因一些特殊情况&#xff0c;需要变更上游MySQL的数…

LDO产品的基础知识解析

低压降稳压器 (LDO)是一种用于调节较高电压输入产生的输出电压的简单方法。在大多数情况下&#xff0c;低压降稳压器都易于设计和使用。然而&#xff0c;如今的现代应用都包括各种各样的模拟和数字系统&#xff0c;而有些系统和工作条件将决定哪种LDO最适合相关电路&#xff0c…

springboot的特点是什么?

Spring Boot是一个基于Spring框架的开源项目&#xff0c;它旨在简化Spring应用的初始搭建和开发过程。以下是Spring Boot的一些主要特点&#xff1a; 快速开发&#xff1a; Spring Boot提供了许多默认配置&#xff0c;使得开发者可以更快地开始开发应用程序&#xff0c;而无需…

秋招突击——6/28、6.29——复习{数位DP——度的数量}——新作{}

文章目录 引言复习数位DP——度的数量个人实现参考实现 总结 引言 头一次产生了那么强烈的动摇&#xff0c;对于未来没有任何的感觉的&#xff0c;不知道将会往哪里走&#xff0c;不知道怎么办。可能还是因为实习吧&#xff0c;再加上最近复习也没有什么进展&#xff0c;并不知…

如何借助 LLM 设计和实现任务型对话 Agent

1 引言 在人工智能的快速发展中&#xff0c;任务型对话 Agent 正成为提升用户体验和工作效率的关键技术。这类系统通过自然语言交互&#xff0c;专注于高效执行特定任务&#xff0c;如预订酒店或查询天气。尽管市场上的开源框架如 Rasa 和 Microsoft Bot Framework 在对话理解…

揭秘多年免费听音乐、直播、影视的自用方案:手机、电视、电脑多平台0成本实现媒体自由(内含相关资源)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 多媒体自由 📒🎧 音乐资源📱安卓平台🍎 苹果平台💻 PC平台🎥 影视资源📱 安卓平台🍎 苹果平台📺 电视盒子💻 PC平台📥 电影下载📺 直播资源📱 手机平台💻 PC平台📺 电视盒子⚓️ 相关链接 ⚓️�…

ISS检测原理

ISS(Intrinsic Shape Signatures)是由Yu Zhong于2009年提出的一种三维形状描述子,用于描述局部或半局部区域的点云,局部区域可以理解为以一个点云中某点为球心,以一定半径构成的可以包含多个内点的球形区域,半局部则是半个球形区域。ISS可用于不同视角点云的配准、快速姿…

Nuxt3 的生命周期和钩子函数(六)

title: Nuxt3 的生命周期和钩子函数&#xff08;六&#xff09; date: 2024/6/30 updated: 2024/6/30 author: cmdragon excerpt: 摘要&#xff1a;本文深入解析了Nuxt3框架中的多个核心生命周期钩子和组件注册功能&#xff0c;包括imports:sources、imports:extend、import…

刷代码随想录有感(121):贪心算法——买卖股票的最佳时机III

题干&#xff1a; 代码&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {if (prices.size() < 2) return 0;int buy1 prices[0];int buy2 prices[0];int sell1 0, sell2 0;for (int i 1; i < prices.size(); i) {buy1 min(bu…