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,需要加入辅助电路,如下:
使用示波器探头察看 A 点电平,如果是 EEPROM 拉低电平的,则测试点电平为 0V,如果是 STM32F4xx 端给出的 ACK,拉低电平的,在 A 点测试将是大于 0 电平的一个波形存在; 波形分析 正常读取波形
异常读取波形 在异常读取波形后,程序给出的起始终止条件将不会被执行;
处理方法 当出现上述异常时,写 I2C 外设寄存器方法将不起作用,I/O 端口产生不了需要退出的波形,只能通过 I/O 口强拉效果退出,可以有两种方法进行处理: 方法一:当出现异常总线占用时,直接复位 I2C 外设,以及重新初始化 I2C 端口,I/O 口配置为上拉模式的,产生虚拟的STOP 波形;此时因为 MCU 端口的强拉作用,将产生一个类似于 STOP 的 I2C 退出效果; 方法二:I/O 口配置为上拉模式的,SDA 设置为高电平,产生虚拟的 SCL 波形,产生 9 个 SCL 波形,虚拟最后一个字节的读取,以便从机退出异常状态。 |
【福利三:雨露均沾·逢7狂欢】之四:用一个定时器同步另外两个定时器输出PWM
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
【逢7发帖赢大礼】全网最简单的Arduino_STM32开发环境搭建教程!
STM32F4中文用户手册
STM32F400、STM32F402 Cortex-M4超值单片机
SPI 高温读错最后一位?STM32F42xx 官方根治方案
微信公众号
手机版