51单片机 AT24C02(I2C总线)

存储器

随机存储 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.rhkb.cn/news/523.html

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

相关文章

G1原理—5.G1垃圾回收过程之Mixed GC

大纲 1.Mixed GC混合回收是什么 2.YGC可作为Mixed GC的初始标记阶段 3.Mixed GC并发标记算法详解(一) 4.Mixed GC并发标记算法详解(二) 5.Mixed GC并发标记算法详解(三) 6.并发标记的三色标记法 7.三色标记法如何解决错标漏标问题 8.SATB如何解决错标漏标问题 9.重新梳…

每天五分钟深度学习:神经网络中的激活函数

本文重点 激活函数在神经网络中是必不可以缺少的东西,当我们创建一个神经网络的时候,我们需要决定使用哪种激活函数用在隐藏层上,哪种激活函数用在输出结点上,我们以前的课程中我们使用的都是sigmoid激活函数,除此之外还有其它激活函数。本文我们就介绍一下那些经常使用的…

Java Web开发基础:HTML的深度解析与应用

文章目录 前言&#x1f30d;一.B/S 软件开发架构简述&#x1f30d;二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 &#x1f30d;三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…

iostat命令详解

iostat 命令是 I/O statistics(输入/输出统计)的缩写&#xff0c;用来报告系统的 CPU 统计信息和块设备及其分区的 IO 统计信息。iostat 是 sysstat 工具集的一个工具&#xff0c;在 Ubuntu 系统中默认是不带 iostat 命令的&#xff0c;需要自行安装&#xff1a; $ sudo apt in…

【数据库系统概论】数据库恢复技术

目录 11.1 事务的基本概念 事务的定义 事务的开始与结束 事务的ACID特性 破坏ACID特性的因素 11.2 数据库恢复概述 11.3 故障的种类 1. 事务内部的故障 2. 系统故障 3. 介质故障 4. 计算机病毒 11.4 恢复的实现技术 如何建立冗余数据 数据转储 登记日志文件 11…

通过Android Studio修改第三方jar包并重新生成jar包

最近接手了来自公司其他同事的一个Unity项目,里面有一个封装的jar包要改动一下,无奈关于这个jar包的原工程文件丢失了,于是自己动手来修改下jar包,并做下记录。 一、导入第三方jar包 1、新建项目EditJarDemo(项目名随便取) 2、新建libs文件夹,把你要修改的third.jar 复制…

2025新年源码免费送

2025很开门很开门的源码免费传递。不需要馒头就能获取4套大开门源码。 听泉偷宝&#xff0c;又进来偷我源码啦&#x1f44a;&#x1f44a;&#x1f44a;。欢迎偷源码 &#x1f525;&#x1f525;&#x1f525; 获取免费源码以及更多源码&#xff0c;可以私信联系我 我们常常…

数据分析思维(十一):应用篇——用数据分析解决问题

此前篇章&#xff1a; 数据分析思维&#xff08;一&#xff09;&#xff1a;业务指标&#xff08;数据分析并非只是简单三板斧&#xff09; 数据分析思维&#xff08;二&#xff09;&#xff1a;分析方法——5W2H分析方法、逻辑树分析方法、行业分析方法 数据分析思维&#…

基于Arduino平台,使用ESP32S3微处理器控制Servo时,内置Servo库无法使用

基于Arduino平台&#xff0c;使用ESP32S3微处理器驱动Servo时&#xff0c;报以下问题&#xff1a; *WARNING: library Servo claims to run on avr, megaavr, sam, samd, nrf52, stm32f4, mbed, mbed_nano, mbed_portenta, mbed_rp2040, renesas, renesas_portenta, renesas_un…

Linux : Linux环境开发工具vim / gcc / makefile / gdb / git的使用

Linux环境开发工具的使用 一、操作系统的生态二、程序下载安装&#xff08;一&#xff09;程序安装方式&#xff08;二&#xff09;包管理器 yum / apt 运行原理 三、文本编辑器 vim&#xff08;一&#xff09;认识vim 下的操作模式&#xff08;二&#xff09;命令模式常用的快…

HTML5 网站模板

HTML5 网站模板 参考 HTML5 Website Templates

怎么抓取ios 移动app的https请求?

怎么抓取IOS应用程序里面的https&#xff1f; 这个涉及到2个问题 1.电脑怎么抓到IOS手机流量&#xff1f; 2.HTTPS怎么解密&#xff1f; 部分app可以使用代理抓包的方式&#xff0c;但是正式点的app用代理抓包是抓不到的&#xff0c;例如pin检测&#xff0c;证书双向校验等…

记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据

文章目录 封装BrandPickerVirtual.vue组件页面使用组件属性 select下拉接口一次性返回10万条数据&#xff0c;页面卡死&#xff0c;如何优化&#xff1f;&#xff1f;这里使用 分页 虚拟列表&#xff08;vue-virtual-scroll-list&#xff09;&#xff0c;去模拟一个下拉的内容…

【芯片封测学习专栏 -- D2D 和 C2C 之间的区别】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】 文章目录 OverviewD2D&#xff08;Die-to-Die&#xff09;互联D2D 定义D2D 特点D2D 使用场景 C2C&#xff08;Chip-to-Chip&#xff09;互联C2C 定义C2C 特点C2C 使…

使用网页版Jupyter Notebook和VScode打开.ipynb文件

目录 正文 1、网页版Jupyter Notebook查看 2、VScode查看 因为总是忘记查看文件的网址&#xff0c;收藏了但分类众多每次都找不到……当个记录吧&#xff08;/捂脸哭&#xff09;&#xff01; 正文 此处以gitub中的某个仓库为例&#xff1a; https://github.com/INM-6/mu…

Qt监控系统远程网络登录/请求设备列表/服务器查看实时流/回放视频/验证码请求

一、前言说明 这几个功能是近期定制的功能&#xff0c;也非常具有代表性&#xff0c;核心就是之前登录和设备信息都是在本地&#xff0c;存放在数据库中&#xff0c;数据库可以是本地或者远程的&#xff0c;现在需要改成通过网络API请求的方式&#xff0c;现在很多的服务器很强…

企业级PHP异步RabbitMQ协程版客户端 2.0 正式发布

概述 workerman/rabbitmq 是一个异步RabbitMQ客户端&#xff0c;使用AMQP协议。 RabbitMQ是一个基于AMQP&#xff08;高级消息队列协议&#xff09;实现的开源消息组件&#xff0c;它主要用于在分布式系统中存储和转发消息。RabbitMQ由高性能、高可用以及高扩展性出名的Erlan…

百度视频搜索架构演进

导读 随着信息技术的迅猛发展&#xff0c;搜索引擎作为人们获取信息的主要途径&#xff0c;其背后的技术架构也在不断演进。本文详细阐述了近年来视频搜索排序框架的重大变革&#xff0c;特别是在大模型技术需求驱动下&#xff0c;如何从传统的多阶段级联框架逐步演变为更加高…

31_搭建Redis分片集群

Redis的主从复制模式和哨兵模式可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:海量数据存储问题、高并发写的问题。由于数据量过大,单个master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Red…

如何用 ESP32-CAM 做一个实时视频流服务器

文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用&#xff1f;GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…