• 基于STM32G431嵌入式学习笔记——九、IIC总线(一)EEPROM


    一、基础原理剖析

    先前的实验中我们都是通过程序设计语言去调用串口、定时器、引脚等硬件设备进行从0到有的功能实现,所有的指令以及数据均来自程序设计语言,而没有想计算机一样将一些必要数据存入存储器中。
    IIC总线是我们嵌入式板子上进行数据传输的主要通道,因此如果我们了解其中内部原理,便可以实现数据存储功能以及实时时间获取的功能。
    在这里插入图片描述
    我们今天首先介绍EEPROM的使用方法。
    (具体原理以及内核操作会在寒假进行系统化剖析)

    二、环境创建

    在比赛资源包中官方已经给我们提供了IIC总线例程,我们可以直接去选择调用:
    在这里插入图片描述
    选择现有的工作环境进行复制(配置好LED、KEY、LCD的任意环境均可),重命名为EEPROM

    将例程文件复制到相应文件夹中
    在这里插入图片描述打开keil,加入对应的.c文件,随后编译
    在这里插入图片描述

    在这里插入图片描述

    三、函数书写

    以下函数均写入i2c_hal.c文件中

    1.向EEPROM中写入数据
    //EEPROM的写操作
    void EEPROM_Write(unsigned char *pucBuf, unsigned char ucAddr, unsigned char ucNum)
    {
    	I2CStart();
    	I2CSendByte(0xa0);//写标志
    	I2CWaitAck();
    	
    	I2CSendByte(ucAddr);//送到的目标地址	
    	I2CWaitAck();
    	
    	while(ucNum--)
    	{ 
    		I2CSendByte(*pucBuf++);//不断发送buffer中的数据进入存储器
    		I2CWaitAck();	
    	}
    	I2CStop();
    	delay1(500);//短暂延时
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    相关功能函数均位于该.c文件中
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    书写完毕后在头文件中添加函数声明:
    在这里插入图片描述

    2.从EEPROM里读出数据
    //EEPROM的读操作
    void EEPROM_Read(unsigned char *pucBuf, unsigned char ucAddr, unsigned char ucNum)
    {
    	I2CStart();
    	I2CSendByte(0xa0);//先要写数据
    	I2CWaitAck();
    	
    	I2CSendByte(ucAddr);//指令送到的目标地址	
    	I2CWaitAck();
    	
    	I2CStart();
    	I2CSendByte(0xa1);//读数据的指令
    	I2CWaitAck();
    	
    	while(ucNum--)
    	{
    		*pucBuf++ = I2CReceiveByte();//不断从存储器中读数据进入buffer
    		if(ucNum)
    			I2CSendAck();	
    		else
    			I2CSendNotAck();
    	}
    	I2CStop();	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    四、程序书写
    1.添加头文件

    在这里插入图片描述

    2.IIC初始化

    在这里插入图片描述

    3.功能测试

    定义两个测试buffer,我们想要实现的功能是“将buf1的数据存储进设备,并从设备读信息读入buf2”
    在这里插入图片描述while循环中调用功能函数
    在这里插入图片描述编译,下载检验。

    五、拓展实验

    将上述while循环中的写数据操作注释掉,再一次编译下载:
    在这里插入图片描述这时可以发现结果和原实验一致,说明该数据真的被存储到设备中了,我们断电重启后便可以在存储器中读取数据,这给我们的实验扩展了许多额外功能。

  • 相关阅读:
    mysql索引
    算法设计_综合练习_编程题
    解决cocoapods下载hermes太慢的问题
    畅玩JVM——关于GC垃圾回收必须要掌握的知识
    论文阅读:SOLOv2: Dynamic, Faster and Stronger
    C/C++面试常见问题——static关键字的主要用法
    File类(在JSP中的使用)详解
    深入JS 中三类循环原理和性能
    Entertainment in MAC(Round 932)
    用74HC573进行LED数码管驱动的编程
  • 原文地址:https://blog.csdn.net/qq_53826699/article/details/128113988