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

10 篇文章 11 订阅
8 篇文章 0 订阅
一、基础原理剖析

先前的实验中我们都是通过程序设计语言去调用串口、定时器、引脚等硬件设备进行从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);//短暂延时
}

相关功能函数均位于该.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.IIC初始化

在这里插入图片描述

3.功能测试

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

五、拓展实验

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

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值