I2C 读写 AT24C02

根据AT24C02的 Datasheet 可知AT24C02有2K bit,即256B,分为32页,每页8个字节,结合数据手册和原理图可以得知,板载AT24C02的读地址为0xA2,写地址为0xA3

#define	AT24C02_ADDR_WRITE	0xA2
#define	AT24C02_ADDR_READ	0xA3

  • MSB(Most Significant Bit):即最高有效位,是二进制数中权重最大的位。在一个二进制数里,它位于最左边,对数值大小的影响最大。例如,在二进制数 1010 中,最左边的 1 就是 MSB,它代表的权重是 23=8。
  • LSB(Least Significant Bit):也就是最低有效位,是二进制数中权重最小的位。它处于二进制数的最右边,对数值大小的影响最小。比如在二进制数 1010 中,最右边的 0 就是 LSB,它代表的权重是 20=1。

图中展示的是 AT24C02(I2C 接口的 EEPROM 芯片)的 “字节写” 操作时序,以下是对该时序的详细解释:
1. 起始信号(START)
• 作用:主设备通过拉低 SDA 线(在 SCL 为高电平时)发起通信,标志一次 I2C 传输的开始。
• 图示:图中 “SDA LINE” 波形的第一个跳变,由高变低,触发起始条件。
2. 设备地址(DEVICE ADDRESS)
• 内容:7 位 AT24C02 设备地址(MSB 先传输) + 1 位读写控制位(R/W)。写操作时,R/W = 0。
• 意义:主设备通过发送设备地址,选中总线上的 AT24C02 从设备,告知其即将进行写操作。
3. 字地址(WORD ADDRESS)
• 内容:8 位地址(MSB 到 LSB 依次传输),用于指定 AT24C02 中要写入数据的存储单元位置。
• 作用:AT24C02 有 256 字节存储空间,需通过字地址精准定位目标存储单元。
4. 数据(DATA)
• 内容:主设备发送的 8 位数据(MSB 先,LSB 后),即实际写入 AT24C02 的数据内容。
• 传输:数据跟随在字地址之后,按 I2C 协议的字节传输格式发送。
5. 应答位(ACK)
• 机制:每传输完一个字节(设备地址、字地址、数据),接收方(AT24C02)需在第 9 个时钟周期拉低 SDA 线,返回 ACK 信号,表示成功接收。
• 图示:每个字节传输后标注的 “ACK”,体现 I2C 通信的应答确认机制。
6. 停止信号(STOP)
• 作用:主设备通过拉高 SDA 线(在 SCL 为高电平时)结束本次通信,释放 I2C 总线。
• 图示:图中最后 SDA 线由低变高的跳变,标志字节写操作完成。
完整流程总结
主设备先发送起始信号,接着发送含写控制位的设备地址,等待 AT24C02 应答;再发送字地址(指定存储位置),再次等待应答;最后发送数据字节,待 AT24C02 应答后,主设备发送停止信号,完成一次字节写操作。整个过程严格遵循 I2C 协议的时序规范,确保数据准确写入 AT24C02 的指定地址。

看原理图   

扩展板

核心板引脚

STM32Cubemax 

写入

/*** @brief		AT24C02任意地址写一个字节数据* @param		addr —— 写数据的地址(0-255)* @param		dat  —— 存放写入数据的地址* @retval		成功 —— HAL_OK
*/
uint8_t At24c02_Write_Byte(uint16_t addr, uint8_t* dat)
{return HAL_I2C_Mem_Write(&hi2c1, AT24C02_ADDR_WRITE, addr, I2C_MEMADD_SIZE_8BIT, dat, 1, 0xFFFF);
}

/*** @brief		AT24C02任意地址读一个字节数据* @param		addr —— 读数据的地址(0-255)* @param		read_buf —— 存放读取数据的地址* @retval		成功 —— HAL_OK
*/
uint8_t At24c02_Read_Byte(uint16_t addr, uint8_t* read_buf)
{return HAL_I2C_Mem_Read(&hi2c1, AT24C02_ADDR_READ, addr, I2C_MEMADD_SIZE_8BIT, read_buf, 1, 0xFFFF);
}

测试

    uint8_t write_dat = 0xa5;uint8_t recv_buf = 0;if(HAL_OK == At24c02_Write_Byte(10,&write_dat)){printf("Write ok\n");}else{printf("Write fail\n");}HAL_Delay(50);		//写一次和读一次之间需要短暂的延时if(HAL_OK == At24c02_Read_Byte(10,&recv_buf)){printf("Read ok, recv_buf = 0x%02X\n", recv_buf);}else{printf("Read fail\n");}

串口测试 

这款芯片的读写比较简单 只需要配置好相关的协议就可以直接进行读写操作

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

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

相关文章

K8S学习之基础七十四:部署在线书店bookinfo

部署在线书店bookinfo 在线书店-bookinfo 该应用由四个单独的微服务构成,这个应用模仿在线书店的一个分类,显示一本书的信息,页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本…

Linux 查找文本中控制字符所在的行

参考资料 ASCIIコード表 目录 一. 业务背景二. 遇到的问题三. 分析3.1 url编码的前置知识3.2 出现控制字符的transactionid分析3.3 16进制分析 四. 从文本中查找控制字符所在的行五. 控制字符一览 一. 业务背景 ⏹在项目中,业务请求对应着下URL http://www.test.…

python将pdf文件转为图片,如果pdf文件包含多页,将转化的多个图片通过垂直或者水平合并成一张图片

要将PDF文件转换为图片,并将多页PDF垂直合并成一张图片,可以使用PyMuPDF(也称为fitz)库来读取PDF文件,并使用Pillow库来处理和合并图片。以下是一个示例代码,展示了如何实现这个功能: 首先&…

HarmonyOS 基础组件和基础布局的介绍

1. HarmonyOS 基础组件 1.1 Text 文本组件 Text(this.message)//文本内容.width(200).height(50).margin({ top: 20, left: 20 }).fontSize(30)//字体大小.maxLines(1)// 最大行数.textOverflow({ overflow: TextOverflow.Ellipsis })// 超出显示....fontColor(Color.Black).…

FrameWork基础案例解析(四)

文章目录 单独拉取framework开机与开机动画横屏Android.mk语法单独编译SDKmake 忽略warning单独修改和编译Camera2单独编译Launcher3Android Studio 导入、修改、编译Settings导入 Android Studio 导入、修改、编译Launcher3android 开机默认进入指定Launcher植入自己的apk到系…

基于vscode(GDB)调试ros2节点

一、环境准备 必备vscode插件 1)Docker Docker - Visual Studio Marketplace 2)Dev Containers Dev Containers - Visual Studio Marketplace 3)GDB GDB Debug - Visual Studio Marketplace 二、进去docker镜像 1)docker安…

基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 这些年随着Internet的迅速发展,我们国家和世界都已经进入了互联网大数据时代,计算机网络已经成为了整个社会以及经济发展的巨大动能,考研成绩查询管理事务现在已经成为社会关注的重要内容,因此运用互联网技术来提高考研成绩…

C++:算术运算符

程序员Amin 🙈作者简介:练习时长两年半,全栈up主 🙉个人主页:程序员Amin 🙊 P   S : 点赞是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全…

PyQt6实例_A股日数据维护工具_使用

目录 前置: 下载预备更新的数据 使用工具更新 用工具下载未复权、前复权、权息数据 在PostgreSQL添加两个数据表 工具&视频 前置: 1 本系列将以 “PyQt6实例_A股日数据维护工具” 开头放置在“PyQt6实例”专栏 2 日数据可在“数据库”专栏&…

REST 方法

FUNCTION ZFM_INTERFACE_LOG. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" REFERENCE(IV_DSTART) TYPE EDI_UPDDAT *"---------------------------------------…

QT 中的元对象系统(五):QMetaObject::invokeMethod的使用和实现原理

目录 1.简介 2.原理概述 3.实现分析 3.1.通过方法名调用方法的实现分析 3.2.通过可调用对象调用方法的实现分析 4.使用场景 5.总结 1.简介 QMetaObject::invokeMethod 是 Qt 框架中的一个静态方法,用于在运行时调用对象的成员函数。这个方法提供了一种动态调…

Unity3D开发AI桌面精灵/宠物系列 【三】 语音识别 ASR 技术、语音转文本多平台 - 支持科大讯飞、百度等 C# 开发

Unity3D 交互式AI桌面宠物开发系列【三】ASR 语音识别 该系列主要介绍怎么制作AI桌面宠物的流程,我会从项目开始创建初期到最终可以和AI宠物进行交互为止,项目已经开发完成,我会仔细梳理一下流程,分步讲解。 这篇文章主要讲有关于…

Java 状态模式 详解

状态模式详解 一、状态模式概述 状态模式(State Pattern)是一种行为型设计模式,它允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类。 核心特点 状态封装:将每个状态的行为封装到独立的类中状态转换&#xff1a…

Nginx 配置 HTTPS 与 WSS 完整指南

Nginx 配置 HTTPS 与 WSS 完整指南 本教程将手把手教你如何为网站配置 HTTPS 加密访问,并通过反向代理实现安全的 WebSocket(WSS)通信。以 https://www.zhegepai.cn 域名为例,完整流程约需 30 分钟完成。 一、前置准备 1.1 域名…

双向链表的理解

背景 代码中经常会出现双向链表,对于双向链表的插入和删除有对应的API函数接口,但直观的图表更容易理解,所以本文会对rt-thread内核代码中提供的双向链表的一些API函数操作进行绘图,方便后续随时查看。 代码块 rt-thread中提供…

大文件上传源码,支持单个大文件与多个大文件

大文件上传源码,支持单个大文件与多个大文件 Ⅰ 思路Ⅱ 具体代码前端--单个大文件前端--多个大文件前端接口后端 Ⅰ 思路 具体思路请参考我之前的文章,这里分享的是上传流程与源码 https://blog.csdn.net/sugerfle/article/details/130829022 Ⅱ 具体代码…

Unity中的静态合批使用整理

静态批处理是一种绘制调用批处理方法,它组合不移动的网格以减少绘制调用。它将组合的网格转换为世界空间,并为它们构建一个共享顶点和索引缓冲区。然后,对于可见网格,Unity 会执行一系列简单的绘制调用,每个调用之间几…

【机器学习中的基本术语:特征、样本、训练集、测试集、监督/无监督学习】

机器学习基本术语详解 1. 特征(Feature) 定义:数据的属性或变量,用于描述样本的某个方面。作用:模型通过学习特征与目标之间的关系进行预测。示例: 预测房价时,特征可以是 面积、地段、房龄。…

C++学习之路:指针基础

目录 指针介绍与基本用法双重指针函数指针空指针与野指针函数参数的指针传递最后 指针一般在C/C语言学习的后期接触,这样就导致指针给新手一种高深莫测、难以掌握的刻板印象。但实际上指针的使用很简单,并且还能够极大的提高程序的灵活性,帮助…

【服务日志链路追踪】

MDCInheritableThreadLocal和spring cloud sleuth 在微服务架构中,日志链路追踪(Logback Distributed Tracing) 是一个关键需求,主要用于跟踪请求在不同服务间的调用链路,便于排查问题。常见的实现方案有两种&#x…