参考资料:
蓝桥杯嵌入式备赛手册
总目录:目录
硬件连接
- 查看电路原理图,里面I2C内容
- 发现有SCL和SDA分别连接到PB6和PB7
- 进一步查看SCL和SDA
- 参考官方给出的芯片资料,其中的AT24C02即是EPROM的资料
- 里面关于字节读写部分(figure8和figure11):
利用官方资料快速编写
- 官方赛点资源数据包中,
底层驱动代码参考
里有i2c.c和i2c.h,直接复制来用 - 在i2c.c中添加E2PROM的读写驱动代码:
void E2PROM_Write(u8 add, u8 data)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}
u8 E2PROM_Read(u8 add)
{
u8 data;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
data = I2CReceiveByte();
I2CSendAck();
return data;
}
- 比赛时不仅仅会让读写一个Byte的数据,可能让读写int型或者float型数据
- 读写一个u32类型的数据如下:
void x24_write_int(u8 add, int data)
{
x24_write(add,(u8)(data&0xff));
delay_ms(2);
x24_write(add+1,(u8)(data>>8&0xff));
delay_ms(2);
x24_write(add+2,(u8)(data>>16&0xff));
delay_ms(2);
x24_write(add+3,(u8)(data>>24&0xff));
delay_ms(2);
}
int x24_read_int(u8 add)
{
int data;
data=(int)x24_read(add);
delay_ms(2);
data+=(int)x24_read(add+1)<<8;
delay_ms(2);
data+=(int)x24_read(add+2)<<16;
delay_ms(2);
data+=(int)x24_read(add+3)<<24;
delay_ms(2);
return data;
}
- 连续读最好延时2ms,连续写延时5ms(建议都延时5ms)
u8 data=0;
data=x24_read(0x01);
delay_ms(5);
data++;
main.c编写
#include "stm32f10x.h"
#include "lcd.h"
#include "i2c.h"
#include "stdio.h"
u32 TimingDelay = 0;
void Delay_Ms(u32 nTime);
//Main Body
int main(void)
{
u8 isLight, tmp[20];
SysTick_Config(SystemCoreClock/1000);
i2c_init();
Delay_Ms(200);
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
isLight = E2PROM_Read(0x00);
E2PROM_Write(0x00, ++isLight);
sprintf((char*)tmp, "Data:%d", E2PROM_Read(0x00));
LCD_DisplayStringLine(Line4 ,tmp);
while(1);
}
//
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}