STM32F4xxx I2C 总线挂起异常处理
前言
客户使用 I2C EEPROM 进行读取操作时,正常读取的最后一个字节,主机会传送一个 NACK EEPROM,以便结束该次
读取过程,如果主器件给出 ACK,而程序又默认结束读取过程,会出现 EEPROM 认为主机还需要读取数据,但此后 SCL
时钟不会给出,将导致 I2C 总线被挂起占用,此时 STARTSTOP 命令将不会再次成功送出信号;本文针对这个异常状况结
合实际应用问题给出处理方法。
问题背景
在实际应用中,如果使用中断方式或者 DMA 方式给出 I2C 的处理机制,在读取最后一个字节需要给出 NACK 的时候,如果
此时延迟或者错误给出了 ACKI2C 总线将被 EEPROM 挂起;该问题已经在客户端出现,但出现随机,很难判定何时出现,
但确实是一个应用隐患,因为此时无法通过寄存器发送 STARTSTOP 命令;
判断依据
为判定是主机(STM32F4xx)给出的 ACK,还是从机(EEPROM)拉低 ACK,需要加入辅助电路,如下:
使用示波器探头察看 A 点电平,如果是 EEPROM 拉低电平的,则测试点电平为 0V,如果是 STM32F4xx 端给出的 ACK,拉
低电平的,在 A 点测试将是大于 0 电平的一个波形存在;
+3V3
10K
R1
1K
R2
STM32F4xx
EEPROM
A
I2C_SDA
波形分析
正常读取波形
异常读取波形
在异常读取波形后,程序给出的起始终止条件将不会被执行
I2C_GenerateSTOP() ;
I2C_GenerateSTART() ;