蓝桥杯嵌入式:EEPROM(AT89C02)(九)
蓝桥杯嵌入式EEPROM如何配置以及使用
·
蓝桥杯嵌入式: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();
}
}
}
演示结果:
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)