蓝桥杯—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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/437047.html

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

相关文章

AI智能时代的图书馆未来,你想象过吗!

AI智能时代的图书馆未来,你想象过吗! 前言AI智能时代的图书馆未来 前言 教育数字化和 AI 时代的浪潮正汹涌而来,图书馆也站在了变革的十字路口。我们看到高等教育正在发生深刻的变革,从教学模式到人才培养理念,都在经…

Linux 再入门整理:详解 /etc/fstab 文件

目录 1. 什么是 /etc/fstab2. /etc/fstab 文件的格式2.1 设备文件 (Device)2.2 挂载点 (Mount Point)2.3 文件系统类型 (File System Type)2.4 挂载选项 (Mount Options)2.5 Backup Operation(dump 参数)2.6 Pass Order (fsck 参数)2.6.1 参数设置2.6.2 …

智慧防灾,科技先行:EasyCVR平台助力地质灾害视频监测系统建设

随着科技的飞速发展,视频监控技术已成为地质灾害监测与预警的重要手段之一。在众多视频监控平台中,EasyCVR视频汇聚平台凭借其强大的视频整合、实时传输、视频处理及分发等能力,在地质灾害场景中展现出显著的应用优势。 一、实时监测与远程监…

【RabbitMQ——具体使用场景】

1. 异步 1.1 同步异步的问题(串行) 串行方式:将订单信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端 public void makeOrder(){// 1 :保存订单 orderService.…

SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS

一、本地上传 概念&#xff1a;将前端上传的文件保存到自己的电脑 作用&#xff1a;前端上传的文件到后端&#xff0c;后端存储的是一个临时文件&#xff0c;方法执行完毕会消失&#xff0c;把临时文件存储到本地硬盘中。 1、导入文件上传的依赖 <dependency><grou…

[uni-app]小兔鲜-04推荐+分类+详情

热门推荐 新建热门推荐组件, 动态设置组件的标题 <template><!-- 推荐专区 --><view class"panel hot"><view class"item" v-for"item in list" :key"item.id">... ...<navigator hover-class"none&…

C# HttpClient请求URL重定向后丢失Authorization认证头

搜查官方文档后发现&#xff1a; HttpWebRequest.AllowAutoRedirect Property (System.Net) | Microsoft Learn 微软提供的http类库HttpClient &#xff08;HttpWebRequest\WebClient已不推荐使用&#xff0c;用HttpClient代替&#xff09;有备注提醒&#xff1a;当使用自动重…

Android Button “No speakable text present” 问题解决

记录一个问题&#xff0c;今天让同学们做了个小车控制界面&#xff0c;使用Button控件&#xff0c;删除设置的text属性&#xff0c;会出现“No speakable text present”的错误&#xff0c;如图所示。这是由于Android的无障碍设置需要朗读Button的文本&#xff0c;如果没有设置…

基于elasticsearch存储船舶历史轨迹: 使用scroll滚动技术实现大数据量搜索

文章目录 引言I 轨迹索引的设计轨迹文档定时创建索引手动添加索引并为索引添加别名POST请求批量插入文档数据II 查询文档数据基于scroll滚动技术实现大数据量搜索查询轨迹查询参数返回dtoIII 知识扩展空指针处理术语介绍基于 search_after 实现深度分页引言 需求: 存储轨迹,…

免费 Oracle 各版本 离线帮助使用和介绍

文章目录 Oracle 各版本 离线帮助使用和介绍概要在线帮助下载离线文档包&#xff1a;解压离线文档&#xff1a;访问离线文档&#xff1a;导航使用&#xff1a;目录介绍Install and Upgrade&#xff08;安装和升级&#xff09;&#xff1a;Administration&#xff08;管理&#…

大数据毕业设计选题推荐-民族服饰数据分析系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

sentinel原理源码分析系列(一)-总述

背景 微服务是目前java主流开发架构&#xff0c;微服务架构技术栈有&#xff0c;服务注册中心&#xff0c;网关&#xff0c;熔断限流&#xff0c;服务同学&#xff0c;配置中心等组件&#xff0c;其中&#xff0c;熔断限流主要3个功能特性&#xff0c;限流&#xff0c;熔断&…

[MAUI]数据绑定和MVVM:MVVM的属性验证

一、MVVM的属性验证案例 Toolkit.Mvvm框架中的ObservableValidator类,提供了属性验证功能,可以使用我们熟悉的验证特性对属性的值进行验证,并将错误属性提取和反馈给UI层。以下案例实现对UI层的姓名和年龄两个输入框,进行表单提交验证。实现效果如下所示 View<ContentP…

【Python】Django Grappelli:打造优雅且现代化的 Django 管理后台

在 Django 开发中&#xff0c;默认的 Django Admin 界面尽管功能强大且能满足大多数管理需求&#xff0c;但其界面设计相对基础&#xff0c;尤其在用户体验和视觉呈现上显得较为简约。在一些项目中&#xff0c;开发者可能需要更加现代化且美观的后台界面。这时&#xff0c;Djan…

【Redis】Redis中的 AOF(Append Only File)持久化机制

目录 1、AOF日志 2、AOF 的执行顺序与潜在风险 3、如何优化 AOF&#xff1f;&#xff08;写入策略&#xff09; 4、AOF重写机制&#xff08;防止日志文件无限增长&#xff09; 1、AOF日志 想象一下&#xff0c;Redis 每次执行写操作的时候&#xff0c;都把这些操作以追加的…

人工智能 | 手工测试用例转Web自动化测试生成

简介 在传统编写 Web 自动化测试用例的过程中&#xff0c;基本都是需要测试工程师&#xff0c;根据功能测试用例转换为自动化测试的用例。市面上自动生成 Web 或 App 自动化测试用例的产品无非也都是通过录制的方式&#xff0c;获取操作人的行为操作&#xff0c;从而记录测试用…

大语言模型入门(一)——大语言模型智能助手

一、大语言模型智能助手 2022年末ChatGPT一经推出&#xff0c;一时间不注册个账号用一下都跟不上潮流了。然而&#xff0c;我们要注册OpenAI的账号使用ChatGPT还是一件比较麻烦的事情&#xff08;懂的都懂&#xff09;。好在&#xff0c;国内各大团队非常给力地及时推出了自研的…

php 平滑重启 kill -SIGUSR2 <PID> pgrep命令查看进程号

有时候我们使用nginx 大家都知道平滑重启命令: /web/nginx/sbin/nginx -s reload 但大家对php-fpm 重启 可能就是简单暴力的kill 直接搞起了 下面介绍一个sh 文件名保存为start_php.sh 来对php-fpm 进行平滑重启 #!/bin/bash# 检查 PHP-FPM 是否运行 if ! pgrep php-…

yolov11模型在bdd100k数据集上的应用【代码+数据集+python环境+训练/应用GUI系统】

yolov8/9/10/11模型在bdd100k数据集上的应用【代码数据集python环境训练/应用GUI系统】 yolov8/9/10/11模型在bdd100k数据集上的应用【代码数据集python环境训练/应用GUI系统】 yolov8/9/10/11模型在bdd100k数据集上的应用【代码数据集python环境训练/应用GUI系统】 bdd100k数据…

<<迷雾>> 第5章 从逻辑学到逻辑电路(5)--异或门 示例电路

!ABA!B 的逻辑电路组成 info::操作说明 鼠标单击开关切换开合状态 注: 这个实际就是 异或门, 当两个输入相异时输出高电平, 否则输出低电平 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyj…