Estoy tratando de comunicarme con un FRAM conectado de forma remota (FM24C04 de Ramtron) usando I2C. Esta memoria está incrustada en una placa que se puede insertar y quitar en cualquier momento hacia / desde el sistema (la comunicación finaliza correctamente antes de que se quite la memoria).
El problema es: justo después de insertar la tarjeta que contiene el FRAM, a veces , no reconoce la dirección.
Mediciones de señales
Medí las señales para ver qué está sucediendo y parece que los tiempos están bien en ambos casos (funciona y no funciona).
Comunicación I2C correcta (lectura de 3 bytes):
Dirección FRAM I2C no reconocida (la dirección del esclavo se envía correctamente):
Acciones ya realizadas para resolver este problema (sin éxito)
- Retardo agregado después de insertar la tarjeta con el FRAM incorporado para garantizar que se respete la secuencia de alimentación.
- I2C detiene la generación después de la detección de una dirección esclava no confirmada
Configuración del bus I2C
- Un maestro (microcontrolador STM32F205 de ST)
- Tres esclavos (EEPROM 24AA1025 de Microchip, RTC DS1339C de Maxim IC y el FRAM FM24C04 remoto de Ramtron
- Se utiliza una palanca de cambio de nivel I2C (MAX3373E de Maxim IC) para permitir la comunicación entre el maestro y el FRAM
- Frecuencia de bus configurada a 100 kHz
EDITADO (2013-04-17)
En primer lugar, gracias a todos por sus comentarios.
Como hay muchas sugerencias, aquí está la descripción de las investigaciones que he realizado.
Esquemas
La siguiente imagen muestra un esquema simplificado del bus I2C:
Las señales I2C_SDA e I2C_SCL están conectadas directamente al microcontrolador y las señales FRAM_SDA y FRAM_SCL están conectadas a la FRAM. Tenga en cuenta que las señales SDA y SCL conectadas a la FRAM se filtran utilizando ferritas BLM18 de Murata.
El FRAM está conectado de la siguiente manera:
- NC (pin 1) -> no conectado
- A1 (pin 2) -> GND
- A2 (pin 3) -> GND
- VSS (pin 4) -> GND
- SDA (pin 5) -> FRAM_SDA
- SCL (pin 6) -> FRAM_SCL
- WP (pin 7) -> GND (no protegido contra escritura)
- VDD (pin 8) -> + 5V
Descripción de la tarjeta FRAM
Esta tarjeta es una tarjeta "similar a ISA" que incorpora solo el FRAM.
Investigaciones
Disminuyendo la frecuencia
Realicé pruebas con la frecuencia SCL establecida en 50kHz y 10kHz. Medí la señal SCL con un osciloscopio para asegurarme de que estaba en la frecuencia esperada.
Estas modificaciones no resolvieron el problema. Verifiqué los tiempos y están dentro de las especificaciones de la hoja de datos de FRAM.
Asegurando la secuencia de potencia
@jippie.
- La palanca de cambio de nivel I2C se pone en modo de tres estados antes de insertar la tarjeta que incorpora el FRAM. Las señales FRAM_SDA y FRAM_SCL se bajan.
- Después de insertar la "tarjeta FRAM", se agrega un retraso de 100 ms para garantizar que la fuente de alimentación se estabilice (se requieren al menos 11 ms antes de la primera condición de inicio de acuerdo con la hoja de datos).
- La palanca de cambio de nivel I2C está activada.
- Se agrega una demora de 1 ms para garantizar que el cambiador de nivel I2C esté activado y que las líneas se levanten (~ 4us requeridos por la hoja de datos). Se extraen las señales FRAM_SDA y FRAM_SCL.
- Se accede al FRAM.
Las señales FRAM_SDA y FRAM_SCL se han medido después de cada paso.
El problema aún ocurre.
Condición de parada / inicio en lugar de inicio repetido
@gbarry.
Traté de detener antes del inicio repetido durante la transferencia de bytes. Medí la transferencia de bytes con el osciloscopio: la condición STOP seguida de la condición START está bien.
Desafortunadamente, esta solución no resuelve el problema.
Pensamientos
Este problema ocurre solo después de que la tarjeta que incrusta la FRAM está conectada. Ejecuté algunos miles de acceso de lectura exitoso (direccionamiento y lectura de esclavos) después de que la "tarjeta FRAM" se inserta y se direcciona correctamente.
A mí me suena cada vez más como un problema de hardware. Pero no sé si podría estar relacionado con el cambiador de nivel I2C o con los otros esclavos en el bus I2C.
¿Tienes alguna otra idea o sugerencia?
EDITADO (2013-04-18)
El problema parece estar resuelto.
Reemplacé el conector del módulo FRAM y encontré una manera de hacer mediciones directamente en el FRAM. Parece que todo funciona bien con este nuevo conector.
Haré más pruebas para asegurarme de que el problema proviene de una mala conexión.