Estoy tratando de comunicarme con una FRAM conectada remotamente (FM24C04 de Ramtron) usando I2C. Esta memoria está incrustada en una placa que puede ser insertada y retirada en cualquier momento al/del sistema (la comunicación se termina correctamente antes de retirar la memoria).
El problema es: justo después de insertar la tarjeta que contiene la FRAM, a veces No reconoce la dirección.
Mediciones de señales
He medido las señales para ver qué pasa y parece que los tiempos están bien en ambos casos (funcionando y sin funcionar).
Comunicación I2C correcta (lectura de 3 bytes):
Dirección I2C FRAM no reconocida (la dirección del esclavo se envía correctamente):
Acciones ya realizadas para solucionar este problema (sin éxito)
- Retraso añadido tras la inserción de la tarjeta con la FRAM incorporada para garantizar que se respete la secuencia de alimentación.
- Generación de parada de I2C tras la detección de una dirección de esclavo no reconocida
Configuración del bus I2C
- Un maestro (microcontrolador STM32F205 de ST)
- Tres esclavos (EEPROM 24AA1025 de Microchip, RTC DS1339C de Maxim IC y la FRAM remota FM24C04 de Ramtron
- Se utiliza un desplazador de nivel I2C (MAX3373E de Maxim IC) para permitir la comunicación entre el maestro y la FRAM
- Frecuencia del bus ajustada 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 hecho.
Esquemas
La siguiente imagen muestra un esquema simplificado del bus I2C:
Las señales I2C_SDA e I2C_SCL se conectan directamente al microcontrolador y las señales FRAM_SDA y FRAM_SCL se conectan a la FRAM. Tenga en cuenta que las señales SDA y SCL conectadas a la FRAM se filtran utilizando ferritas BLM18 de Murata.
La FRAM se conecta 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 la ISA" que sólo incorpora la FRAM.
Investigaciones
Reducción de la frecuencia
Hice pruebas con la frecuencia SCL ajustada a 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. He comprobado los tiempos y están dentro de las especificaciones de la hoja de datos de la FRAM.
Garantizar la secuencia de alimentación
@jippie.
- El cambiador de nivel I2C se pone en modo de tres estados antes de insertar la tarjeta que incorpora la FRAM. Las señales FRAM_SDA y FRAM_SCL se ponen a nivel bajo.
- Tras la inserción de la "tarjeta FRAM", se añade un retardo de 100ms para garantizar la estabilización de la alimentación (se requieren al menos 11ms antes de la primera condición de arranque según la hoja de datos).
- Se activa el cambiador de nivel I2C.
- Se añade un retardo de 1ms para asegurar que se activa el cambiador de nivel I2C y que las líneas se suben (~4us requeridos por la hoja de datos). Las señales FRAM_SDA y FRAM_SCL son pull up.
- Se accede a la FRAM.
Las señales FRAM_SDA y FRAM_SCL se han medido después de cada paso.
El problema sigue existiendo.
Condición de parada/arranque en lugar de arranque repetido
@gbarry.
Intenté poner un tope antes del inicio repetido durante la transferencia de bytes. He medido la transferencia de bytes con el osciloscopio: la condición de STOP seguida de la condición de START está bien.
Por desgracia, esta solución no resuelve el problema.
Pensamientos
Este problema se produce justo después de conectar la tarjeta que incorpora la FRAM. He ejecutado unos cuantos miles de accesos de lectura con éxito (direccionamiento y lectura de esclavos) después de que la "tarjeta FRAM" esté insertada y correctamente direccionada.
Cada vez me suena más a un problema de hardware. Pero no sé si podría estar relacionado con el cambiador de nivel I2C o con los otros esclavos del bus I2C.
¿Tiene alguna otra idea o sugerencia?
EDITADO (2013-04-18)
El problema parece estar resuelto
He sustituido el conector del módulo FRAM y he encontrado la manera de hacer mediciones directamente en el FRAM. Parece que todo funciona bien con este nuevo conector.
Haré más pruebas para estar seguro de que el problema proviene de una mala conexión.