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

如上图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 函数:
I2CStart():启动 I2C 通信。I2CSendByte(0xa0):发送设备地址(写操作)。I2CWaitAck():等待应答信号。I2CSendByte(ucAddr):发送要读取数据的地址。I2CWaitAck():再次等待应答信号。I2CStart():重新启动 I2C 通信。I2CSendByte(0xa1):发送设备地址(读操作)。I2CWaitAck():等待应答信号。- 通过循环,使用
I2CReceiveByte()接收数据到*pucBuf++,并根据剩余数据数量决定发送应答或非应答信号。I2CStop():停止 I2C 通信。MEM_Write 函数:
I2CStart():启动 I2C 通信。I2CSendByte(0xa0):发送设备地址(写操作)。I2CWaitAck():等待应答信号。I2CSendByte(ucAddr):发送要写入数据的地址。- 通过循环,使用
I2CSendByte(*pucBuf++)发送数据,并等待应答信号。I2CStop():停止 I2C 通信。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中写通信函数
uint8_t sdcount:定义了一个 8 位无符号整数变量sdcount。
MEM_Read(&sdcount,0,1):使用MEM_Read函数从地址 0 读取 1 个字节的数据,并将其存储到sdcount变量中。
sdcount++:将sdcount的值增加 1。
MEM_Write(&sdcount,0,1):使用MEM_Write函数将更新后的值(即增加 1 后的sdcount)写入到地址 0,写入 1 个字节。
存储器地址 0 和地址 1 主要有以下区别:
- 存储位置:它们代表了存储器中不同的位置。
- 存储内容:通常存储在这两个地址的数据可能不同。
- 功能用途:可能被用于存储不同类型的信息或执行不同的操作
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模拟微穿孔板和卷曲通道的混合吸声器低频吸声
研究背景: 具有深亚波长厚度(5cm)的吸收器对低频声音(<500Hz)的衰减在噪声控制工程中引起了极大的兴趣。然而,由于低频声音的强穿透性和普通材料的弱固有分散性,这是一项具有挑战性的任务。…...
Ajax ( 是什么、URL、axios、HTTP、快速收集表单 )Day01
AJAX 一、Ajax是什么1.1名词解释1.1.1 服务器1.1.2 同步与异步1. 同步(Synchronous)2. 异步(Asynchronous)3. 异步 vs 同步 场景4. 异步在 Web 开发中的常见应用: 1.2 URL 统一资源定位符1.2.1 URL - 查询参数1.2.2 ax…...
【Java 循环控制实例详解【While do... while】】
Java 循环控制详解【While & do… while】 在 Java 中,循环控制是程序设计中非常重要的部分,主要包括 while 循环和 do...while 循环。本文将详细介绍这两种循环的基本语法、执行流程及相关示例。 1. while 循环控制 基本语法 循环变量初始化; wh…...
10.2 Linux_进程_进程相关函数
创建子进程 函数声明如下: pid_t fork(void); 返回值:失败返回-1,成功返回两次,子进程获得0(系统分配),父进程获得子进程的pid 注意:fork创建子进程,实际上就是将父进程复制一遍作为子进程&…...
栈与队列面试题(Java数据结构)
前言: 这里举两个典型的例子,实际上该类型的面试题是不确定的! 用栈实现队列: 232. 用栈实现队列 - 力扣(LeetCode) 方法一:双栈 思路 将一个栈当作输入栈,用于压入 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刷机包太慢 解决办法
文章目录 修改前下载速度修改后下载速度修改方法(修改host) 修改前下载速度 一开始笔者以为是迅雷没开会员的问题,在淘宝上买了一个临时会员后下载速度依然最高才100KB/s 修改后下载速度 修改方法(修改host) host文…...
Python中的策略模式:解锁编程的新维度
引言 策略模式是一种行为型设计模式,允许算法独立于使用它的客户端而变化。这使得我们可以根据不同的情况选择不同的算法或策略来解决问题,从而增强系统的灵活性。在日常开发中,策略模式常用于处理多种算法或行为之间的切换,比如…...
ara::core::Future::then()的概念和使用方法
1. 概念 在ara::core::Future的上下文中,then()是一种用于处理异步操作结果的机制。一个Future代表一个尚未完成的异步计算,它最终会产生一个结果或者一个错误。then()方法允许你在Future完成时注册一个回调函数(或者说后续操作)…...
九、5 USART串口数据包
数据包作用:把一个个单独的数据给打包起来,将同一批的数据进行打包和分割,方便接收方进行识别,方便我们进行多字节的数据通信。 1、串口收发HEX数据包 (1)数据包的格式是个人规定的,如以FF为包…...
SQL第12课——联结表
三点:什么是联结?为什么使用联结?如何编写使用联结的select语句 12.1 联结 SQL最强大的功能之一就是能在数据查询的执行中联结(join)表。联结是利用SQL的select能执行的最重要的操作。 在使用联结前,需要了解关系表…...
CentOS7 虚拟机操作系统安装及相关配置教程
1、安装虚拟机 在VMware《主页》界面中点击《创建新的虚拟机》按钮: 选择你准备好的ISO文件,点击下一步: 然后填写虚拟机的名称以及虚拟机将来保存的位置: 再次下一步,填写虚拟机磁盘大小: 继续下一步&…...
『网络游戏』窗口基类【06】
创建脚本:WindowRoot.cs 编写脚本: 修改脚本:LoginWnd.cs 修改脚本:LoadingWnd.cs 修改脚本:ResSvc.cs 修改脚本:LoginSys.cs 运行项目 - 功能不变 本章结束...
04_23 种设计模式之《单例模式》
文章目录 一、单例模式基础知识单例模式有 3 个特点: 单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式通常用于管理共享资源,如…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
EEG-fNIRS联合成像在跨频率耦合研究中的创新应用
摘要 神经影像技术对医学科学产生了深远的影响,推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下,基于神经血管耦合现象的多模态神经影像方法,通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里,本研…...
【threejs】每天一个小案例讲解:创建基本的3D场景
代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone,无需安装依赖,直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景(Scene) 使用 THREE.Scene(…...

