首页 > 其他分享 >STM32 IIC读取Eeprom失败问题

STM32 IIC读取Eeprom失败问题

时间:2024-05-28 21:22:23浏览次数:23  
标签:HAL PIN Initure STM32 IIC InitStruct GPIO I2C Eeprom

现象描述

异常断开产品的电源,会出现产品无法读取eeprom数据,并且iic返回繁忙警告。

原因

iic再读取eeprom时,出现电源抖动的情况。而该电源能维持芯片不进入关机状态,但是会影响iic通讯问题。

解决办法

在出现iic忙碌时,将iic复位即可。

void i2c_reset(void)
{
	/* 复位I2C */
	/*Reset I2C*/
	hi2c2.Instance->CR1 |= I2C_CR1_SWRST;
	hi2c2.Instance->CR1 &= ~I2C_CR1_SWRST;
		
	/* 配置成普通IO */
	GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_GPIOB_CLK_ENABLE();    // 根据名字,这是使能B端口
    
    GPIO_Initure.Pin=GPIO_PIN_10 | GPIO_PIN_11; // 0口
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; // 推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;         // 上拉 
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;    // 高速
    HAL_GPIO_Init(GPIOB, &GPIO_Initure);    // 调用初始化函数
	
	/* 开漏输出,关闭I2C输入通道,并尝试将总线拉高 */
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10 | GPIO_PIN_11, GPIO_PIN_SET);

	/* SCL PB10 拉高 */
	for (uint8_t i = 0; i < 10; i++) {
		if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_10) == GPIO_PIN_SET)
		{
			break;
		}
		/* 该延时循环的周期和时长,请根据你的实际主机对I2C通讯出错的处理来修改 */
		vTaskDelay(10);
	}

	/* 归还总线控制权 */
	GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

	/* 重新初始化I2C */
	MX_I2C2_Init();
}

 

标签:HAL,PIN,Initure,STM32,IIC,InitStruct,GPIO,I2C,Eeprom
From: https://www.cnblogs.com/wfagly/p/18218933

相关文章

  • 基于STM32的智能个人健康助手
    设计摘要:基于单片机的智能个人健康助手是一种集成了传感器、数据处理和智能算法的智能设备,旨在帮助用户监测和改善个人健康状况。该助手可以通过采集用户的体温、心率和血氧等,进行数据分析和健康评估,并提供个性化的健康建议和提醒。该系统的核心部件是单片机,它可以连接各种传......
  • STM32CubeMX导入新版本的固件包
    检查用的芯片的固件版本2.在STM32Cube\Repository目录下检查有没有对应的库文件,我这里是更新之后在ST官网下载对应版本的固件包,注意下载的固件包不能放在STM32Cube\Repository目录下在CubeMx到导入下载好的固件包导入之后等待解压之后,就导入完成。不可简单的把固......
  • STM32F103 IAP 在线升级OTA
    一:前言MCU设备上的OTA升级可理解为IAP(InApplicationProgramming)技术,MCU通过外设接口(如UART、IIC、SPI、CAN、USB等接口),连接具备联网能力的模块、器件、设备(以下统称上位机)。上位机从服务器上拉取固件包,再将固件包以约定的通讯协议,经由通讯接口发送至MC......
  • 关于STM32单片机的一些事情-1.1
    1.1.1回顾:上一篇博客我们一起了解了一下:stm32工程文件的建立,以及使用hal库函数去操作单片机。本篇我们将继续探讨STM32的一些事情。1.1.2GPIO简介GPIO(GeneralPurposeInputOutput)通用输入输出口可配置为8种输入输出模式引脚电平:0V~3.3V,部分引脚可容忍5V输出模式下......
  • 推推宝藏会议-RAIIC 2024
    【IEEE出版|往届3个月完成检索】第三届机器人、人工智能与智能控制国际会议(RAIIC2024)The3rd InternationalConferenceonRobotics,ArtificialIntelligenceandIntelligentControl 重要信息会议时间:2024年7月5-7日会议地点:中国·绵阳二轮截稿时间:2024年6月......
  • STM32_HAL_串口IAP
    1.IAP简介        IAP(InApplicationProgramming)即在应用编程。STM32可以通过设置MSP的方式从不同的地址启动:包括Flash地址、RAM地址等,在默认方式下,我们的嵌入式程序是以连续二进制的方式烧录到STM32的可寻址Flash区域上的。如果我们用的Flash容量大......
  • STM32_HAL_FLASH 模拟 EEPROM
    1.STM32FLASH简介STM32F407ZGT6的FLASH容量为1024K字节,STM32F40xx/41xx的闪存模块组织如图STM32F4的闪存模块由主存储器、系统存储器、OPT区域和选项字节等4部分组成。        主存储器,该部分用来存放代码和数据常数(如const类型的数据)。分为12个......
  • STM32F4平台使用SerialPort串口库教程
    这一期教程的内容主要是在STM32F4平台使用SerialPort串口库和上位机通信,上位机(例如串口调试助手)向下位机发送字符串,下位机接收到字符串后,经过加工处理再发送给上位机。SerialPort串口库使用C++编写,用户只需在外部实现4个中断回调函数即可完成串口DMA收发,然后使用read函数读......
  • 嵌入式实时操作系统笔记3:FreeRTOS移植(STM32F407)_编写简单的FreeRTOS任务例程
    上文讲到UC/OSIII系统的移植,那篇文章是失败了的,网络上的资料真是层次不清,多有遗漏步骤,导致单片机连操作系统的初始化都卡在那,这次换个赛道,学FreeRTOS吧......今日任务如标题所示:FreeRTOS移植(STM32F407)_编写简单的FreeRTOS任务例程文章提供测试代码讲解、完整工程下载、测......
  • STM32 F1系列 全中文HAL&LL库使用手册 中英双语对照 GPT机翻 共1208页、约40万字
    STM32F1系列全中文HAL_LL库使用手册,中英文双语对照阅读。内容、格式对照官方原文,含标签导航及目录跳转。全文GPT机翻,除人工翻译外,相对更加贴合原文原意,双语版防止翻译错误方便对照。全文:1208页,约40万字。*******下有更多展示图片********由于本汉化不改变官方文档的内容......