La dirección del esclavo I2C no se reconoce (a veces)

11

Estoy tratando de comunicarme con un FRAM conectado de forma remota (FM24C04 de Ramtron) mediante I2C. Esta memoria está incorporada en una placa que puede insertarse y eliminarse en cualquier momento desde / hacia el sistema (la comunicación se termina correctamente antes de que se extraiga 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 (funcionan y no funcionan).

Corregir la comunicación I2C (lectura de 3 bytes):

LadirecciónFRAMI2Cnoseconfirma(ladireccióndelesclavoseenvíacorrectamente):

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

  • Retraso agregado después de insertar la tarjeta con el FRAM incorporado para asegurar que se respeta la secuencia de poder.
  • I2C detiene la generación después de la detección de una dirección de esclavo sin reconocimiento

Configuración del bus I2C

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

EDITADO (2013-04-17)

En primer lugar, gracias a todos por sus comentarios.

Ya que 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:

LasseñalesI2C_SDAeI2C_SCLestánconectadasdirectamentealmicrocontroladorylasseñalesFRAM_SDAyFRAM_SCLestánconectadasalaFRAM.TengaencuentaquelasseñalesSDAySCLconectadasalaFRAMsefiltranutilizandoferritasBLM18deMurata.

ElFRAMestáconectadodelasiguientemanera:

  • NC(pin1)->noconectado
  • A1(pin2)->GND
  • A2(pin3)->GND
  • VSS(pin4)->GND
  • SDA(pin5)->FRAM_SDA
  • SCL(pin6)->FRAM_SCL
  • WP(pin7)->GND(noprotegidocontraescritura)
  • VDD(pin8)->+5V

DescripcióndelatarjetaFRAM

Estatarjetaesunatarjeta"ISA like" que solo incrusta el 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 solucionaron el problema. Revisé los horarios y están dentro de las especificaciones de la hoja de datos de FRAM.

Asegurar la secuencia de poder

@jippie.

  1. El cambiador de nivel I2C se pone en modo de tres estados antes de que se inserte la tarjeta que incrusta el FRAM. Las señales FRAM_SDA y FRAM_SCL están bajas.
  2. Después de insertar la "tarjeta FRAM", se agrega un retraso de 100 ms para garantizar que la fuente de alimentación esté estabilizada (se requieren al menos 11 ms antes de la primera condición de inicio según la hoja de datos).
  3. El cambio de nivel I2C está activado.
  4. Se agrega un retraso de 1 ms para garantizar que la palanca de cambios de nivel I2C esté activada y que las líneas se detengan (se requiere una hoja de datos de ~ 4us). Las señales de FRAM_SDA y FRAM_SCL se detienen.
  5. Se accede al FRAM.

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

El problema sigue ocurriendo.

Condición de detención / inicio en lugar de inicio repetido

@gbarry.

Intenté detener el proceso antes del inicio repetido durante la transferencia de bytes. Medí la transferencia de bytes con el osciloscopio: la condición de STOP seguida de la condición de START está bien.

Lamentablemente, esta solución no resuelve el problema.

Pensamientos

Este problema ocurre solo después de que la tarjeta que incrusta el FRAM esté conectada. Ejecuté algunos miles de accesos de lectura exitosos (direccionamiento y lectura de esclavos) después de que la "tarjeta FRAM" se insertó y se dirigió correctamente.

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.

¿Tiene alguna otra idea o sugerencia?

EDITADO (2013-04-18)

El problema parece estar resuelto

Reemplacé el conector del módulo FRAM y encontré la manera de hacer mediciones directamente en el FRAM. Parece que todo está funcionando bien con este nuevo conector.

Haré más pruebas para estar seguro de que el problema provino de una mala conexión.

    
pregunta johsey

7 respuestas

6

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

Antes de inicializar el hardware del Master I2C, configure SDA como entrada y realice una prueba de SDA baja.

Si está bajo, establezca el pin SCL alto.

Luego, mueva el pin SCL bajo y alto hasta que el SDA se ponga alto (es decir, elimine los bits restantes que los periféricos aún estén intentando enviar). Esto no puede llevar más de 8 ciclos de reloj; si lo hace, entonces hay algún otro problema.

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

    
respondido por el Buzby
2

Para el FRAM:

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

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

    
respondido por el jippie
2

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

Además, ¿por qué la tensión de desvío se desvía con el tiempo?

    
respondido por el Scott Seidman
2

¿Hay alguna posibilidad de que haya algo más que intente hablar con esa junta? Tuve un problema así una vez; Podría recibir un acuse de recibo el 60% del tiempo, pero no recuerdo haber visto nunca una colisión. Sospecho que el i2c que me proporcionaron estaba aislado del verdadero bus interno. 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 "panel posterior" intermedio.

No veo una secuencia de detención después de tu error NAK. Supongo que tiene un punto de interrupción que detiene el programa en ese momento?

Por último, si crees que eres el único en el autobús, también puedes intentar reemplazar el inicio repetido con una parada / inicio. He visto dispositivos (especialmente FPGA personalizados) que no sabían cómo manejar la RS.

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

En particular, desea ingresar al lado de FRAM de la palanca de cambios de nivel. Una interrupción en la señal es más probable que ocurra algo que normalmente se consideraría una colisión.

Señalaré que un ciclo NAK no se puede distinguir de un chip que simplemente no está allí. Las EEPROM harán esto para indicar que están ocupados. 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.

    
respondido por el gbarry
2

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

Si el dispositivo entra en un mal estado del que se recupera en un ciclo de energía, puede tener un circuito adicional que le permita a su MCU apagar el dispositivo. Luego, el firmware, al no recibir confirmación del dispositivo, puede ejecutar un procedimiento de recuperación mediante el cual apaga el chip por algún tiempo, lo enciende nuevamente y luego lo intenta de nuevo.

Si se trata de un contacto deficiente, entonces quizás tenga que ver la confiabilidad del conector y encontrar algo mejor. Si usa el mismo conector para obtener más de estos tableros, 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 posible problema con la inserción de la tarjeta y de que es posible que tenga que volver a colocarla para que funcione correctamente.

Su dispositivo principal podría tener una manera de activar una alarma que indique que no puede hablar con el FRAM: un LED de "problema" en un panel y / o un pitido o lo que sea. O a la inversa: se enciende algo de luz, que proporciona al usuario una respuesta de que se ha aceptado el FRAM y se ha establecido la comunicación. Si el FRAM está lejos del dispositivo maestro, la luz puede ubicarse en el módulo FRAM: otro chip I2C que controla un LED.

    
respondido por el Kaz
0

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

La hoja de datos enumera dos conjuntos de tiempos, uno para el "Modo estándar" y otro para "Modo rápido". Según sus mediciones, parece que está en el límite de los tiempos del "Modo estándar". No puedo decir, por omitir la hoja de datos, cómo se coloca exactamente el chip en cualquier modo.

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 del modo estándar para el tiempo de espera de la condición de inicio, el período de reloj alto y el período de reloj bajo y ver si este problema persiste?

    
respondido por el Ben Gartner
0

¿Hace h h a 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 hace usted hv 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 comprobar que no se produce un error en SCL que el chip interpretaría como un reloj adicional.

    
respondido por el gman

Lea otras preguntas en las etiquetas