你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F4xxx 的 I2C 总线挂起异常处理

[复制链接]
STMCU小助手 发布时间:2022-2-14 23:35
前言
客户使用 I2C 对 EEPROM 进行读取操作时,正常读取的最后一个字节,主机会传送一个 NACK 给 EEPROM,以便结束该次读取过程,如果主器件给出 ACK,而程序又默认结束读取过程,会出现 EEPROM 认为主机还需要读取数据,但此后 SCL 的时钟不会给出,将导致 I2C 总线被挂起占用,此时 START,STOP 命令将不会再次成功送出信号;本文针对这个异常状况结合实际应用问题给出处理方法。

问题背景
在实际应用中,如果使用中断方式或者 DMA 方式给出 I2C 的处理机制,在读取最后一个字节需要给出 NACK 的时候,如果此时延迟或者错误给出了 ACK,I2C 总线将被 EEPROM 挂起;该问题已经在客户端出现,但出现随机,很难判定何时出现,但确实是一个应用隐患,因为此时无法通过寄存器发送 START,STOP 命令;


判断依据
为判定是主机(STM32F4xx)给出的 ACK,还是从机(EEPROM)拉低 ACK,需要加入辅助电路,如下:

2}WR@X2VZML)~7@8Y`SC4}8.png

使用示波器探头察看 A 点电平,如果是 EEPROM 拉低电平的,则测试点电平为 0V,如果是 STM32F4xx 端给出的 ACK,拉低电平的,在 A 点测试将是大于 0 电平的一个波形存在;

波形分析
正常读取波形

}FY6_VULKAVLF817{5}B_FD.png

异常读取波形



在异常读取波形后,程序给出的起始终止条件将不会被执行;
  1. I2C_GenerateSTOP() ;
  2. I2C_GenerateSTART() ;
复制代码


处理方法
当出现上述异常时,写 I2C 外设寄存器方法将不起作用,I/O 端口产生不了需要退出的波形,只能通过 I/O 口强拉效果退出,可以有两种方法进行处理:
方法一:当出现异常总线占用时,直接复位 I2C 外设,以及重新初始化 I2C 端口,I/O 口配置为上拉模式的,产生虚拟的STOP 波形;此时因为 MCU 端口的强拉作用,将产生一个类似于 STOP 的 I2C 退出效果;
方法二:I/O 口配置为上拉模式的,SDA 设置为高电平,产生虚拟的 SCL 波形,产生 9 个 SCL 波形,虚拟最后一个字节的读取,以便从机退出异常状态。

Y}YL4M%@V7M)XC$21_T1Y2H.png
收藏 评论0 发布时间:2022-2-14 23:35

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版