搜索
查看: 7157|回复: 5

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

[复制链接]
  • TA的每日心情
    开心
    2018-2-6 09:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    1182

    主题

    4967

    帖子

    1

    蝴蝶豆

    论坛元老

    最后登录
    2020-3-17
    发表于 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波形,虚拟最后一个字节的读取,以便从机退出异常状态。


    文档下载

    更多实战经验
    回复

    使用道具 举报

    该用户从未签到

    10

    主题

    703

    帖子

    0

    蝴蝶豆

    金牌会员

    最后登录
    2018-6-15
    发表于 2017-1-4 18:06:03 | 显示全部楼层
    谢谢分享                     
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19

    主题

    1734

    帖子

    7

    蝴蝶豆

    论坛元老

    最后登录
    2021-5-10
    发表于 2017-1-4 22:31:51 | 显示全部楼层
    图上没有找到A点,楼主换个图吧
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    23

    主题

    611

    帖子

    0

    蝴蝶豆

    高级会员

    最后登录
    2018-4-11
    发表于 2017-1-5 09:56:22 | 显示全部楼层
    讲解比较清楚,,,
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    22

    帖子

    0

    蝴蝶豆

    中级会员

    最后登录
    2018-2-1
    发表于 2017-2-6 10:26:47 | 显示全部楼层
    可以先更改IO口模式为普通IO,然后更改IO口电平,再将IO口模式改为IIC
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    14

    帖子

    0

    蝴蝶豆

    初级会员

    最后登录
    2020-6-11
    发表于 2019-3-8 17:19:05 | 显示全部楼层
    最后一步解决方法没有看懂,既然从机拉低了SDA,主机又能怎样拉高电平?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-13 21:24 , Processed in 0.193583 second(s), 43 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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