51单片机 AT24C02(I2C总线)

server/2025/1/15 23:01:14/

存储器

随机存储 RAM

只读存储 ROM

AT24C02芯片

是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息

存储材质:E2PROM

通讯接口:I2C总线

容量:256字节

I2C总线

一种通用的数据总线

两根通信线:SCL,SDA

同步、半双工、带数据应答

I2C电路规范

所有I2C设备的SCL连在一起,SDA连在一起

设备的SCL和SDA均要配置成开漏输出模式

SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

开漏输出和上拉电阻的共同作用实现了“线与"的功能,此设计主要

是为了解决多机通信互相干扰的问题

I2C时序结构

起始条件

SCL高电平期间,SDA从高电平切换到低电平

终止条件

SCL高电平期间,SDA从低电平切换到高电平

// 生成I2C启动条件void I2c_Start(){I2C_SDA = 1; // 拉高SDA线I2C_SCL = 1; // 拉高SCL线I2C_SDA = 0; // SDA线从高电平变为低电平,产生启动条件I2C_SCL = 0; // 拉低SCL线}// 生成I2C停止条件void I2C_Stop(){I2C_SDA = 0; // 拉低SDA线I2C_SCL = 1; // 拉高SCL线I2C_SDA = 1; // SDA线从低电平变为高电平,产生停止条件}

发送一个字节

SCL低电平期间,主机将数据位依次放到SDA线上

(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,

所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,

即可发送一个字节

// 发送一个字节数据void I2C_SendByte(unsigned char Byte){unsigned char i;for (i = 0; i < 8; i++) {I2C_SDA = Byte & (0x80 >> i); // 依次发送字节的每一位I2C_SCL = 1; // 拉高SCL线,产生时钟信号I2C_SCL = 0; // 拉低SCL线}}

接收一个字节

SCL低电平期间,从机将数据位依次放到SDA线上

(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位

所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次

即可接收一个字节(主机在接收之前,需要释放SDA)

// 接收一个字节数据unsigned char I2C_ReceiveByte(){unsigned char i, Byte = 0x00;I2C_SDA = 1; // 释放SDA线,准备接收数据for (i = 0; i < 8; i++) {I2C_SCL = 1; // 拉高SCL线,产生时钟信号if (I2C_SDA) {Byte |= (0x80 >> i); // 读取SDA线上的数据位}I2C_SCL = 0; // 拉低SCL线}return Byte; // 返回接收到的字节}

发送应答

在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答

接收应答

在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

// 发送应答信号void I2C_SendAck(unsigned char AckBit){I2C_SDA = AckBit; // 设置SDA线为应答信号I2C_SCL = 1; // 拉高SCL线,产生时钟信号I2C_SCL = 0; // 拉低SCL线}// 接收应答信号unsigned char I2C_ReceiveAck(){unsigned char AckBit;I2C_SDA = 1; // 释放SDA线,准备接收应答信号I2C_SCL = 1; // 拉高SCL线,产生时钟信号AckBit = I2C_SDA; // 读取SDA线上的应答信号I2C_SCL = 0; // 拉低SCL线return AckBit; // 返回接收到的应答信号}

 

SLAVE ADDRESS: A6-A3是固定的              

A2-A0是可配的

               最后一位是确定读或写的0是写,1是读

过程:

 开始——>发送从机地址 + write——>接收应答——>发送一个字节——>接受应答——>……发送字节——>接受应答——>结束

过程:

 开始——>发送从机地址 + read——>接收应答——>接收一个字节——>发送应答——>……接收字节——>发送应答or发送非应答——>结 束

字节写入和读取

// 向AT24C02的指定地址写入一个字节数据void AT24C02_WriteByte(unsigned char WordAddress, unsigned char Data){I2c_Start(); // 生成启动条件I2C_SendByte(AT24C02_ADDRESS); // 发送设备地址和写命令I2C_ReceiveAck(); // 接收应答信号I2C_SendByte(WordAddress); // 发送字地址I2C_ReceiveAck(); // 接收应答信号I2C_SendByte(Data); // 发送数据I2C_ReceiveAck(); // 接收应答信号I2C_Stop(); // 生成停止条件}// 从AT24C02的指定地址读取一个字节数据unsigned char AT24C02_ReadByte(unsigned char WordAddress){unsigned char Data;I2c_Start(); // 生成启动条件I2C_SendByte(AT24C02_ADDRESS); // 发送设备地址和写命令I2C_ReceiveAck(); // 接收应答信号I2C_SendByte(WordAddress); // 发送字地址I2C_ReceiveAck(); // 接收应答信号I2c_Start(); // 生成重复启动条件I2C_SendByte(AT24C02_ADDRESS | 0x01); // 发送设备地址和读命令I2C_ReceiveAck(); // 接收应答信号Data = I2C_ReceiveByte(); // 接收数据I2C_SendAck(1); // 发送非应答信号I2C_Stop(); // 生成停止条件return Data; // 返回读取的数据}

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化

每次数据传输都以字节为单位,每次传输的字节数不受限制。


http://www.ppmy.cn/server/158678.html

相关文章

计算机视觉算法实战——视频分析(Video Analysis)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​​ ​​​​​​​​​​​​ ​​​​​ 视频分析是计算机视觉中的一个重要领域&#xff0c;旨在从视频数据中提取有用的信息&…

java_mybatis_mapper_sql语句示例

需求&#xff1a; 有2张表&#xff0c;一张活动信息表(activity_info), 一张参加活动的商品表&#xff08;activity_sku&#xff09; 查询当前在活动期间的&#xff0c;且存在于我输入的商品(sku)列表中的商品(sku)的编号id 参考&#xff1a;63 尚上优选项目-平台管理端-营销…

多模态人工智能在零售业的未来:通过GPT-4 Vision和MongoDB实现智能产品发现

多模态人工智能在零售业的未来&#xff1a;通过GPT-4 Vision和MongoDB实现智能产品发现 引言 想象一下&#xff0c;顾客在购物时只需上传一张他们所期望的服装或产品的照片&#xff0c;几分钟内便能收到来自他们最喜欢的商店的个性化推荐。这就是多模态人工智能在零售领域所带…

【20250113】基于肌肉形变测量的连续步态相位估计算法,可自适应步行速度和地形坡度...

【基本信息】 论文标题&#xff1a;Continuous Gait Phase Estimation by Muscle Deformations with Speed and Ramp Adaptability 发表期刊&#xff1a;IEEE Sensors Journal 发表时间&#xff1a;2024年5月30日 【访问链接】 论文链接&#xff1a;https://ieeexplore.ieee.or…

JAVA实现2048小游戏(附源码)

文章目录 一、设计来源2048小游戏讲解1.1 主界面1.2 4*4难度界面1.3 5*5难度界面1.4 6*6难度界面1.5 挑战失败提示界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/a…

【2024年华为OD机试】(A卷,100分)- 密室逃生游戏 (Java JS PythonC/C++)

一、问题描述 题目描述 小强正在参加《密室逃生》游戏&#xff0c;当前关卡要求找到符合给定密码K&#xff08;升序的不重复小写字母组成&#xff09;的箱子&#xff0c;并给出箱子编号&#xff0c;箱子编号为1~N。 每个箱子中都有一个字符串s&#xff0c;字符串由大写字母、…

【Git版本控制器--2】Git的分支管理

目录 理解分支 分支基本操作 合并冲突 合并模式 分支策略 强制删除分支 理解分支 master主分支 git中会保存每一次我们进行的提交&#xff0c;并把它们保存在对像区中&#xff01; 如图所示的那条线&#xff0c;我们称他为提交时间线&#xff0c;也称之为主线 版本库中…

前端开发:表格、列表、表单

1.表格标签 align 是表格相对于周围元素的对齐方式. align"center" (表格相对于网页剧中对齐) border 表示边框. 1px 表示有边框(数字越大, 边框越粗), "" 表示没边框. cellpadding: 内容距离边框的距离, 默认 1 像素 cellspacing: 单元格之间的距离. 默…