STM32硬件IIC驱动EEPROM芯片死锁分析及解决办法

背景介绍

通过镍锌电池和铅酸电池分别给系统板供电,主控单片机使用STM32F4芯片,外部EEPROM使用AT24C08芯片,通过STM32F4芯片驱动硬件IIC读写AT24C08芯片。当铅酸电池被拔掉之后,镍锌电池会直接给系统供电。由于镍锌电池容量比较低,镍锌电池只能维持2小时的系统供电,电压低于3.3V时STM32芯片复位,但是此时系统板还有存电(这是由于电路设计的缺陷导致)。


IIC总线基础

IIC总线传输包络起始信号、数据传输、应答位、结束信号组成如下图所示,
起始信号是主设备在SCL保持高电平的同时SDA产生一个下降沿;
结束信号是主设备在SCL保持高电平的同时SDA产生一个上升沿;
数据传输是主设备在SCL产生上升沿并驱动SDA数据线高/低电平;
应答位是是主设备在SCL产生上升沿并拉高SDA数据线,从设备驱动SDA回复一个低电平;

IIC总线是一个主从结构的协议,主设备需要主动发起起始信号、数据传输、结束信号,从设备不可以主动发起通信。

现象

在镍锌电池供电的状态下,系统会一直操作外部设备(包括EEPROM、NORFLASH等),当电压低于3.3V时会STM32芯片复位,系统板上的外设(包括EEPROM)还一直供着电。因为EEPROM还未断电,所以EEPROM会一直保持STM32芯片复位前的状态。下次接上铅酸电池,STM32检测到铅酸电池会重启STM32芯片,此时偶尔会出现EEPROM异常,无法通过IIC总线控制eeprom,系统板不断电EEPROM就会一直处于失控状态。只要系统板完全断电EEPROM就会恢复正常。

问题分析

1.当镍锌电池电量低于3.3V,STM32芯片异常复位。如果此时STM32芯片正在读写EEPROM芯片,有可能会造成EEPROM无法控制(锁死的状态)。

2.如下图所示STM32芯片完成起始信号和数据传输之后拉低SCL时钟线(即下图复位处),此时STM32芯片复位,SCL时钟线被拉高(即下图复位后),EEPROM将SDA数据线拉低,EEPROM会一直等待主设备将SCL时钟线拉低。由于此时EEPROM一直拉低SDA数据线,STM32芯片检测到SDA拉低,认为IIC总线一直被占用就会一直等待SDA数据线和SCL时钟线被拉高。从而造成STM32芯片认为IIC总线被占用,而EEPROM因为STM32芯片未将SCL时钟线拉低一直驱动SDA数据线(低电平)。这样就会造成IIC总线处于一种死锁的状态。
3.根据以上阐述STM32芯片在操作EEPROM时(发送起始信号和传输数据之后)被异常复位之后,只要EEPROM不断电,STM32芯片就无法读写EEPROM芯片。

解决对策

1.根据以上的分析,STM32芯片复位后无法操作EEPROM芯片是因为STM32芯片异常复位造成IIC总线处于一种死锁的状态。解决办法如下

(1)当STM32芯片检测到IIC总线被一直占用的情况下(或是系统初始化时),需要主动拉低SCL时钟线(代码如下),让EEPROM释放SDA数据线(EEPROM不驱动SDA数据线),从而达到释放IIC总线的目的。

	//拉低SCK,释放EEPROM的SDA数据线
	GPIO_InitStruct.Pin  = GPIO_PIN_8;		
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);

(2)在软件框架中,检测到电池不足以给MCU供电时不可以操作IIC总线,或者直接让MCU进入低功耗,等待下次唤醒源唤醒。

(3)在系统电路设计上,给EEPROM芯片增加一个电源控制的功能,允许MCU软件复位EEPROM芯片。

(4)最后这里想说明一下,如果没有特殊需求,建议使用GPIO模拟IIC总线。

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32硬件IIC驱动EEPROM是指使用STM32芯片硬件IIC接口来驱动EEPROM存储器。通过IIC总线协议,STM32芯片可以与EEPROM进行通信,实现数据的读写操作。 在使用STM32硬件IIC驱动EEPROM时,需要先配置IIC接口的相关参数,如时钟频率、地址等。然后通过读写寄存器的方式来进行数据传输。具体实现过程可以参考STM32的相关文档和示例代码。 需要注意的是,不同型号的EEPROM存储器可能有不同的通信协议和寄存器结构,因此在进行驱动开发时需要根据具体的EEPROM型号进行适配。 ### 回答2: STM32是一款由STMicroelectronics公司开发的高性能微控制器,广泛应用于各种嵌入式系统中。其中,硬件IIC接口被广泛应用于与各种外设进行通信,如EEPROM、传感器、LCD等。 在STM32中使用硬件IIC驱动EEPROM,需要进行以下步骤: 1.配置GPIO引脚:使能IIC外设时钟,并配置SDA、SCL引脚为复用功能。 2.配置IIC外设:设置IIC的时钟速度、器件地址、读写控制等参数。 3.编写读写函数:根据EEPROM数据格式和IIC协议,编写相应的读写函数,从而实现与EEPROM的通信。 在具体实现中,需要注意以下几点: 1.硬件IIC接口的时钟速度需要根据EEPROM的特性进行设置,一般不能超过其最大时钟速度。 2.在进行数据传输时,需要根据IIC协议进行数据的发送和接收,一般是先发送一个器件地址,然后发送数据或接收数据。 3.在进行写操作时,需要进行操作延时,以避免IIC总线竞争和其他问题。 4.为提高系统可靠性,数据读写操作应当进行校验或错误处理,以确保数据的正确性。 总之,利用STM32硬件IIC接口驱动EEPROM并不难,但需要熟悉IIC协议和EEPROM数据格式,并遵循正确的读写操作流程和处理方法,才能实现高效、稳定地通信。 ### 回答3: STM32是一种基于ARM Cortex-M内核的微处理器,它具有许多硬件模块,其中包括I2C总线接口。I2C总线接口通常用于实现硬件设备之间的通信,如读写存储在外部EEPROM中的数据。 在STM32硬件中,实现I2C总线接口通常涉及到两个主要模块:I2C外设和DMA控制器。 I2C外设负责实现I2C总线的协议规范,而DMA控制器则能够高效地管理I2C数据的传输。 为了实现硬件I2C驱动EEPROM,我们需要进行以下几个步骤: 1. 配置I2C外设:我们需要在STM32芯片上配置I2C外设的寄存器,来设置时钟频率、地址等参数,以实现I2C总线的通信。 2. 配置DMA:DMA控制器可以帮助我们通过内存到内存、内存到外设或外设到内存的方式高效地传输数据,我们需要配置DMA控制器来管理EEPROM读写数据的传输。 3. 实现I2C读写:我们可以使用I2C读写函数来发送和接收I2C数据。通过I2C读写函数,我们可以读取EEPROM内存地址中的数据或写入一个字节到EEPROM内存地址中。在这个过程中,DMA控制器将自动管理I2C数据传输。 4. 校验EEPROM读写:为了确保我们的EEPROM读写操作正确,我们需要进行校验。一种常见的校验方式是比较EEPROM内存地址中的数据是否正确。如果读写操作成功,则可以通过LED或串口返回一个“操作成功”的消息。 总之,实现STM32硬件I2C驱动EEPROM需要进行一系列的设置和调整,其中包括I2C外设的参数设置、DMA控制器的配置以及I2C读写的实现。通过以上步骤,我们能够高效地从EEPROM读取或存储数据,从而实现STM32与其他设备之间的通信和数据交换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值