¿Se ha bloqueado el controlador EEPROM I2C durante la prueba ESD?

2

En nuestro prototipo, tenemos una EEPROM basada en I2C. Durante la prueba de ESD (la chispa de alto potencial se inyecta en el sistema por un momento muy corto), los controladores cuelgan el código I2C.

Básicamente, existen bucles while en los que estamos verificando si el indicador de ocupado o ocupado está o no configurado, Reconocimiento recibido o no utilizando los registros respectivos. Por lo tanto, si alguno de los parámetros no coincide, entonces el código se bloqueará en ese bucle.

Este controlador funciona bien en condiciones normales.

Pero durante la inyección de chispa, se cuelga en uno de los bucles.

E incluso después de la prueba ESD permanece en la misma condición, no se recupera hasta que reiniciamos el dispositivo.

¿Qué podría ir mal con el controlador (MSP430F6438 bus I2c) o el esclavo (EEPROM basado en I2c), lo que hace que el código se cuelgue en uno de los bucles que comprueba el bus ocupado, la bandera de transmisión, la bandera de confirmación de recepción?

    
pregunta Virendra Kumar

4 respuestas

2

Si bien realmente no podemos saber qué es lo que causa tu bloqueo, hay un escenario probable en el que probablemente deberías mirar primero.

Es probable que un pulso ESD provoque una no deseada en la transición de una señal digital. En un sistema I2C, si ESD hace que aparezca un pulso en SDA cuando el bus está inactivo, esto se interpretará como una condición de inicio. Dependiendo de cómo se implementen los controladores uC y I2C periféricos, podrían esperar indefinidamente a que se complete la transacción iniciada antes de que estén listos para ejecutar una nueva transacción (por ejemplo, una generada por su código).

Por supuesto, un impulso adicional en SCL o SDA cuando una transacción I2C está en curso (tal vez detectada por uno solo de los dos chips involucrados) también podría hacer que los dos chips pierdan el rastro del estado de la transacción y causen problemas.

Entonces, si está buscando dónde podría mejorarse su hardware para evitar este fallo, asegúrese de que las líneas SDA y SCL se enruten sobre planos de tierra intactos, evite el exceso de distancia de enrutamiento y, posiblemente, reduzca los valores de resistencia de pull-up. Asegúrese también de que la unidad de control remoto y el periférico tengan capacitores de derivación adecuados.

Si está buscando soluciones de software para este fallo, si puede detectar la condición de bloqueo, puede intentar restablecer el bloque I2C de la unidad uC, o enviar pulsos SCL (8 o 10 o 16?) con SDA alto a Borrar la máquina de estados I2C en el periférico. Esto podría requerir que se restablezcan los iC de uC para que sean GPIO's y bit banging si el bloque uC I2C también está bloqueado.

    
respondido por el The Photon
2

Parece que sus condiciones de prueba están causando que el código del controlador I2C, o el propio módulo I2C, ingresen en un estado del cual no pueden recuperarse.

Intente poner un tiempo de espera en los bucles para detectar un fallo; si ocurre una falla, reinicie el hardware y los controladores I2C.

El tiempo de espera más sencillo de implementar sería contar la cantidad de veces que se probaron los distintos indicadores y cuando el recuento expire, salga con un código de error.

Un enfoque más complicado (es decir, útil) sería monitorear un temporizador de hardware que se ejecuta en segundo plano. Cuando se inicia un bucle, registre el valor actual del temporizador más el tiempo de espera que desee; compruebe el temporizador al comienzo de cada ciclo y si supera su valor calculado previamente, salga con un código de error.

    
respondido por el markt
1
  

¿Qué podría salir mal con el controlador (MSP430F6438 I2c bus) o con el   esclavo (EEPROM basado en I2c), lo que hace que el código se cuelgue en uno de los   Bucles que comprueban el bus ocupado, el indicador de tránsito, la confirmación recibida   bandera?

Es difícil decir cuál es la causa del bloqueo del sistema. Pero puedes hacer algo para averiguar dónde colgar el código. Si es posible, puede imprimir algún mensaje de depuración en la pantalla o en su PC mediante USART u otra interfaz. Puede agregar un poco de "sonda" en su código, cuando ingrese una función o ingrese un ciclo, imprima un mensaje en su PC, luego puede saber dónde está colgado el código.

Sin embargo, es un buen hábito agregar tiempo de espera a un bucle que puede estar "muerto".

    
respondido por el diverger
1

Ordenar el código escamoso. Si el código se cuelga debido a una circunstancia imprevista, modifíquelo para que se atienda la circunstancia imprevista. Como último recurso, intente un temporizador de vigilancia de hardware, aunque esto solo funcionará (sin cambio de código) si hay algunas líneas externas que se pueden decodificar que indiquen el problema. También puede considerar algún tipo de protección / filtrado de EMI en el cableado interno e incluso echar un vistazo al plano de tierra alrededor de la micro y EEPROM.

    
respondido por el Andy aka

Lea otras preguntas en las etiquetas