I2C 从地址未确认(有时)

电器工程 i2c stm32 非易失性存储器 奴隶
2022-01-08 07:06:22

我正在尝试使用 I2C 与远程连接的 FRAM(来自 Ramtron 的 FM24C04)进行通信。该内存嵌入在一块板上,可以随时插入系统或从系统中移除(在移除内存之前,通信已正确终止)。

问题是:插入包含 FRAM 的卡后,有时它不确认地址。

信号测量

我测量了信号以查看正在发生的事情,似乎两种情况下的时间都可以(工作和不工作)。

正确的 I2C 通信(读取 3 个字节): 在此处输入图像描述

I2C FRAM 地址未确认(从地址正确发送): 在此处输入图像描述

已采取措施解决此问题(未成功)

  • 在插入带有嵌入式 FRAM 的卡后添加延迟,以确保遵守电源顺序。
  • 检测到未确认从地址后的 I2C 停止生成

I2C 总线配置

  • 一个主控(ST 的 STM32F205 微控制器)
  • 三个从机(Microchip 的 EEPROM 24AA1025、Maxim IC 的 RTC DS1339C 和 Ramtron 的远程 FRAM FM24C04
  • 一个 I2C 电平转换器(Maxim IC 的 MAX3373E)用于实现主器件和 FRAM 之间的通信
  • 总线频率设置为 100 kHz

已编辑 (2013-04-17)

首先,感谢大家的意见。

由于有很多建议,这里是我所做的调查的描述。

原理图

下图为 I2C 总线的简化示意图:

I2C 总线原理图

I2C_SDA 和 I2C_SCL 信号直接连接到微控制器,FRAM_SDA 和 FRAM_SCL 信号连接到 FRAM。请注意,连接到 FRAM 的 SDA 和 SCL 信号使用 Murata 的 BLM18 铁氧体进行滤波。

FRAM 的连接方式如下:

  • NC(引脚 1)-> 未连接
  • A1(引脚 2)-> GND
  • A2(引脚 3)-> GND
  • VSS(引脚 4)-> GND
  • SDA(引脚 5)-> FRAM_SDA
  • SCL(引脚 6)-> FRAM_SCL
  • WP(引脚 7)-> GND(无写保护)
  • VDD(引脚 8)-> +5V

FRAM 卡说明

此卡是仅嵌入 FRAM 的“类似 ISA”的卡。

调查

减慢频率

我将 SCL 频率设置为 50kHz 和 10kHz 进行了测试。我用示波器测量了 SCL 信号,以确保它处于预期的频率。

这些修改并没有解决问题。我检查了时序,它们在 FRAM 数据表规范内。

确保电源顺序

@jippie。

  1. 在嵌入 FRAM 的卡插入之前,I2C 电平转换器处于三态模式。FRAM_SDA 和 FRAM_SCL 信号被拉低。
  2. 插入“FRAM卡”后,为了保证电源稳定,增加了100ms的延迟(根据datasheet,第一次启动条件前至少需要11ms)。
  3. I2C 电平转换器被激活。
  4. 增加了 1ms 的延迟,以确保 I2C 电平转换器被激活并且线路被拉高(数据表要求约 4us)。FRAM_SDA 和 FRAM_SCL 信号被上拉。
  5. 访问 FRAM。

FRAM_SDA 和 FRAM_SCL 信号已在每一步之后进行测量。

问题仍然存在。

停止/启动条件而不是重复启动

@gbarry。

我试图在字节传输期间重复开始之前停止。我用示波器测量了字节传输:STOP 条件后跟 START 条件是 OK 的。

不幸的是,这个解决方案并不能解决问题。

想法

此问题仅在嵌入 FRAM 的卡连接后才会发生。在插入“FRAM 卡”并正确寻址后,我运行了数千次成功的读取访问(从属寻址和读取)。

对我来说,这听起来越来越像硬件问题。但我不知道它是否与 I2C 电平转换器或 I2C 总线上的其他从机有关。

您还有其他想法或建议吗?


已编辑 (2013-04-18)

问题似乎解决了

我更换了 FRAM 模块连接器,并找到了一种直接在 FRAM 上进行测量的方法。看来这个新连接器一切正常。

我会做更多的测试,以确保问题来自不良连接。

4个回答

尽管您说您的通讯在插入或移除之前已正确终止,但可能值得尝试此解决方案,因为在某些情况下,I2C 总线可能会在仅重置总线上的一个设备后出现问题。

在初始化主 I2C 硬件之前,将 SDA 设置为输入并测试 SDA 是否为低电平。

如果它为低电平,则将 SCL 引脚设置为高电平。

然后将 SCL 引脚切换为低电平和高电平,直到 SDA 变为高电平(即输出外围设备可能仍在尝试发送的任何剩余位)。这不能超过 8 个时钟周期 - 如果是这样,那么还有其他问题。

我不能保证这会解决你的问题,但它确实解决了我的问题!

对于 FRAM:

  • 首先连接GND和Vcc;
  • 然后确保 A1、A2 和 WP 的电平正确;
  • 然后才连接数据引脚。

在芯片上电之前连接电源以外的其他引脚可能会导致问题。

10k 对于你的引体向上似乎有点大,而且你的前缘看起来很慢。将电阻减小到 3k 左右,看看是否有帮助。

另外,为什么关断电压会随时间漂移?

有没有可能有其他事情试图与该委员会交谈?我曾经遇到过这样的问题;我可以在 60% 的时间内得到确认,但我不记得曾经能够看到碰撞。我怀疑我提供的 i2c 以某种方式与真正的内部总线隔离。我可以连续运行它,它只会丢弃 30% 的消息。当我们开始直接与设备(电源)交谈而没有介入的“背板”时,问题就消失了。

在您的 NAK 错误之后,我没有看到停止序列。我猜你有一个断点在那个时候停止程序?

最后,如果你认为你是公交车上唯一的人,你不妨尝试用停止/开始来代替重复的开始。我见过不太了解如何处理 RS 的设备(尤其是定制 FPGA)。

[回应评论]:关于 FRAM 板,你没有说很多,比如它只是内存还是整个子系统。但是,如果您可以将“范围”放在给您带来麻烦的 i2c 设备的引线上,并且您仍然可以看到图片,那么我会排除干扰。I2C 非常简单,如果您在输入端看到正确的信号,那么芯片应该可以正常播放,除非它有内部问题。

特别是,您希望获得该电平转换器的 FRAM 端。信号中断的可能性比通常被认为是碰撞的事情发生的可能性更大。

我要指出的是,NAK 周期与根本不存在的芯片无法区分。EEPROM 会这样做以表明它们正忙。我查看了 FRAM 上的写入时间,它比单个 i2c 数据位快……所以这不是问题。