初学stm32 --- II2C_AT24C02,向EEPROM中读写数据
目录
IIC总线协议介绍
IIC总线结构图
IIC协议时序
1. ACK(Acknowledge)
2. NACK(Not Acknowledge)
IO口模拟II2C协议
发送起始信号:
发送停止信号:
检测应答信号:
发送应答信号:
发送非应答信号:
读取1字节数据:
AT24C02介绍
AT24C02通讯地址
AT24C02读写时序
I²C 相关的 AC 特性表
AT24C02写时序
AT24C02读时序
AT24C02驱动步骤
IIC配置步骤
为什么IIC总线SDA建议用开漏模式?
AT24C02配置步骤
IIC总线协议介绍
IIC:Inter Integrated Circuit,集成电路总线,是一种同步 串行 半双工通信总线。
总线:就是传输数据的通道
协议:就是传输数据的规则
IIC总线结构图

① 由时钟线SCL和数据线SDA组成,并且都接上拉电阻,确保总线空闲状态为高电平
② 总线支持多设备连接,允许多主机存在,每个设备都有一个唯一的地址
③ 连接到总线上的数目受总线的最大电容400pf限制
④ 数据传输速率:标准模式100k bit/s 快速模式400k bit/s 高速模式3.4Mbit/s
可以归纳为:

-
主设备向从设备写数据时:
- 主设备先发送起始信号(
START信号),然后发送数据,每次发送 1 个字节(8 位)。主设备在发送完一个字节后,等待从设备返回应答信号(ACK)。如果主机收到 ACK 信号,表示从机已正确接收该字节,主机可以选择继续发送下一个字节,或者发送停止信号(STOP信号)来结束通信。
- 主设备先发送起始信号(
-
主设备向从设备读数据时:
- 主设备先发送起始信号(
START信号),然后开始接收从设备发送的数据。主设备每接收 1 个字节后,需要发送一个应答信号(ACK)给从设备,表示数据接收成功。如果主机发送 ACK 信号,从机会继续发送下一个字节;如果主机发送非应答信号(NACK),表示主机不再需要更多数据,并且主机应发送停止信号(STOP信号)来结束通信。
- 主设备先发送起始信号(
II2C的数据有效性,是指数据的读取和写入只在SCK高电平的时候有效。
II2C的数据传输顺序,是先从高位到低位的写入与读取。
空闲状态,是SDA和SCK空闲时为高电平。
IIC协议时序

起始信号(S):当SCL为高电平时,SDA从高电平变为低电平
停止信号(P):当SCL为高电平时,SDA从低电平变为高电平
应答信号:上拉电阻影响下SDA默认为高,而从机拉低SDA就是确认收到数据即ACK,否则NACK
1. ACK(Acknowledge)
-
含义:
- ACK 表示确认信号,意味着接收方成功接收到数据字节,并准备好接收或发送下一个字节。
-
工作原理:
- 数据传输完成后,发送方会在第 9 个时钟周期期间释放 SDA 线(即保持高阻态)。
- 接收方会在此时 拉低 SDA 线(保持低电平),以此表示数据接收成功。
-
触发条件:
- 由接收方发送 ACK 信号。例如:
- 当主机写数据时:从机发送 ACK,表示它成功接收到该字节。
- 当主机读数据时:主机发送 ACK,表示它成功接收到从机发来的字节。
- 由接收方发送 ACK 信号。例如:
2. NACK(Not Acknowledge)
-
含义:
- NACK 表示非确认信号,意味着接收方没有成功接收到数据字节,或者不需要继续通信。
-
工作原理:
- 数据传输完成后,发送方会在第 9 个时钟周期期间释放 SDA 线。
- 接收方保持 SDA 线为高电平,表示未确认(NACK)。
-
触发条件:
- 由接收方发送 NACK 信号。例如:
- 当主机写数据时:从机发送 NACK,表示它未能正确接收数据,或者它无法继续接收数据。
- 当主机读数据时:主机发送 NACK,表示它不需要从机发送更多数据,并准备终止通信。
- 由接收方发送 NACK 信号。例如:
IO口模拟II2C协议

发送起始信号:
/*** @brief 产生IIC起始信号* @param 无* @retval 无*/
void iic_start(void)
{IIC_SDA(1);IIC_SCL(1);iic_delay();IIC_SDA(0); /* START信号: 当SCL为高时, SDA从高变成低, 表示起始信号 */iic_delay();IIC_SCL(0); /* 钳住I2C总线,准备发送或接收数据 */iic_delay();
}
发送停止信号:
/*** @brief 产生IIC停止信号* @param 无* @retval 无*/
void iic_stop(void)
{IIC_SDA(0); /* STOP信号: 当SCL为高时, SDA从低变成高, 表示停止信号 */iic_delay();IIC_SCL(1);iic_delay();IIC_SDA(1); /* 发送I2C总线结束信号 */iic_delay();
}
检测应答信号:
/*** @brief 等待应答信号到来* @param 无* @retval 1,接收应答失败* 0,接收应答成功*/
uint8_t iic_wait_ack(void)
{uint8_t waittime = 0;uint8_t rack = 0;IIC_SDA(1); /* 主机释放SDA线(此时外部器件可以拉低SDA线) */iic_delay();IIC_SCL(1); /* SCL=1, 此时从机可以返回ACK */iic_delay();while (IIC_READ_SDA) /* 等待应答 */{waittime++;if (waittime > 250){iic_stop();rack = 1;break;}}IIC_SCL(0); /* SCL=0, 结束ACK检查 */iic_delay();return rack;
}
发送应答信号:
/*** @brief 产生ACK应答* @param 无* @retval 无*/
void iic_ack(void)
{IIC_SDA(0); /* SCL 0 -> 1 时 SDA = 0,表示应答 */iic_delay();IIC_SCL(1); /* 产生一个时钟 */iic_delay();IIC_SCL(0);iic_delay();IIC_SDA(1); /* 主机释放SDA线 */iic_delay();
}
发送非应答信号:
/*** @brief 不产生ACK应答* @param 无* @retval 无*/
void iic_nack(void)
{IIC_SDA(1); /* SCL 0 -> 1 时 SDA = 1,表示不应答 */iic_delay();IIC_SCL(1); /* 产生一个时钟 */iic_delay();IIC_SCL(0);iic_delay();
}
发送1字节数据:
/*** @brief IIC发送一个字节* @param data: 要发送的数据* @retval 无*/
void iic_send_byte(uint8_t data)
{uint8_t t;for (t = 0; t < 8; t++){IIC_SDA((data & 0x80) >> 7); /* 高位先发送 */iic_delay();IIC_SCL(1);iic_delay();IIC_SCL(0);data <<= 1; /* 左移1位,用于下一次发送 */}IIC_SDA(1); /* 发送完成, 主机释放SDA线 */
}
读取1字节数据:
/*** @brief IIC读取一个字节* @param ack: ack=1时,发送ack; ack=0时,发送nack* @retval 接收到的数据*/
uint8_t iic_read_byte(uint8_t ack)
{uint8_t i, receive = 0;for (i = 0; i < 8; i++ ) /* 接收1个字节数据 */{receive <<= 1; /* 高位先输出,所以先收到的数据位要左移 */IIC_SCL(1);iic_delay();if (IIC_READ_SDA){receive++;}IIC_SCL(0);iic_delay();}if (!ack){iic_nack(); /* 发送nACK */}else{iic_ack(); /* 发送ACK */}return receive;
}
AT24C02介绍
EEPROM是一种掉电后数据不丢失的储存器,常用来存储一些配置信息,在系统重新上电时就可以加载。
AT24C02是一个2K bit的EEPROM存储器,使用IIC通信方式。


AT24C02通讯地址

AT24C02读写时序
AT24C02支持的读写操作
写操作:
AT24C02支持字节写模式和页写模式。
字节写模式就是一个地址一个数据进行写入。
页写模式就是连续写入数据。只需要写一个地址,连续写入数据时地址会自增,但存在页的限制,超出一页时,超出数据覆盖原先写入的数据。但读会自动翻页。
读操作:
AT24C02支持当前地址读模式,随机地址读模式和顺序读模式。
当前读模式是基于上一次读/写操作的最后位置继续读出数据。
随机地址读模式是指定地址读出数据。
顺序读模式是连续读出数据。
I²C 相关的 AC 特性表
(用于 AT24C01A/02/04/08A/16A 存储器)

-
t_LOW:- 含义:SCL 低电平脉冲宽度。
- 范围:最小值为 1.2 μs。
- 表示 SCL 保持低电平的最短时间。
-
t_HIGH:- 含义:SCL 高电平脉冲宽度。
- 范围:最小值为 0.6 μs。
- 表示 SCL 保持高电平的最短时间。
- t_WR
- 含义:写周期时间。
- 范围:典型值为 5 ms。
- 表示从机完成一次写操作所需的时间。
这里的,我们设置t_LOW = t_HIGH = 2us。
t_WR表示缓冲时间,是表示写入之后,在下一次写入之前要等待的缓冲时间,要大于5ms,这里我们设置为10ms
AT24C02写时序

AT24C02读时序

AT24C02驱动步骤
硬件和软件IIC对比

IIC配置步骤
1、使能SCL和SDA对应时钟
__HAL_RCC_GPIOB_CLK_ENABLE()
2、设置GPIO工作模式
SDA开漏/SCL推挽输出模式,使用HAL_GPIO_Init初始化
3、编写基本信号
起始信号 停止信号 应答信号
4、编写读和写函数
iic_read_byte
iic_send_byte
注意:发送完成,主机释放SDA
为什么IIC总线SDA建议用开漏模式?
IIC的SDA脚即要作为输出,又要作为输入,用开漏输出模式,很好实现输出输入共用,避免IO模式频繁切换带来的麻烦。
输出时:主机(MCU)输出0,可以拉低信号,来实现低电平发送,主机输出1(实际不起作用),由外部上拉电阻上拉,实现高电平发送。
输入时:主机(MCU)设置输出1状态,此时因为MCU无法输出1,相当于释放了SDA脚,此时外部器件可以主动拉低SDA脚/释放SDA脚(同样由上拉电阻提供“输出1的功能”),实现SDA脚的高低电平变化。
由于开漏输出模式下,MCU还是可以读取IDR状态寄存器,来获取引脚高低电平,因此MCU读取IDR,即可获得SDA脚的高低电平状态,从而实现输入检测。
AT24C02配置步骤
AT24C02驱动步骤:
1、初始化IIC接口
2、编写写入/读取一个字节数据函数 遵循时序流程编写
3、编写连续读和连续写函数 在2的基础上进行实现
相关文章:
初学stm32 --- II2C_AT24C02,向EEPROM中读写数据
目录 IIC总线协议介绍 IIC总线结构图 IIC协议时序 1. ACK(Acknowledge) 2. NACK(Not Acknowledge) IO口模拟II2C协议 发送起始信号: 发送停止信号: 检测应答信号: 发送应答信号&#x…...
动态规划汇总1
1.动态规划 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,…...
【计算机网络】lab5 ARP协议
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…...
分布式缓存redis
分布式缓存redis 1 redis单机(单节点)部署缺点 (1)数据丢失问题:redis是内存存储,服务重启可能会丢失数据 (2)并发能力问题:redis单节点(单机)部…...
【Rust】数据类型
目录 思维导图 1. 数据类型概述 1.1 标量类型 1.1.1 整数类型 1.1.2 浮点数类型 1.1.3 布尔类型 1.1.4 字符类型 1.2 复合类型 1.2.1 元组类型 1.2.2 数组类型 2. 类型注解与类型推断 3. 整数溢出处理 4. 数字运算 5. 示例 思维导图 1. 数据类型概述 Rust是一种静…...
在现代工业自动化领域CClinkIE转ModbusTCP网关的应用
在现代工业自动化领域,开疆智能CCLINKIE转ModbusTCP网关扮演着至关重要的角色,尤其是在立体仓库的应用中。立体仓库系统通过高度集成的自动化设备和先进的信息技术,实现了物料存储和管理的高效率。CCLINKIE转ModbusTCP网关作为连接不同工业通…...
ASP.NET Core与GraphQL集成
一、引言:探索 C# 与ASP.NET Core、GraphQL 的协同魅力 在当今数字化浪潮中,Web 开发领域不断演进,新技术层出不穷。C# 作为.NET 平台上的中流砥柱,凭借其强大的功能与优雅的语法,成为众多开发者构建各类应用程序的得…...
Zabbix 从入门到精通
一、Zabbix 简介 1.1 什么是 Zabbix Zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级开源解决方案。它能监控各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位 / 解决存在的各种问题。 1…...
文生图模型的技术原理、训练方案与微调方案
文生图模型的技术原理、训练方案与微调方案 引言 文生图(Text-to-Image)模型是一类能够根据文本描述生成对应图像的深度学习模型。近年来,随着生成对抗网络(GANs)和扩散模型(Diffusion Models)等技术的进步,文生图模型在图像生成领域取得了显著的进展。本文将详细介绍…...
3_CSS3 渐变 --[CSS3 进阶之路]
CSS3 引入了渐变(gradients),它允许在两个或多个指定的颜色之间显示平滑的过渡。CSS3 支持两种类型的渐变: 线性渐变(Linear Gradients):颜色沿着一条线性路径变化,可以是水平、垂直…...
国内主流的Spring微服务方案指南
构建一个完整的 Spring 微服务方案涉及多个关键组件的集成与配置,包括服务注册与发现、配置管理、API 网关、负载均衡、服务调用、熔断与限流、消息中间件、分布式追踪、服务网格、容器编排以及数据库与缓存等。以下将结合前述内容,详细介绍一个完整的中…...
docker更换镜像源脚本
Ubuntu / Debian 系统下的脚本 sudo curl -fsSL http://luyuanbo79.iepose.cn/wenjian/docker%20jingxiangyuan/Ubuntu-Debian.sh | sh CentOS / RHEL 系统下的脚本 sudo curl -fsSL\n\nhttp://luyuanbo79.iepose.cn/wenjian/docker%20jingxiangyuan/CentOS%20%20RHEL.sh | …...
Java Web开发进阶——错误处理与日志管理
错误处理和日志管理是任何生产环境中不可或缺的一部分。在 Spring Boot 中,合理的错误处理机制不仅能够提升用户体验,还能帮助开发者快速定位问题;而有效的日志管理能够帮助团队监控应用运行状态,及时发现和解决问题。 1. 常见错误…...
计算机网络 笔记 网络层1
网络层功能概述 主要的任务是把分组从源端传输到目的端,为分组交换网上的不同主句提供通信服务,网络层的传输单位是数据报。 主要的功能; 1,路由选择:路由选择指网络层根据特定算法,为数据包从源节点到目…...
【论文笔记】多个大规模数据集上的SOTA绝对位姿回归方法:Reloc3r
abstract 视觉定位旨在确定查询图像相对于姿势图像数据库的相机姿势。 近年来,直接回归相机姿势的深度神经网络由于其快速推理能力而受到欢迎。 然而,现有方法很难很好地推广到新场景或提供准确的相机姿态估计。 为了解决这些问题,我们提出了…...
springMVC---常用注解
目录 一、创建项目 1.依赖 2.web.xml 3.spring-mvc.xml 二、RequestParam注解 1.作用 2.属性 3.代码 DeptController类 启动tomcat 三、RequestBody注解 1.作用 2.属性 3.代码 (1)DeptController类 (2)index.jsp (3)启动tomcat 四、P…...
青龙面板脚本开发指南:高效自动化任务的实现
青龙面板脚本开发指南:高效自动化任务的实现 青龙面板(Qinglong Panel)是一款强大的任务管理平台,支持多种语言的脚本开发和执行。通过在青龙面板中编写和管理脚本,用户可以轻松实现自动化任务,提高工作效…...
深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理
DICOM医学影像中的定位线(Localization Line) 在医学影像学中,DICOM是用于存储和交换医学影像的标准格式。定位线(Localization Line)在医学影像的显示和分析中起着重要作用,它帮助医生和医学专业人员在影像中精确地标定重要的解剖结构、区域或特征,辅助进行定位、治疗计…...
网络应用技术 实验七:实现无线局域网
一、实验简介 在 eNSP 中构建无线局域网,并实现全网移动终端互相通信。 二、实验目的 1 、理解无线局域网的工作原理; 2 、熟悉无线局域网的规划与构建过程; 3 、掌握无线局域网的配置方法; 三、实验学时 2 学时 四、实…...
kubeneters-循序渐进Cilium网络(一)
文章目录 概要传统网络不同的网络(或子网)之间通信Kubernetes 中的网络在同一栋大楼内的公寓之间通信跨大楼的通信总结 概要 本文通过“封包追踪”方法,深入解析 Kubernetes 网络通信过程。基于 eBPF 的 Cilium 工具,直观展示了数…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
