当前位置: 首页 > news >正文

蓝桥杯—STM32G431RBT6(IIC通信--EEPROM(AT24C02)存储器进行通信)

一、什么是IIC?24C02存储器有什么用?

IIC (IIC 是半双工通信总线。半双工意味着数据在某一时刻只能沿一个方向传输,即发送数据的时候不能接收数据,接收数据的时候不能发送数据)即集成电路总线(Inter-Integrated Circuit),是一种多主机的串行通信总线.它由飞利浦公司在 20 世纪 80 年代开发,主要用于连接微控制器及其外围设备。IIC 总线具有简单、高效、支持多设备连接等特点,在电子电路设计中被广泛应用。

“一主多从” 是一种通信架构模式。在这种模式中,有一个主要的设备(称为主设备),它具有控制和发起通信的能力;同时有多个从属设备(称为从设备),它们被动地响应主设备的指令,与主设备进行数据交互。

IIC 总线的工作原理如下:

  1. 总线结构与信号3:
    • 数据线(SDA):用于传输实际的数据信息,是双向的 I/O 线。在数据传输过程中,主设备和从设备之间的数据交换通过 SDA 线进行。例如,主设备向从设备发送数据时,将数据按位依次放置在 SDA 线上;从设备向主设备发送数据时,也通过 SDA 线传输数据。
    • 时钟线(SCL):用于同步通信的时钟信号,由主设备产生。SCL 线的时钟信号决定了数据传输的速率和时序,主设备通过控制 SCL 线的电平变化来协调数据的发送和接收。例如,在每个时钟脉冲的上升沿或下降沿,数据位在 SDA 线上进行传输或接收。
    • 上拉电阻:SDA 和 SCL 线都是开漏输出,需要通过上拉电阻接电源 VCC。当总线空闲时,两根线都被上拉电阻拉高,保持着高电平状态。上拉电阻的阻值会影响总线的信号传输质量和速度,一般需要根据具体的总线负载和传输速率要求来选择合适的阻值3。
  2. 通信过程中的信号状态
    • 起始信号:当 SCL 线为高电平期间,SDA 线由高电平向低电平的跳变,表示产生一个起始条件,标志着一次数据传输的开始3。
    • 终止信号:当 SCL 线为高电平期间,SDA 线由低电平向高电平的跳变,表示产生一个停止条件,标志着一次数据传输的结束3。
    • 应答信号:每传输一个字节的数据后,接收方需要发送一个应答位。如果接收方成功接收到数据,则会在第 9 个时钟脉冲时将 SDA 线拉低,表示应答;如果接收方没有正确接收数据或者无法接收更多数据,则会将 SDA 线保持高电平,这会引起主设备的相应处理,例如重新发送数据或者终止传输。
  3. 数据传输格式与方向
    • 数据格式:数据传输以字节(8 位)为单位,先传输最高位(MSB),最后传输最低位(LSB)。每次传输可以发送的字节数量不受限制,但每个字节后必须跟一个响应位。
    • 传输方向:主设备在传输有效数据之前要先指定从设备的地址,地址一般为 7 位,然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向,“0” 表示主设备向从设备写数据,“1” 表示主设备向从设备读数据。
  4. 主从设备通信模式2:
    • 主设备控制:主设备负责启动总线、发送起始信号、发送从设备地址和读写位、发送或接收数据以及发送停止信号等操作,控制整个通信过程。在多主设备的系统中,如果多个主设备同时尝试访问总线,IIC 使用仲裁机制来决定哪个设备能够继续进行通信,其他设备则等待。
    • 从设备响应:从设备被动地接受主设备的控制,根据主设备发送的地址和读写位来判断是否需要响应主设备。从设备在接收到主设备的请求后,会按照主设备的要求进行数据的发送或接收,并在合适的时候发送应答信号。
  5. 时钟同步:所有连接到总线上的主设备在 SCL 线上产生它们自己的时钟来传输 IIC 总线上的报文。由于数据只在时钟的高电平周期有效,因此需要一个确定的时钟进行逐位仲裁和数据传输。时钟同步通过线与连接 IIC 接口到 SCL 线来执行,SCL 线的低电平周期由低电平时钟周期最长的器件决定,而高电平周期由高电平时钟周期最短的器件决定。

EEPROM(AT24C02)存储器(掉电后数据不丢失)

        如上图E1E2E3都接地,所以读为10100001,写为10100000。

1.主机发送起始信号,启动总线。

2.发送从机地址(7bit)和传送方向(1bit)。

3.从机应答(1bit)。

4发送数据(1B=8bit)。

5.接受,应答(1bit)。

6.循环第4,5步,主机发送停止位释放总线。

二、使用步骤(在LED显示上电次数)

虽然给的函数中开启了PB6,PB7,但是最好在CUBE中开启一下

在main中添加头文件并初始化

/* USER CODE BEGIN Includes */
#include "headfile.h"
#include "i2c_hal.h"
/* USER CODE END Includes *//* USER CODE BEGIN 2 */I2CInit();/* USER CODE END 2 */

在i2c_hal.c添加读写函数

MEM_Read 函数

  1. I2CStart():启动 I2C 通信。
  2. I2CSendByte(0xa0):发送设备地址(写操作)。
  3. I2CWaitAck():等待应答信号。
  4. I2CSendByte(ucAddr):发送要读取数据的地址。
  5. I2CWaitAck():再次等待应答信号。
  6. I2CStart():重新启动 I2C 通信。
  7. I2CSendByte(0xa1):发送设备地址(读操作)。
  8. I2CWaitAck():等待应答信号。
  9. 通过循环,使用 I2CReceiveByte() 接收数据到 *pucBuf++,并根据剩余数据数量决定发送应答或非应答信号。
  10. I2CStop():停止 I2C 通信。

MEM_Write 函数

  1. I2CStart():启动 I2C 通信。
  2. I2CSendByte(0xa0):发送设备地址(写操作)。
  3. I2CWaitAck():等待应答信号。
  4. I2CSendByte(ucAddr):发送要写入数据的地址。
  5. 通过循环,使用 I2CSendByte(*pucBuf++) 发送数据,并等待应答信号。
  6. I2CStop():停止 I2C 通信。
  7. delay1(500):延迟一段时间,写数据不能太快,目的为了确保写入操作完成。
void MEM_Read(uint8_t*pucBuf,uint8_t ucAddr,uint8_t ucNum)//文件读
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(ucAddr);I2CWaitAck();I2CStart();I2CSendByte(0xa1);I2CWaitAck();while(ucNum--){*pucBuf++=I2CReceiveByte();if(ucNum)I2CSendAck();elseI2CSendNotAck();		}
I2CStop();
}
void MEM_Write(uint8_t*pucBuf,uint8_t ucAddr,uint8_t ucNum)//文件写
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(ucAddr);I2CWaitAck();while(ucNum--){I2CSendByte(*pucBuf++);I2CWaitAck();}
I2CStop();delay1(500);
}

在i2c_hal.h声明函数

void MEM_Read(uint8_t*pucBuf,uint8_t ucAddr,uint8_t ucNum);
void MEM_Write(uint8_t*pucBuf,uint8_t ucAddr,uint8_t ucNum);

 在main.c中写通信函数

  1. uint8_t sdcount:定义了一个 8 位无符号整数变量 sdcount

  2. MEM_Read(&sdcount,0,1):使用 MEM_Read 函数从地址 0 读取 1 个字节的数据,并将其存储到 sdcount 变量中。

  3. sdcount++:将 sdcount 的值增加 1。

  4. MEM_Write(&sdcount,0,1):使用 MEM_Write 函数将更新后的值(即增加 1 后的 sdcount)写入到地址 0,写入 1 个字节。

存储器地址 0 和地址 1 主要有以下区别:

  1. 存储位置:它们代表了存储器中不同的位置。
  2. 存储内容:通常存储在这两个地址的数据可能不同。
  3. 功能用途:可能被用于存储不同类型的信息或执行不同的操作
  uint8_t sdcount;MEM_Read(&sdcount,0,1);//通信sdcount++;MEM_Write(&sdcount,0,1);

在LCD中显示

 sprintf(buf,"    sdcount:%d     ",sdcount);LCD_DisplayStringLine(Line7,(uint8_t*)buf);

三、开源代码

通过网盘分享的文件:20-TEST10-IIC通信--24C02存储器.zip
链接: https://pan.baidu.com/s/1RQ7GbIz72_fHUYoKlLPVgA?pwd=0820 提取码: 0820

相关文章:

蓝桥杯—STM32G431RBT6(IIC通信--EEPROM(AT24C02)存储器进行通信)

一、什么是IIC?24C02存储器有什么用? IIC (IIC 是半双工通信总线。半双工意味着数据在某一时刻只能沿一个方向传输,即发送数据的时候不能接收数据,接收数据的时候不能发送数据)即集成电路总线(…...

【重学 MySQL】六十二、非空约束的使用

【重学 MySQL】六十二、非空约束的使用 定义目的关键字特点作用创建非空约束删除非空约束注意事项 在MySQL中,非空约束(NOT NULL Constraint)是一种用于确保表中某列不允许为空值的数据库约束。 定义 非空约束(NOT NULL Constra…...

Python获取json返回的字符串获取方法大全

1、使用 json.loads() 解析JSON字符串 import jsonjson_string {"name": "Alice", "age": 25, "city": "Beijing"} data json.loads(json_string)# 获取字符串值 name data[name] print("Name:", name) # 输…...

FreeBSD14.1 rm命令的疑惑

在/tmp目录发现有很多目录和文件,准备把它们都删除,结果发现都删不掉 这些文件目录如图: /tmp % ls -la total 9143 drwxrwxrwt 421 root wheel 486 10月 8 11:58 . drwxr-xr-x 23 root wheel 32 10月 8 10:06 .. drwx----…...

LSTM模型变种

LSTM模型变种 一、GRU 1.什么是GRU GRU(Gated Recurrent Unit)是一种循环神经网络(RNN)的变体,它被设计用来解决传统RNN在处理长序列时可能遇到的梯度消失或梯度爆炸问题。GRU通过引入门控机制来控制信息的流动&…...

基于comsol模拟微穿孔板和卷曲通道的混合吸声器低频吸声

研究背景&#xff1a; 具有深亚波长厚度&#xff08;5cm&#xff09;的吸收器对低频声音&#xff08;<500Hz&#xff09;的衰减在噪声控制工程中引起了极大的兴趣。然而&#xff0c;由于低频声音的强穿透性和普通材料的弱固有分散性&#xff0c;这是一项具有挑战性的任务。…...

Ajax ( 是什么、URL、axios、HTTP、快速收集表单 )Day01

AJAX 一、Ajax是什么1.1名词解释1.1.1 服务器1.1.2 同步与异步1. 同步&#xff08;Synchronous&#xff09;2. 异步&#xff08;Asynchronous&#xff09;3. 异步 vs 同步 场景4. 异步在 Web 开发中的常见应用&#xff1a; 1.2 URL 统一资源定位符1.2.1 URL - 查询参数1.2.2 ax…...

【Java 循环控制实例详解【While do... while】】

Java 循环控制详解【While & do… while】 在 Java 中&#xff0c;循环控制是程序设计中非常重要的部分&#xff0c;主要包括 while 循环和 do...while 循环。本文将详细介绍这两种循环的基本语法、执行流程及相关示例。 1. while 循环控制 基本语法 循环变量初始化; wh…...

10.2 Linux_进程_进程相关函数

创建子进程 函数声明如下&#xff1a; pid_t fork(void); 返回值&#xff1a;失败返回-1&#xff0c;成功返回两次&#xff0c;子进程获得0(系统分配)&#xff0c;父进程获得子进程的pid 注意&#xff1a;fork创建子进程&#xff0c;实际上就是将父进程复制一遍作为子进程&…...

栈与队列面试题(Java数据结构)

前言&#xff1a; 这里举两个典型的例子&#xff0c;实际上该类型的面试题是不确定的&#xff01; 用栈实现队列&#xff1a; 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;双栈 思路 将一个栈当作输入栈&#xff0c;用于压入 push 传入的数…...

手撕数据结构 —— 顺序表(C语言讲解)

目录 1.顺序表简介 什么是顺序表 顺序表的分类 2.顺序表的实现 SeqList.h中接口总览 具体实现 顺序表的定义 顺序表的初始化 顺序表的销毁 打印顺序表 ​编辑 检查顺序表的容量 尾插 尾删 ​编辑 头插 头删 查找 在pos位置插入元素 删除pos位置的值 ​…...

女友学习前端第二天-笔记

2024/10/8笔记 表格 table 表格 tr 行 td 单元格内容 th 表头 第一行相当于h1 alignleft /center /right 对齐方式 应在table边上 比如<table alignleft> border 代表边框 也应在table边上 比如<table alignleft border"1"> cellpadding 单元外框与…...

电脑手机下载小米xiaomi redmi刷机包太慢 解决办法

文章目录 修改前下载速度修改后下载速度修改方法&#xff08;修改host&#xff09; 修改前下载速度 一开始笔者以为是迅雷没开会员的问题&#xff0c;在淘宝上买了一个临时会员后下载速度依然最高才100KB/s 修改后下载速度 修改方法&#xff08;修改host&#xff09; host文…...

Python中的策略模式:解锁编程的新维度

引言 策略模式是一种行为型设计模式&#xff0c;允许算法独立于使用它的客户端而变化。这使得我们可以根据不同的情况选择不同的算法或策略来解决问题&#xff0c;从而增强系统的灵活性。在日常开发中&#xff0c;策略模式常用于处理多种算法或行为之间的切换&#xff0c;比如…...

ara::core::Future::then()的概念和使用方法

1. 概念 在ara::core::Future的上下文中&#xff0c;then()是一种用于处理异步操作结果的机制。一个Future代表一个尚未完成的异步计算&#xff0c;它最终会产生一个结果或者一个错误。then()方法允许你在Future完成时注册一个回调函数&#xff08;或者说后续操作&#xff09;…...

九、5 USART串口数据包

数据包作用&#xff1a;把一个个单独的数据给打包起来&#xff0c;将同一批的数据进行打包和分割&#xff0c;方便接收方进行识别&#xff0c;方便我们进行多字节的数据通信。 1、串口收发HEX数据包 &#xff08;1&#xff09;数据包的格式是个人规定的&#xff0c;如以FF为包…...

SQL第12课——联结表

三点&#xff1a;什么是联结&#xff1f;为什么使用联结&#xff1f;如何编写使用联结的select语句 12.1 联结 SQL最强大的功能之一就是能在数据查询的执行中联结&#xff08;join)表。联结是利用SQL的select能执行的最重要的操作。 在使用联结前&#xff0c;需要了解关系表…...

CentOS7 虚拟机操作系统安装及相关配置教程

1、安装虚拟机 在VMware《主页》界面中点击《创建新的虚拟机》按钮&#xff1a; 选择你准备好的ISO文件&#xff0c;点击下一步&#xff1a; 然后填写虚拟机的名称以及虚拟机将来保存的位置&#xff1a; 再次下一步&#xff0c;填写虚拟机磁盘大小&#xff1a; 继续下一步&…...

『网络游戏』窗口基类【06】

创建脚本&#xff1a;WindowRoot.cs 编写脚本&#xff1a; 修改脚本&#xff1a;LoginWnd.cs 修改脚本&#xff1a;LoadingWnd.cs 修改脚本&#xff1a;ResSvc.cs 修改脚本&#xff1a;LoginSys.cs 运行项目 - 功能不变 本章结束...

04_23 种设计模式之《单例模式》

文章目录 一、单例模式基础知识单例模式有 3 个特点&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。这种模式通常用于管理共享资源&#xff0c;如…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...