I2C通信——EEPROM的读写

软件实现

默认有底层代码

用的是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);
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值