蓝桥嵌入式之 E2PROM_Again

工程可见Github<传送门>


一、主要代码

main.c

/*******************************************************************************
* 文件名:main.c
* 描  述:
* 作  者:CLAY
* 版本号:v1.0.0
* 日  期: 2019年2月17日
* 备  注:修改后的LCD例程
*         E2PR0M在0x01这个地址写入数据0xAA,而后再读出至LCD
*******************************************************************************
*/

#include "stm32f10x.h"
#include "lcd.h"
#include "e2prom.h"
#include "stdio.h"
#include "i2c.h"

u32 TimingDelay = 0;

void Delay_Ms(u32 nTime);

//Main Body
int main(void)
{
	u8 str[20];
	u8 dat;

	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	SysTick_Config(SystemCoreClock/1000);
	
	i2c_init();//FUCK,别忘了这个初始化
	E2Write(0x01, 0xAA);//在0x01这个地址写下,0xAA这个数据
	Delay_Ms(5);
	dat = E2Read(0x01);
	
	LCD_ClearLine(Line5);
	sprintf((char *)str, "data = %d", dat);
	LCD_DisplayStringLine(Line5, str);
	
	while(1);
}

//
void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

e2prom.c

#include "stm32f10x.h"
#include "i2c.h"

void E2Write(u8 addr, u8 dat)
{
	I2CStart();
	I2CSendByte(0xA0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}

u8 E2Read(u8 addr)
{
	u8 tmp;
	
	I2CStart();
	I2CSendByte(0xA0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0xA1);
	I2CWaitAck();
	tmp = I2CReceiveByte();
	I2CWaitAck();
	I2CStop();
	
	return tmp;
}


e2prom.h

#ifndef _E2PROM_H
#define _E2PROM_H

void E2Write(u8 addr, u8 dat);
u8 E2Read(u8 addr);

#endif

二、需要注意的地方

1、别忘了在主函数里面进行I2C的初始化。
i2c_init();//FUCK,别忘了这个初始化
2、器件地址确定

蓝桥嵌入式之 E2PROM_Again_第1张图片

A2/A1/A0是硬件地址确定的,从原理图可以看出已经接地,所以写对应0xA0,读的时候对应0xA1。
蓝桥嵌入式之 E2PROM_Again_第2张图片

3、24C02可寻址范围确定

24C02是2Kbits,一共256字节,所以可寻址范围是0x00~0xFF

你可能感兴趣的:(蓝桥杯之嵌入式,蓝桥之嵌入式开发)