软件实现
默认有底层代码
用的是M24C02 地址怎么找 看芯片手册
E1 E2 E3 (等效 A0 A1 A2)是 地址
而 R 为1 W为0
得出:写地址为 1 0 1 0 0 0 0 0 (0xA0) 读地址为 (0xA1)
读写代码
// 读
uint8_t eeprom_read(uint8_t addr)
{
uint8_t dat;
I2CStart();
I2CSendByte(0xA0); //向AT24C02发送地址位 为什么是0xA0 (写地址)
I2CWaitAck(); //等待应答位 显示发送完成
I2CSendByte(addr); //向AT24C02发送信息:选择读的地址
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0xA1); //向AT24C02发送地址位:表示要读这个芯片 为什么是0xA1(读地址)
I2CWaitAck();
dat = I2CReceiveByte(); //读取
I2CWaitAck();
I2CStop();
return dat;
}
//写
void eeprom_write(uint8_t addr,uint8_t dat)
{
I2CStart();
I2CSendByte(0xA0); //向AT24C02发送地址位 为什么是0xA0 (写地址)
I2CWaitAck(); //等待应答位 显示发送完成
I2CSendByte(addr); //向AT24C02发送信息:选择读的地址
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
}
main中
void Key_proc(void)
{
if(key[0].Single_Flag == 1)
{
view = !view ;
key[0].Single_Flag = 0;
}
if(key[1].Single_Flag == 1)
{
PA6_Duty+=10;
if(PA6_Duty>=100)PA6_Duty=10;
__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,PA6_Duty);
key[1].Single_Flag = 0;
}
if(key[2].Single_Flag == 1)
{
PA7_Duty+=10;
if(PA7_Duty>=100)PA7_Duty=10;
__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,PA7_Duty);
key[2].Single_Flag = 0;
}
if(key[3].Single_Flag == 1)
{
uchar Frq_h = Frq1>>8;
uchar Frq_l = Frq1&0xFF;
eeprom_write(1, Frq_h);
HAL_Delay(10);
eeprom_write(2, Frq_l);
key[3].Single_Flag = 0;
}
}
void Disp_proc(void)
{
if(view == 0)
{
char text[30];
sprintf(text," Data ");
LCD_DisplayStringLine(Line0, (uint8_t *)text);
sprintf(text," FRQ1=%dHz ",Frq1);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text," FRQ2=%dHz ",Frq2);
LCD_DisplayStringLine(Line5, (uint8_t *)text);
sprintf(text," V=%.2f ",GetADC(&hadc1));
LCD_DisplayStringLine(Line6, (uint8_t *)text);
sprintf(text," V=%.2f ",GetADC(&hadc2));
LCD_DisplayStringLine(Line7, (uint8_t *)text);
uint eep_temp = (eeprom_read(1)<<8) + eeprom_read(2);
sprintf(text," FRQ_eep=%d ",eep_temp);
LCD_DisplayStringLine(Line8, (uint8_t *)text);
}
if(view == 1)
{
char text[30];
sprintf(text," Para ");
LCD_DisplayStringLine(Line0, (uint8_t *)text);
sprintf(text," PA6:%d%% ",PA6_Duty);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text," PA7:%d%% ",PA7_Duty);
LCD_DisplayStringLine(Line5, (uint8_t *)text);
}
}