Dirección de esclavo I2C no reconocida (a veces)

Estoy intentando comunicarme con una FRAM conectada de forma remota (FM24C04 de Ramtron) mediante I2C. Esta memoria está integrada 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 retire la memoria).

El problema es que justo después de insertar la tarjeta que contiene el FRAM, a veces , no reconoce la dirección.

Medidas de señales

Medí las señales para ver qué estaba pasando y parece que los tiempos están bien en ambos casos (funcionando y no funcionando).

Comunicación I2C correcta (lectura de 3 bytes):ingrese la descripción de la imagen aquí

Dirección I2C FRAM no reconocida (la dirección del esclavo se envía correctamente):ingrese la descripción de la imagen aquí

Acciones ya realizadas para solucionar este problema (sin éxito)

  • Retraso agregado después de que se inserta la tarjeta con el FRAM incorporado para garantizar que se respete la secuencia de potencia.
  • I2C detiene la generación después de la detección de una dirección esclava sin reconocimiento

Configuración de bus I2C

  • Un maestro (microcontrolador STM32F205 de ST)
  • Tres esclavos (EEPROM 24AA1025 de Microchip, RTC DS1339C de Maxim IC y el remoto FRAM FM24C04 de Ramtron
  • Se utiliza un cambiador de nivel I2C (MAX3373E de Maxim IC) para permitir la comunicación entre el maestro y la FRAM
  • Frecuencia de bus establecida en 100 kHz

esquemas

La siguiente imagen muestra un esquema simplificado del bus I2C:

esquema de 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 mediante el uso de ferritas BLM18 de Murata.

La FRAM se conecta de la siguiente manera:

  • NC (pin 1) -> no conectado
  • A1 (pin 2) -> TIERRA
  • A2 (pin 3) -> TIERRA
  • VSS (pin 4) -> TIERRA
  • SDA (pin 5) -> FRAM_SDA
  • SCL (pin 6) -> FRAM_SCL
  • WP (pin 7) -> GND (sin protección contra escritura)
  • VDD (pin 8) -> +5V

Descripción de la tarjeta FRAM

Esta tarjeta es una tarjeta "similar a ISA" que incorpora solo la FRAM.

Investigaciones

Ralentizando 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. Revisé los tiempos y están dentro de las especificaciones de la hoja de datos de FRAM.

Garantizar la secuencia de potencia

  1. El cambiador de nivel I2C se pone en modo de tres estados antes de que se inserte la tarjeta que incorpora la FRAM. Las señales FRAM_SDA y FRAM_SCL se reducen.
  2. 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 según la hoja de datos).
  3. El cambiador de nivel I2C está activado.
  4. Se agrega un retraso de 1 ms para garantizar que el cambiador de nivel I2C se active y que las líneas se levanten (~ 4 us requeridos por la hoja de datos). Las señales FRAM_SDA y FRAM_SCL se activan.
  5. Se accede a la FRAM.

Las señales FRAM_SDA y FRAM_SCL se han medido después de cada paso.

El problema sigue ocurriendo.

Condición de parada/arranque en lugar de arranque repetido

Traté de poner una parada 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 justo después de que se conecta la tarjeta que incorpora la FRAM. Ejecuté algunos miles de accesos de lectura exitosos (direccionamiento y lectura de esclavos) después de insertar y direccionar correctamente la "tarjeta FRAM".

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 en el bus I2C.

¿Tienes otras ideas o sugerencias?


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 va bien con este nuevo conector.

Haré más pruebas para asegurarme de que el problema proviene de una mala conexión.

¿Puedes publicar el esquema? Pruebe con una frecuencia de bus más lenta para ver si eso hace la diferencia.
¿Ha ocurrido el problema justo después de la inserción y no en otras ocasiones? ¿Qué tan pronto es "justo después"?
Además de los otros experimentos, podría intentar eliminar a los otros esclavos y ver si eso afecta el comportamiento.
¿Están los dos pines de dirección bajados correctamente o se han dejado flotando?
@Suirnder He publicado el esquema en mi respuesta.
@Kaz Este problema ocurre solo después de que se conecta la tarjeta que incorpora la FRAM. Ejecuté algunos miles de accesos de lectura exitosos (direccionamiento y lectura de esclavos) después de insertar y direccionar correctamente la "tarjeta FRAM".
@BenGartner Me gustaría encontrar otra solución antes de desoldar los otros esclavos.
@fm_andreas Los dos pines de dirección se ponen en estado de alta impedancia cuando el cambiador de nivel I2C está en modo de tres estados.
El MAX3373E tiene resistencias pull up integradas de 10K en ambos lados de las líneas de E/S. Retire las resistencias pull up R36, R37 y, si tiene una, en el dispositivo FRAM. Supongo que tiene un límite de derivación en el dispositivo FRAM. Si eso no resuelve su problema, en lugar de desoldar otros dispositivos, primero puede intentar quitar las resistencias de 0 ohmios que usa en los pines de alimentación del reloj en tiempo real y la EEPROM.
Todavía no tengo claro si esto es algo que sucede una vez o si es una falla permanente. Quiero decir, ¿le preocupa que haya una NAK antes de que se establezca una comunicación exitosa? ¿O es que cuando la FRAM está en este estado, se queda así? Si sigue así, tal vez sea solo un mal contacto. No recibe energía correctamente, o el SCL/SCA, o lo que sea.
@Suirnder Tienes razón, puedo quitar resistencias externas. La idea base era desactivar el cambiador de nivel I2C hasta que se inserte el módulo FRAM. Por lo tanto, tenía que asegurarme de que el bus estuviera alto incluso si las E/S del cambiador de nivel estaban en modo de alta impedancia.
@Kaz Parece que si ocurre el NACK, la FRAM permanece en este modo hasta que se desconecta y se vuelve a conectar. Como dices, sospecho un eventual mal contacto. Tengo que investigar más a fondo para asegurarme de que esta es la causa del problema.
¿Cuánto mide el cable a la FRAM "remota"? ¿La señal que nos está mostrando es en la placa base o en la FRAM?
@ScottSeidman La longitud del cable es de unos 30 cm. La señal en mi publicación inicial se midió en la placa base. Realicé pruebas con otro conector y pude medir las señales directamente en los pines FRAM. Parece que todo está bien ahora y el problema era el conector. Haré más pruebas para asegurarme de que el problema está resuelto.

Respuestas (7)

Aunque dice que sus comunicaciones están correctamente terminadas antes de la inserción o extracción, puede valer la pena probar esta solución, ya que hay una situación en la que el bus I2C puede dar problemas después de reiniciar solo uno de los dispositivos en el bus.

Antes de inicializar el hardware Master I2C, configure SDA como entrada y pruebe si SDA es bajo.

Si es bajo, configure el pin SCL alto.

Luego cambie el pin SCL bajo y alto hasta que SDA suba (es decir, desconecte los bits restantes que los periféricos aún podrían estar tratando de enviar). Esto no puede tomar más de 8 ciclos de reloj; si lo hace, entonces hay algún otro problema.

No puedo garantizar que esto resuelva tu problema, ¡pero resolvió el mío!.

No es una mala idea agregar este "algoritmo de recuperación de bus" antes de inicializar el maestro. Lo implementaré. Gracias.

Para la FRAM:

  • primero conecte GND y Vcc;
  • luego asegúrese de que A1, A2 y WP tengan el nivel correcto;
  • solo entonces conecte los pines de datos.

Conectar otros pines que no sean la fuente de alimentación antes de que se encienda el chip puede causar problemas.

10k parece un poco grande para tus dominadas, y tus bordes de ataque parecen lentos. Reduzca las resistencias a aproximadamente 3k y vea si eso ayuda.

Además, ¿por qué el voltaje de apagado se desvía con el tiempo?

Reduje las resistencias pull-up a 3.3k y eso no ayuda. No tengo ni idea con respecto a esta deriva.
Se ve pequeño en la pantalla, pero creo que tiene unos 250 mV. Es posible que tenga un problema con la fuente de alimentación en el lado de 3,3 V
Tiene razón, la deriva es de aproximadamente 300 mV en ambos lados del cambiador de nivel I2C. La fuente de alimentación de +3,3 V parece funcionar bien (sin deriva en su salida cuando se produce la deriva en la señal SCL). ¿Podría estar relacionado con el cambiador de nivel I2C?
No estoy seguro en absoluto. ¿De dónde viene 3.3V? ¿Convertidor de conmutación? En cualquier caso, es sospechoso. ¿Está utilizando la corriente MÍNIMA requerida por el dispositivo que proporciona 3,3 V según la hoja de datos? Si no, cargue su suministro con una resistencia. ¿Qué sucede si espera uno o dos segundos antes de iniciar la comunicación?
3.3V proviene de un SMPS (LM3103MH de TI). No soy un experto en fuentes de alimentación, pero según tengo entendido, con este dispositivo, no hay una corriente mínima requerida, ya que puede operar en modo de conducción discontinua con una carga liviana. El mismo problema ocurre si espero dos segundos antes de iniciar la comunicación.

¿Hay alguna posibilidad de que haya algo más tratando de hablar con esa placa? Tuve un problema como ese una vez; Podría recibir un ACK el 60% del tiempo, pero no recuerdo haber podido ver nunca una colisión. Sospecho que el i2c que me proporcionaron estaba de alguna manera aislado del bus interno real. Podría ejecutarlo de forma continua, y solo eliminaría el 30% de los mensajes. El problema desapareció en el momento en que comenzamos a hablar directamente con el dispositivo (una fuente de alimentación) sin el "backplane" intermedio.

No veo una secuencia de parada después de su error NAK. ¿Supongo que tienes un punto de interrupción que detiene el programa en ese punto?

Por último, si cree que es el único en el autobús, también puede intentar reemplazar el inicio repetido con un inicio/parada. He visto dispositivos (especialmente FPGA personalizados) que no sabían muy bien cómo manejar el RS.

[En respuesta al comentario]: Hay muchas cosas que no dijiste sobre la placa FRAM, como si es solo memoria o un subsistema completo. Pero si puede colocar el 'visor justo en los cables del dispositivo i2c que le está dando problemas, y aún ve lo que se muestra en la imagen, entonces descartaría la interferencia. I2C es tan simple que si ve las señales correctas en la entrada, entonces el chip debería funcionar correctamente a menos que tenga un problema interno.

En particular, desea obtener el lado FRAM de ese cambiador de nivel. Una interrupción en la señal es más probable que algo que normalmente se consideraría como una colisión.

Señalaré que un ciclo NAK es indistinguible de un chip que simplemente no está allí. Las EEPROM harán esto para indicar que están ocupadas. Busqué el tiempo de escritura en FRAM y es más rápido que un solo bit de datos i2c... así que eso no es un problema.

Solo hay un maestro en el bus I2C y la placa que incorpora la FRAM solo está conectada a este bus. Por lo tanto, creo que no hay posibilidad de que algo más esté tratando de hablar con él. Sí, puse un punto de interrupción antes de la secuencia de parada. Intentaré reemplazar este inicio repetido con una parada/inicio como sugieres y lo probaré nuevamente. De acuerdo con su hoja de datos, la FRAM debería admitir el inicio repetido. ¿Crees que si aíslo la FRAM (por ejemplo, en un bus I2C dedicado) esto eventualmente podría resolver este problema?
La placa FRAM incorpora solo la FRAM. Es una placa "similar a ISA". Es difícil medir las señales directamente en los pines FRAM ya que esta tarjeta está incrustada en una pieza de plástico. De todos modos, intentaré encontrar una manera de medir estas señales lo más cerca posible de la FRAM.
Llegar al lado FRAM de U13 sería un gran paso.

Dado que el problema, cuando se reproduce, es una falla permanente que solo se soluciona al quitar y volver a insertar el dispositivo, entonces es una de dos cosas: el dispositivo está en mal estado del cual solo se recupera en un ciclo de energía, o hay mal contacto.

Si el dispositivo entra en mal estado del cual se recupera en un ciclo de encendido, puede tener un circuito adicional que permita que su MCU apague el dispositivo. Luego, el firmware, al no recibir reconocimiento del dispositivo, puede ejecutar un procedimiento de recuperación mediante el cual apaga el chip durante un tiempo, lo vuelve a encender y luego vuelve a intentarlo.

Si se trata de un mal contacto, entonces tal vez deba mirar la confiabilidad del conector y encontrar algo mejor. Si usa el mismo conector para hacer más de estas placas, podría haber problemas en el campo. En cualquier caso, puede haber un procedimiento humano para manejar la situación. El operador que trabaja con el dispositivo debe ser consciente del problema potencial con la inserción de la tarjeta y que es posible que deba volver a colocarla para que funcione correctamente.

Su dispositivo principal podría tener una forma de generar una alarma que indique que no puede comunicarse con la FRAM: un LED de "problema" en un panel y/o un pitido o lo que sea. O al revés: alguna luz que se enciende, informando al usuario de que se ha aceptado la FRAM y se ha establecido la comunicación. Si la FRAM está lejos del dispositivo maestro, la luz se puede ubicar en el módulo FRAM: otro chip I2C que impulsa un LED.

La naturaleza esporádica del problema sugiere que podría ser un problema de tiempo.

La hoja de datos enumera dos conjuntos de tiempos, uno para el "Modo estándar" y otro para el "Modo rápido". Según sus medidas, parece que está en el límite de los tiempos del "Modo estándar". Al hojear la hoja de datos, no puedo decir cómo se coloca exactamente el chip en cualquiera de los modos.

No asumiría que su dispositivo está en modo rápido. ¿Puede reducir los tiempos en un factor de 2 a 4, asegurarse de estar dentro de los tiempos de modo estándar para el tiempo de espera de la condición de inicio, el período alto del reloj y el período bajo del reloj y ver si este problema persiste?

Mi dispositivo está en el "Modo estándar" (frecuencia SCL de 100 kHz). De hecho, esta frecuencia está en el límite de este modo. Intentaré reducirlo por un factor de dos y haré algunas pruebas.

¿Tienes un 24c04a, b o c? Si es un c04a, era un diseño robusto. La parte b tiene sensibilidad a las rampas de alimentación. ¿Qué desacoplamiento tienes en pin8 a gnd? Iba a decir algo sobre los niveles de señal, pero veo que usas un traductor de nivel. Es posible que desee verificar que no tenga una falla en SCL que el chip interpretaría como un reloj adicional.

¿Escribió esto en un teléfono celular viejo con solo una interfaz de nueve botones?
La FRAM utilizada es la FM24C04B . ¿De dónde sacaste esta información sobre la sensibilidad del poder de esta memoria? ¿Puedes darme más entradas? No hay desacoplamiento en el pin 8. El diseño de este módulo se hizo hace unos años y tenemos que consumir toda la producción. De acuerdo con las mediciones realizadas con el osciloscopio, parece que no hay fallas en la línea SCL cuando el módulo FRAM está conectado y el nivel de cambio está activado.
Me doy cuenta de que esta respuesta es muy tardía, pero mi información con respecto a la sensibilidad de Vcc proviene de ser soporte de aplicaciones para Ramtron, hace años. No recuerdo los detalles exactos, pero bajo ciertas velocidades y temperaturas de rampa, el chip esencialmente se bloquea y no permite la comunicación I2C hasta que se enciende con una rampa 'buena'. No tener una tapa de desacoplamiento cerca del chip no es bueno. Puede encontrar que usar el desacoplamiento de 0.1uF vs 10uF cambia la rampa Vcc donde uno funciona y el otro no. @angelatlarge, sí, lo siento, escribí mi primera respuesta desde un teléfono.