蓝桥杯嵌入式:EEPROM(AT89C02)(九)

本文带你速成蓝桥杯嵌入式的eeprom(AT89C02).
由于蓝桥杯嵌入式的eeprom给了IIC的驱动的,所以我只需要吧IIC的.c和.h文件移植到自己目录下面像我下面这样。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当已经移植好后我们就可以直接在cubemx里面进行配置,虽然我们用的是模拟IIC但这里必须先配置成普通的GPIO擦可以,要不然执行读操作的时候就一直读的是255:(很多同学会忘记这一步)
在这里插入图片描述
由图可知我们的IIC总线是PB6 PB7,所以先把他们配置成普通的GPIO口的模式:像我下面这张图一样的配置就行了
在这里插入图片描述
然后就是IIC的读写操作,我们先来看芯片手册:
在这里插入图片描述
从机的读写地址高四位已经定好了是1010,那么A2 A1 A0是什么意思了,我们来看下面图片的左边部分的三个引脚:E1 E2 E3都接地对应的也就是A2 A1 A0,所以A2 A1 A0都为0,最后一位R/W就是选择读还是写。读是1,写是0,所以读的地址是0xa1,写的地址是0xa0
在这里插入图片描述
然后我们可以根据时序图来写函数内部的执行操作:
在这里插入图片描述

void eeprom_write(uint8_t address_data,uint8_t content_data)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	
	I2CSendByte(address_data);
	I2CWaitAck();
	I2CSendByte(content_data);
	I2CWaitAck();
	I2CStop();
	
	HAL_Delay(5);
	
}

我们需要传入两个数据,一个是写的地址数据,一个是写的内容数据,看图一目了然,比赛之前我推荐大家背下来。
在这里插入图片描述

uint8_t eeprom_read(uint8_t address_data)
{
	uint8_t receive_data;
	
	//将要读的地址写进去
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(address_data);
	I2CWaitAck();
	
	//接收要读的地址
	I2CStart();
	I2CSendByte(0xa1);
	I2CWaitAck();
	receive_data = I2CReceiveByte();
	I2CSendNotAck();
	I2CStop();
	
	return receive_data;
	
}

根据时序图来写很简单,我已经测试了,完全没问题。

#include "stdio.h"
#include "i2c.h"
#include "lcd.h"
void lcd_disp(void)
{
	uint8_t lcd_buf[20];
	
	sprintf((char*)lcd_buf,"restart:%d",eeprom_read(0x00));
	LCD_DisplayStringLine(Line0,lcd_buf);
	
}

void main(void)
{
 	HAL_Init();
  	SystemClock_Config();//使用cubemx生成好的,并未写出来
  	MX_GPIO_Init();//使用cubemx生成好的,并未写出来
	LCD_Init();
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	LCD_Clear(Black);
	restart_cnt = eeprom_read(0x00);
	eeprom_write(0x00,++restart_cnt);
	
  while (1)
  {
		lcd_disp();
  }
}
}

演示结果:
在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐