我正在尝试使用 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_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。
- 在嵌入 FRAM 的卡插入之前,I2C 电平转换器处于三态模式。FRAM_SDA 和 FRAM_SCL 信号被拉低。
- 插入“FRAM卡”后,为了保证电源稳定,增加了100ms的延迟(根据datasheet,第一次启动条件前至少需要11ms)。
- I2C 电平转换器被激活。
- 增加了 1ms 的延迟,以确保 I2C 电平转换器被激活并且线路被拉高(数据表要求约 4us)。FRAM_SDA 和 FRAM_SCL 信号被上拉。
- 访问 FRAM。
FRAM_SDA 和 FRAM_SCL 信号已在每一步之后进行测量。
问题仍然存在。
停止/启动条件而不是重复启动
@gbarry。
我试图在字节传输期间重复开始之前停止。我用示波器测量了字节传输:STOP 条件后跟 START 条件是 OK 的。
不幸的是,这个解决方案并不能解决问题。
想法
此问题仅在嵌入 FRAM 的卡连接后才会发生。在插入“FRAM 卡”并正确寻址后,我运行了数千次成功的读取访问(从属寻址和读取)。
对我来说,这听起来越来越像硬件问题。但我不知道它是否与 I2C 电平转换器或 I2C 总线上的其他从机有关。
您还有其他想法或建议吗?
已编辑 (2013-04-18)
问题似乎解决了
我更换了 FRAM 模块连接器,并找到了一种直接在 FRAM 上进行测量的方法。看来这个新连接器一切正常。
我会做更多的测试,以确保问题来自不良连接。