蓝桥杯嵌入式(G431)备赛笔记——I2C

本文介绍了在STM32平台上进行I2C通信,包括EEPROM的写入和读取操作,以及如何将频率数据存储在EEPROM中,并展示了实际应用中的按键控制和LCD数据显示,同时涉及MCP4017可编程电阻的I2C写入方法。
摘要由CSDN通过智能技术生成

目录

板子资源&&I2C移植:

EEPROM:

EEPROM写入 :

EEPROM读取: 

MCP4017(可编程电阻):


板子资源&&I2C移植:

官方提供的i2c_hal文件中包含了配置引脚的函数,这里不需要配置CubeMx,注意官方文件没有使用stm32的IIC资源,通过gpio高低电平的时间模拟时序的信号,需要手写部分驱动代码,移动库函数并添加至工程

EEPROM:

EEPROM介绍:https://blog.csdn.net/weixin_4203129https://blog.csdn.net/weixin_42031299/article/details/1211723439/article/details/121172343

EEPROM写入 :

void EEP_write(u8 add, u8 dat)
{
    // 启动I2C通信,准备进行数据写入操作
    I2CStart();
    // 向EEPROM发送写入地址0xA0,表示开始写入操作
    I2CSendByte(0xa0);
    // 等待从设备的应答信号,确保通信正常
    I2CWaitAck();
    // 向EEPROM发送要写入的地址
    I2CSendByte(add);
    // 等待从设备的应答信号
    I2CWaitAck();
    // 向EEPROM发送要写入的数据
    I2CSendByte(dat);
    // 等待从设备的应答信号
    I2CWaitAck();
    // 停止I2C通信
    I2CStop();
    // 延时5毫秒,确保数据写入完成
    HAL_Delay(5);
}

EEPROM读取: 

uint8_t EEP_read(u8 add)
{
    // 声明一个变量dat,用于存储读取到的数据
    u8 dat = 0;

    // 启动I2C通信,准备进行数据读取操作
    I2CStart();
    // 向EEPROM发送写入地址0xA0,表示开始写入操作
    I2CSendByte(0xa0);
    // 等待从设备的应答信号,确保通信正常
    I2CWaitAck();
    // 向EEPROM发送要读取的地址
    I2CSendByte(add);
    // 等待从设备的应答信号
    I2CWaitAck();
    
    // 发送重复启动信号,准备切换到读取模式
    I2CStart();
    // 向EEPROM发送读取地址0xA1,表示开始读取操作
    I2CSendByte(0xa1);
    // 等待从设备的应答信号
    I2CWaitAck();
    // 从EEPROM中读取一个字节的数据
    dat = I2CReceiveByte();
    // 发送非应答信号,表示数据接收完毕
    I2CSendNotAck();
    // 停止I2C通信
    I2CStop();
    
    // 返回读取到的数据
    return dat;
}

实际应用:

		if(single_key_flag[3]==1) // 按键1单次按下
    {
            unsigned char frq1_h=frq1>>8;// 获取频率1的高8位
			unsigned char frq1_l=frq1&0xff;// 获取频率1的低8位
			EEP_write(1, frq1_h);// 将频率1的高8位写入EEPROM地址1
			HAL_Delay(10);
			EEP_write(2, frq1_l);// 将频率1的低8位写入EEPROM地址2
            single_key_flag[3]=0; // 用完标记清零
    }

//DISP
u32 lcd_tick=0;

void Disp_proc ()
{
	if(uwTick-lcd_tick<100)
		return;
	lcd_tick=uwTick;
	
	if(ui==1)
	{
		u8 text[50];
		sprintf(text, "      DATE        ");
		LCD_DisplayStringLine(Line0, (unsigned char *)text);
		sprintf(text, "    V:%.2fV       ", r37_volt);
		LCD_DisplayStringLine(Line2, (unsigned char *)text);
		
		uint16_t eep_temp=(EEP_read(1)<<8)+EEP_read(2);// 从EEPROM读取数据并合并成一个16位整数,赋给eep_temp变量
		sprintf(text, "    FRQ_EEP:%d    ", eep_temp);
		LCD_DisplayStringLine(Line4, (unsigned char *)text);

		sprintf(text, "    FRQ1:%d       ", frq1);
		LCD_DisplayStringLine(Line6, (unsigned char *)text);
		sprintf(text, "    FRQ2:%d       ", frq2);
		LCD_DisplayStringLine(Line8, (unsigned char *)text);
	}
	
	if(ui==2)
	{
		u8 text[50];
		sprintf(text, "      Para        ");
		LCD_DisplayStringLine(Line0, (unsigned char *)text);
		sprintf(text, "    PA6:%d%%      ", pa6_duty);
		LCD_DisplayStringLine(Line2, (unsigned char *)text);
		sprintf(text, "    PA7:%d%%      ", pa7_duty);
		LCD_DisplayStringLine(Line4, (unsigned char *)text);
	}

}

MCP4017(可编程电阻):

 

void MCP_write(u8 dat)
{
    // 启动I2C通信,准备进行数据写入操作
    I2CStart();
    // 向MCP芯片发送写入地址0x5E,表示开始写入操作
    I2CSendByte(0x5e);
    // 等待从设备的应答信号,确保通信正常
    I2CWaitAck();
    // 向MCP芯片发送要写入的数据
    I2CSendByte(dat);
    // 等待从设备的应答信号
    I2CWaitAck();
    // 停止I2C通信
    I2CStop();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄奕子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值