13.IIC-EEPROM(AT24C02)

1.为什么需要EEPROM?

        在单片机开发中,断电数据保存是常见的需求。例如,智能家居设备的用户设置、电子秤的校准参数等都需要在断电后仍能保留。AT24C02作为一款IIC接口的EEPROM芯片,具备以下优势:

  • 非易失性存储:断电后数据不丢失。
  • 容量适中:256字节(2Kb),适合存储小规模数据。
  • 接口简单:仅需两根信号线(SDA、SCL),节省单片机IO口资源。

2.AT24C02硬件解析

1.芯片特性

  • 工作原理:2.7V~5.5V(兼容51单片机5V供电)。
  • 存储结构:分32页,每页八字节,支持页写入模式。
  • 器件地址:高4位固定为1010,低四位由A0~A2引脚电平决定(默认接地地址为0xA0)。

2.硬件连接

 3.IIC协议核心原理

        IIC协议通过时序信号实现数据传输,需掌握以下关键操作:

1.起始信号与停止信号

        在通信里,SCL 线高电平时,SDA 线从高到低是起始信号,从低到高是终止信号,都由主机发。起始信号一出现,总线被占用;终止信号发出后,总线恢复空闲。

void I2C_Start(void)
{I2C_SDA=1;I2C_SCL=1;I2C_SDA=0;I2C_SCL=0;
}
void I2C_Stop(void)
{I2C_SDA=0;I2C_SCL=1;I2C_SDA=1;
}

 2.数据有效性规定

        I2C 总线传输数据时,时钟信号高电平时,数据线数据要保持稳定,仅时钟信号低电平时,数据线电平状态才可改变。每次数据传输以字节为单位,且传输的字节数量不设上限。

void I2C_SendByte(unsigned char Byte)
{unsigned char i;for (i=0;i<8;i++){I2C_SDA=Byte&(0x80>>i);I2C_SCL=1;I2C_SCL=0;}
}
unsigned char I2C_ReceiveByte(void)
{unsigned char i,Byte=0x00;I2C_SDA=1;for(i=0;i<8;i++){I2C_SCL=1;if(I2C_SDA){Byte|=(0x80>>i);}I2C_SCL=0;}return Byte;	
}

3.应答响应

         I2C 总线数据传输时,发送器件传完一字节数据后,需紧跟校验位。此校验位由接收端控制 SDA 实现,是传输响应,分“应答(ACK)”和“非应答(NACK)”。 接收端收到字节数据或地址后,想继续接收就发“应答(ACK)”低电平脉冲,发送方继续发数据;想结束则发“非应答(NACK)”高电平脉冲,发送方产生停止信号。 每个字节 8 位,先传最高位,后随一位应答位,一帧共 9 位。若从机不对寻址信号应答,将数据线置高,主机发终止信号。从机接收中无法继续,通过“非应答”通知主机结束。主机接收完最后一字节,用“非应答”结束,从机释放 SDA 线。起始信号必需,结束和应答信号可选。

void I2C_SendAct(bit ActBit)
{I2C_SDA=ActBit;I2C_SCL=1;I2C_SCL=0;
}
unsigned char I2C_ReceiveAct(void)
{unsigned char ActBit;I2C_SDA=1;I2C_SCL=1;ActBit=I2C_SDA;I2C_SCL=0;return ActBit;
}

4.总线的寻址方式

4.AT24C02介绍

        AT24C02器件地址为7位,高四位固定为1010,低3位由A0/A1/A2信号的电平决定。因为传输地址或数据是以字节为单位传送的,当传送地址时,器件地址占7位,还有最后一位(最低位R/W)用来选择读写方向,它与地址无关。其格式如下:

​
#define AT24C02_ADDRESS		0xA0​

        本开发板已经将A0/A1/A2连接到GND,所以器件地址为1010000,即0x50(未计算最低位)。如果要对芯片进行写操作时,R/W即为0,写器件地址即为0xA0;如果要对芯片进行读操作时,R/W即为1,此时读器件地址为0xA1。开发板上也将WP引脚直接接在GND上,此时芯片允许数据正常读写。

        IIC总线时序如下:

1.写入一个字节

// 向AT24C02指定地址写入一个字节
void AT24C02_WriteByte(unsigned char WordAddress, unsigned char Data) {I2C_Start();I2C_SendByte(AT24C02_ADDRESS);if (I2C_ReceiveAct()) {// 应答错误处理,可根据需求添加更多逻辑return;}I2C_SendByte(WordAddress);if (I2C_ReceiveAct()) {return;}I2C_SendByte(Data);if (I2C_ReceiveAct()) {return;}I2C_Stop();
}
  1. 启动 I2C 通信 (I2C_Start()):通过 I2C_Start 函数产生 I2C 起始信号,标志着一次新的 I2C 通信开始。
  2. 发送设备地址 (I2C_SendByte(AT24C02_ADDRESS)):将 AT24C02 的设备地址发送到总线上。AT24C02_ADDRESS 是 AT24C02 的 7 位设备地址加上读写位(写操作时读写位为 0)。发送完设备地址后,调用 I2C_ReceiveAct 函数检查 AT24C02 是否返回了应答信号。如果没有收到应答信号,说明通信可能出现问题,函数直接返回。
  3. 发送存储地址 (I2C_SendByte(WordAddress)):将想要写入数据的存储地址发送到总线上。同样,发送完后检查 AT24C02 的应答信号。
  4. 发送要写入的数据 (I2C_SendByte(Data)):将需要写入到 AT24C02 中的数据发送到总线上,然后再次检查应答信号。
  5. 停止 I2C 通信 (I2C_Stop()):通过 I2C_Stop 函数产生 I2C 停止信号,结束本次通信。

2.读取一个字节

unsigned char AT24C02_ReadByte(unsigned char WordAddress) {unsigned char Data;I2C_Start();I2C_SendByte(AT24C02_ADDRESS);if (I2C_ReceiveAct()) {return 0;  // 应答错误,返回0}I2C_SendByte(WordAddress);if (I2C_ReceiveAct()) {return 0;}I2C_Start();I2C_SendByte(AT24C02_ADDRESS | 0x01);if (I2C_ReceiveAct()) {return 0;}Data = I2C_ReceiveByte();I2C_SendAct(1);  // 发送非应答位I2C_Stop();return Data;
}

​​​​​​​​​​​​​​

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

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

相关文章

ubuntu22.04安装P104-100一些经验(非教程)

一、版本&#xff1a; 系统&#xff1a;ubuntu-22.04.5-desktop-amd64.iso Nvidia 驱动&#xff1a;NVIDIA-Linux-x86_64-570.124.04.run。官网下载即可 二、经验 1、通用教程⭐ 直接关键词搜“ubuntu p104”会有一些教程&#xff0c;比如禁用nouveau等 安装参考&#xff1a…

TCP7680端口是什么服务

WAF上看到有好多tcp7680端口的访问信息 于是上网搜索了一下&#xff0c;确认TCP7680端口是Windows系统更新“传递优化”功能的服务端口&#xff0c;个人理解应该是Windows利用这个TCP7680端口&#xff0c;直接从内网已经具备更新包的主机上共享下载该升级包&#xff0c;无需从微…

OSI七大模型 --- 发送邮件

我想通过电子邮件发送一张照片给我的朋友。从我开始写邮件到发送成功&#xff0c;按照这个顺序讲一下我都经历了OSI模型的哪一层&#xff0c;对应的层使用了什么样的协议&#xff1f; 完整流程示例&#xff08;补充物理层细节&#xff09; 假设你通过Wi-Fi发送邮件&#xff1a…

LINUX网络基础 [一] - 初识网络,理解网络协议

目录 前言 一. 计算机网络背景 1.1 发展历程 1.1.1 独立模式 1.1.2 网络互联 1.1.3 局域网LAN 1.1.4 广域网WAN 1.2 总结 二. "协议" 2.1 什么是协议 2.2 网络协议的理解 2.3 网络协议的分层结构 三. OSI七层模型&#xff08;理论标准&#xff09; …

【LLms】关键词提取

1. 停用词 在文本处理和信息检索领域&#xff0c;停用词&#xff08;Stop Words&#xff09;是指在文本中出现频率较高&#xff0c;但通常不包含实际语义信息或对语义理解贡献较小的词汇。这些词汇通常是一些常见的功能词&#xff0c;如冠词、介词、连词、代词、感叹词、助动词…

1998-2022年各地级市三次产业占比/地级市国内生产总值构成/地级市第一产业占比、第二产业占比、第三产业占比数据(全市)

1998-2022年各地级市三次产业占比/地级市国内生产总值构成/地级市第一产业占比、第二产业占比、第三产业占比数据&#xff08;全市&#xff09; 1、时间&#xff1a;1998-2022年 2、指标&#xff1a;第一产业占比、第二产业占比、第三产业占比 3、来源&#xff1a;城市统计年…

基于STM32的简易出租车计费设计(Proteus仿真+程序+设计报告+原理图PCB+讲解视频)

这里写目录标题 1.主要功能资料下载链接&#xff1a;2.仿真3. 程序4. 原理图PCB5. 实物图6. 设计报告7. 下载链接 基于STM32的简易出租车计费设计(Proteus仿真程序设计报告原理图PCB讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1…

HAL库启动ADC的三个函数的区别

HAL_ADC_Start 应该是启动ADC转换的最基本函数。只是启动一次转换&#xff0c;然后需要用户自己去查询转换是否完成&#xff0c;或者可能只是单次转换。比如&#xff0c;当调用这个函数后&#xff0c;ADC开始转换&#xff0c;但程序需要不断检查某个标志位来看转换是否完成&am…

EXIT原理和使用

要用到的控制器NVIC(中断总控制器)、EXIT&#xff08;外部中断控制器&#xff09; (EXIT是NVIC是下属) GPIO外部中断简图 EXIT的基本概念 EXIT主要特性 EXTI工作原理框图&#xff08;从输入线开始看&#xff09; 6个寄存器 EXTI和IO的映射关系 AFIO简介 EXTI与IO对应关系 如…

经典核密度估计(Kernel Density Estimation):从直觉到数学

经典核密度估计&#xff08;Kernel Density Estimation&#xff09;&#xff1a;从直觉到数学 作为一名在大模型时代进入深度学习领域的研究者&#xff0c;你可能对 Transformer、扩散模型等现代技术驾轻就熟。然而&#xff0c;在阅读一些生成模型的文献&#xff08;如 Explic…

Halcon 算子 一维码检测识别、项目案例

首先我们要明白码的识别思路 把窗口全部关闭读取新的图片图像预处理创建条码模型设置模型参数搜索模型获取条码结果显示条码结果 图像预处理和条码增强 对比度太低&#xff1a; scale_image&#xff08;或使用外部程序scale_image_range&#xff09;,增强图像的对比度图像模糊…

vue-cli3+vue2+elementUI+avue升级到vite+vue3+elementPlus+avue总结

上一个新公司接手了一个vue-cli3vue2vue-router3.0elementUI2.15avue2.6的后台管理项目&#xff0c;因为vue2在2023年底已经不更新维护了&#xff0c;elementUI也只支持到vue2&#xff0c;然后总结了一下vue3的优势&#xff0c;最后批准升级成为了vitevue3vue-router4.5element…

SpringBoot实战(三十五)微服务集成OAuth2.0(UAA)

目录 一、知识回顾1.1 什么是 OAuth2 协议&#xff1f;1.2 OAuth2 的4个角色1.3 OAuth2 的3种令牌1.4 OAuth2 的5种认证方式1.5 OAuth2 内置接口地址 二、UAA介绍2.1 概述2.2 UAA的主要功能2.3 UAA 的应用场景 三、微服务集成3.1 集成示例介绍3.2 集成测试 一、知识回顾 在进行…

红果短剧安卓+IOS双端源码,专业短剧开发公司

给大家拆解一下红果短剧/河马短剧&#xff0c;这种看光解锁视频&#xff0c;可以挣金币的短剧APP。给大家分享一个相似的短剧APP源码&#xff0c;这个系统已接入穿山甲广告、百度广告、快手广告、腾讯广告等&#xff0c;类似红果短剧的玩法&#xff0c;可以看剧赚钱&#xff0c…

从0开始的操作系统手搓教程23:构建输入子系统——实现键盘驱动1——热身驱动

目录 所以&#xff0c;键盘是如何工作的 说一说我们的8042 输出缓冲区寄存器 状态寄存器 控制寄存器 动手&#xff01; 注册中断 简单整个键盘驱动 Reference ScanCode Table 我们下一步就是准备进一步完善我们系统的交互性。基于这个&#xff0c;我们想到的第一个可以…

百度SEO关键词布局从堆砌到场景化的转型指南

百度SEO关键词布局&#xff1a;从“堆砌”到“场景化”的转型指南 引言 在搜索引擎优化&#xff08;SEO&#xff09;领域&#xff0c;关键词布局一直是核心策略之一。然而&#xff0c;随着搜索引擎算法的不断升级和用户需求的多样化&#xff0c;传统的“关键词堆砌”策略已经…

Python ❀ Unix时间戳转日期或日期转时间戳工具分享

设计一款Unix时间戳和日期转换工具&#xff0c;其代码如下&#xff1a; from datetime import datetimeclass Change_Date_Time(object):def __init__(self, date_strNone, date_numNone):self.date_str date_strself.date_num date_num# 转时间戳def datetime2timestamp(s…

【目标检测】【NeuralPS 2023】Gold-YOLO:通过收集与分发机制实现的高效目标检测器

Gold-YOLO&#xff1a; Efficient Object Detector via Gather-and-Distribute Mechanism Gold-YOLO&#xff1a;通过收集与分发机制实现的高效目标检测器 0.论文摘要 在过去的几年中&#xff0c;YOLO系列模型已成为实时目标检测领域的领先方法。许多研究通过修改架构、增强数…

π0源码解析——一个模型控制7种机械臂:对开源VLA sota之π0源码的全面分析,含我司的部分落地实践

前言 ChatGPT出来后的两年多&#xff0c;也是我疯狂写博的两年多(年初deepseek更引爆了下)&#xff0c;比如从创业起步时的15年到后来22年之间 每年2-6篇的&#xff0c;干到了23年30篇、24年65篇、25年前两月18篇&#xff0c;成了我在大模型和具身的原始技术积累 如今一转眼…

K8s 1.27.1 实战系列(六)Pod

一、Pod介绍 1、Pod 的定义与核心设计 Pod 是 Kubernetes 的最小调度单元,由一个或多个容器组成,这些容器共享网络、存储、进程命名空间等资源,形成紧密协作的应用单元。Pod 的设计灵感来源于“豌豆荚”模型,容器如同豆子,共享同一环境但保持隔离性。其核心设计目标包括…