请选择 进入手机版 | 继续访问电脑版
搜索
查看: 263|回复: 4

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

[复制链接]

403

主题

1655

帖子

2

精华

Rank: 9Rank: 9Rank: 9

管理员

注册时间
2016-6-1
发表于 2017-1-4 17:08:19 | 显示全部楼层 |阅读模式
前言
客户使用I2C对EEPROM进行读取操作时,正常读取的最后一个字节,主机会传送一个NACK给EEPROM,以便结束该次读取过程,如果主器件给出ACK,而程序又默认结束读取过程,会出现EEPROM认为主机还需要读取数据,但此后SCL的时钟不会给出,将导致I2C总线被挂起占用,此时START,STOP命令将不会再次成功送出信号;本文针对这个异常状况结合实际应用问题给出处理方法。

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

判断依据
为判定是主机(STM32F4xx)给出的ACK,还是从机(EEPROM)拉低ACK,需要加入辅助电路,如下:
51.jpg
使用示波器探头察看A点电平,如果是EEPROM拉低电平的,则测试点电平为0V,如果是STM32F4xx端给出的ACK,拉低电平的,在A点测试将是大于0电平的一个波形存在;
波形分析
正常读取波形
52.jpg
异常读取波形
53.jpg
在异常读取波形后,程序给出的起始终止条件将不会被执行;
54.jpg


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


文档下载

更多实战经验
欢迎加入STM32/STM8社区技术交流群: 330177207    STM32L系列开发群:571793578
回复

使用道具 举报

2

主题

487

帖子

0

精华

Rank: 6Rank: 6

金牌会员

注册时间
2016-1-23
发表于 2017-1-4 18:06:03 | 显示全部楼层
谢谢分享                     
回复 支持 反对

使用道具 举报

6

主题

452

帖子

0

精华

Rank: 6Rank: 6

金牌会员

注册时间
2016-4-23
发表于 2017-1-4 22:31:51 | 显示全部楼层
图上没有找到A点,楼主换个图吧
欢迎加入STM32/STM8社区技术交流群: 330177207    STM32L系列开发群:571793578
回复 支持 反对

使用道具 举报

21

主题

605

帖子

0

精华

Rank: 6Rank: 6

金牌会员

注册时间
2014-12-17
发表于 2017-1-5 09:56:22 | 显示全部楼层
讲解比较清楚,,,
回复 支持 反对

使用道具 举报

0

主题

22

帖子

0

精华

Rank: 2

初级会员

注册时间
2016-9-6
发表于 2017-2-6 10:26:47 | 显示全部楼层
可以先更改IO口模式为普通IO,然后更改IO口电平,再将IO口模式改为IIC
欢迎加入STM32/STM8社区技术交流群: 330177207    STM32L系列开发群:571793578
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|意法半导体STM32/STM8技术社区    

GMT+8, 2017-2-27 23:54 , Processed in 0.157324 second(s), 10 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表