树莓派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.mfbz.cn/a/759257.html

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

相关文章

Nginx的11个执行阶段

Nginx的11个执行阶段

ARCGIS添加在线地图

地图服务地址&#xff1a;http://map.geoq.cn/ArcGIS/rest/services 具体方法&#xff1a; 结果展示&#xff1a;

Spring底层原理之bean的加载方式八 BeanDefinitionRegistryPostProcessor注解

BeanDefinitionRegistryPostProcessor注解 这种方式和第七种比较像 要实现两个方法 第一个方法是实现工厂 第二个方法叫后处理bean注册 package com.bigdata1421.bean;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.…

轻量级仿 SpringBoot 程序

但凡 Java 程序&#xff0c;想必就是 Spring 程序&#xff1b;但凡 Spring 程序&#xff0c;想必就是 SpringBoot 程序——且慢&#xff0c;当今尚有不是 SpringBoot 即 SpringMVC 的程序不&#xff1f;有——老旧的遗留系统不就是嘛~——不&#xff0c;其实只要稍加“调教”&a…

基于SpringBoot漫画网站系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

目前常见的几款企业级im即时通讯软件有哪些?

在目前的市场上&#xff0c;有几款常见的企业级即时通讯软件广受企业青睐。以下是其中几款主流企业级即时通讯软件的介绍和特点。 1. 微软Teams 微软Teams是一款集即时通讯、协作和视频会议功能于一体的企业级通讯软件。它提供了实时聊天、语音通话、视频会议、文件共享和团队…

零刻SER8 8845HS设置RAID磁盘阵列教程

SER8内置两个NVme硬盘位&#xff0c;支持硬盘RAID功能&#xff0c;目前支持以下几种RAID模式。 Volume&#xff08;卷&#xff09;&#xff1a;将多块硬盘拼接成一个大硬盘&#xff0c;也称为JBOD&#xff08;Just a Bunch Of Disks&#xff09;。它不要求硬盘容量相同&#xf…

软件构造 | 期末查缺补漏

软件构造 | 期末查缺补漏 总体观 软件构造的三维度八度图是由软件工程师Steve McConnell提出的概念&#xff0c;用于描述软件构建过程中的三个关键维度和八个要素。这些维度和要素可以帮助软件开发团队全面考虑软件构建的方方面面&#xff0c;从而提高软件质量和开发效率。 下…

What does the error ‘module ‘langchain‘ has no attribute ‘verbose‘ refer to?

题意&#xff1a;错误 module langchain has no attribute verbose 指的是什么意思&#xff1f; 问题背景&#xff1a; Kind of new to Langchain/Qdrant but Im building a recommendation engine to recommend users based on the contents of their associated PDF files, …

学习阳明心学,需要下真功夫,持续用功

阳明心学是功夫之学&#xff0c;看到善的就发扬光大&#xff0c;看到恶的就立即改正&#xff0c;这才是真功夫

LeetCode 算法:二叉搜索树中第K小的元素 c++

原题链接&#x1f517;&#xff1a;二叉搜索树中第K小的元素 难度&#xff1a;中等⭐️⭐️ 题目 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从1开始计数&#xff09;。 示例 1&#xff1a;…

【web】2、集成插件

1、element-plus 官网地址:设计 | Element Plus 安装 plus 及 icon 图标库 1.1 官网提供plus安装方法&#xff1a; 1.2 官网提供 icon 安装方法 1.3 安装 pnpm install element-plus element-plus/icons-vue main.ts全局安装element-plus,element-plus默认支持语言英语设…

Navicat 外网连接 mysql (1、通过SSH方式内网访问 2、对外开放3306端口)

1、通过SSH方式内网访问 直接常规方式使用IP、账号密码连接&#xff0c;失败 SSH方式&#xff1a; 常规 选项卡中&#xff1a;localhost录入数据库账号密码 SSH 选项卡中&#xff1a;勾选使用SSH&#xff0c;输入服务器IP、账号、密码 如果出现该错误&#xff0c;可能是服务器…

51个图表,完美展示数据分布关系!

本节介绍seaborn展示数据分布关系的图表&#xff08;Distribution plots&#xff09;的实现&#xff0c;该类图表用于展示数据集的分布规律&#xff0c;帮助快速获取数据多方面信息&#xff0c;例如&#xff0c;观测值的范围、中心趋势、是否存在某个方向上严重偏斜、是否存在双…

10大内网安全管理系统!企业内网安全必备系统

内网安全管理系统对于维护企业网络安全至关重要&#xff0c;它们帮助监控、管理内部网络资源&#xff0c;防止数据泄露和安全威胁。以下是十款知名的内网安全管理系统。 1. 安企神终端安全管理系统 详细介绍&#xff1a; 安企神是针对企业内网安全需求设计的一款综合管理系统&…

在大数据盛行的今天,为什么需要使用图数据库?

分类 性能 可扩展性 灵活性 复杂性 键值存储数据库 高 高 高 无 文档数据库 高 可变 高 低 列存储数据库 高 可变 一般 低 图数据库 可变 高 高 高 关系型数据库 可变 可变 低 一般 表1&#xff1a;5类主流数据库产品分析 对于深度数据的分析和…

数值分析笔记(四)数值微积分

牛顿-科茨公式 ∫ a b f ( x ) d x ≈ ( b − a ) ∑ k 0 n C k ( n ) f ( a k h ) \int_a^bf(x) \mathrm{d}x\approx(b-a)\sum_{k0}^nC_k^{(n)}f(akh) ∫ab​f(x)dx≈(b−a)k0∑n​Ck(n)​f(akh) 其中&#xff0c; C k ( n ) C_k^{(n)} Ck(n)​为科茨系数。 n1时&#xff…

Drag Select Compose:实现多平台图片多选功能的利器

Drag Select Compose:实现多平台图片多选功能的利器 在现代移动应用开发中,图片多选功能是一个常见且实用的需求。而实现这种功能可能涉及到复杂的手势处理和状态管理。今天,我将介绍一款强大的Compose多平台库——Drag Select Compose,它能够轻松实现类似于Google Photos…

Qt开发 | 无边框窗口 | 自定义标题栏 | 拖拽拉伸 | 窗口阴影 | 圆角窗口

文章目录 一、QWidget类介绍二、无边框窗口的基本实现三、自定义标题栏并实现拖拽拉伸四、设计一个无边框窗口公共类五、标题栏qss美化、关闭、最小化、最大化六、实现窗口阴影七、圆角窗口八、一个自定义标题栏带圆角阴影的窗口 一、QWidget类介绍 QWidget 是 Qt 框架中的一个…

SpringBoot整合MongoDB JPA使用

一、整合MongoDB SpringDataMongoDB是 SpringData家族成员之一&#xff0c;MongoDB的持久层框架&#xff0c;底层封装了 mongodb-driver。mongodb-driver 是 MongoDB官方推出的 Java连接 MongoDB的驱动包&#xff0c;相当于JDBC驱动。 SpringBoot整合 MongoDB&#xff0c;引入…