Problema SDRAM - LPC1788

He estado usando una placa de desarrollo NXP LPC1788 en la que he desarrollado mi aplicación (puerto .NET Microframework Cortex-M3). Todo estaba muy bien en esta placa, no tuve problemas con la memoria RAM ni de otra manera, por lo que estaba listo para comenzar el desarrollo de mi placa de producción.

Creé una nueva placa con la misma memoria RAM y procesador, y tomé el binario de la placa de desarrollo y lo puse en la nueva placa y tengo problemas cuando ejecuto desde SDRAM. No es lo habitual donde no hay conexión, ni hay una falla intermitente... Puedo ejecutar una prueba de memoria (escribir en todo el bloque SDRAM en 32 bits, 16 bits, 8 bits y leer los datos correctos varias veces).

Sin embargo, cuando trato de ejecutar mi aplicación, tengo problemas realmente extraños con la memoria RAM que se sobrescribe o no se escribe en absoluto. Esto es solo cuando se ejecuta la aplicación, que es perfecta en la placa de desarrollo. No es intermitente, siempre hace lo mismo. Debido a esto, supongo que no es mi enrutamiento lo que me está causando problemas (porque mi verificación de memoria pasa).

¿Hay alguna característica extraña del LPC1788 EMC (ARM PrimeCell™ MultiPort Memory Controller) de la que no estoy al tanto que podría estar causando problemas de almacenamiento en búfer o problemas de lectura anticipada? Si alguien con experiencia en esto pudiera orientarme en la dirección correcta, o ayudarme a escribir una mejor prueba de memoria para detectar estas extrañas condiciones, sería muy útil...

Adjunto una imagen del enrutamiento, que aunque no es óptimo (tengo solo 4 capas, 2 de señal, 2 de plano de alimentación) permite que la memoria RAM funcione y puedo leer desde el dispositivo.

ingrese la descripción de la imagen aquí

Respuestas (3)

Huellas largas y paralelas. Sin terminación de señal. Sin límites de desacoplamiento en la RAM. Rastros de señal que van de la capa superior a la inferior sin una tapa cerca. Rastros con stubs largos, sin terminar. Algunas señales pasan por 5 vías. Y posiblemente no haya suficientes vías en los pines de alimentación/tierra del BGA (pero es difícil saberlo a partir de la imagen).

Cualquiera de estos podría causar problemas de memoria, y algunos a cualquier velocidad. Sondee cuidadosamente sus relojes en el destino con un osciloscopio de alta velocidad (350 MHz o más) y muéstrenos lo que ve. Lo más probable es que tenga un problema con la integridad de la señal.

gracias david Estaba tratando de exprimir este diseño en 4 capas, pero tratar de reducir los costos tiene sus desventajas. Voy a hacer lo siguiente en un rediseño: 6 capas (trazas más cortas), terminación de 22 ohmios en líneas de datos, agregar tapas de desacoplamiento de RAM, reducir la cantidad de vías en las líneas. No estoy seguro de si necesito resistencias de terminación o no en las líneas de dirección y las señales de control, ya que no las he visto en la hoja de datos. Además, ¿por qué querría un límite cerca de las vías de rastreo de señal? Soy un ingeniero 'casero' y, por lo tanto, ¡no tengo capacitación en integridad de señal!
@James El término clave que te falta es "Ruta de retorno de señal". Una señal no solo va en una dirección, tiene que regresar; generalmente usando el plano de potencia o de tierra. La gestión de esta ruta de retorno es clave para la integridad de la señal y la EMI (tanto la transmisión de RF no intencional como la recepción de RF). Este es un gran tema, pero aquí hay una lectura ligera: ti.com/lit/an/scaa082/scaa082.pdf

Huele a un problema dependiente de datos. Es posible que tenga algún acoplamiento desafortunado entre algunos de los datos y/o las líneas de dirección, de modo que el patrón correcto provoque una falla en alguna parte.

Prueba a ralentizar el reloj. Cómo cambia o no el síntoma puede dar algunas pistas. Si hay diafonía entre algunas de las líneas de dirección y datos, esto debería hacer que el problema desaparezca porque las transferencias se realizan después de que todo finalmente se asiente. Si el problema es que el ruido llega a la línea del reloj, probablemente esto no cambie nada.

Mire algunas de las señales con un alcance y vea qué tan limpias se ven. ¿Puso resistencias en serie con las líneas para igualar mejor la impedancia de rastreo y reducir el zumbido? Asegúrese de verificar también la línea del reloj, no solo unas pocas líneas de datos. También verifique que realmente tenga los tiempos de configuración y espera que necesita el chip.

Recuerde que el aparente buen funcionamiento no es prueba de funcionamiento correcto, solo de suerte.

Hola Olin, parece realmente extraño que el mismo problema ocurra exactamente de la misma manera cada vez. No he hecho coincidir la impedancia de las líneas de transmisión. He reducido el chip a 12Mhz y la interfaz SDRAM EMC a 6Mhz y persiste exactamente el mismo problema. Es realmente extraño que el acceso normal a los datos no sea un problema, pero ejecutar la aplicación genera errores. ¡Puedo rediseñar el circuito en 6 capas, hacer coincidir la impedancia de cada línea y esperar lo mejor!

¿Qué pruebas de memoria estás ejecutando? Además de los clásicos, llénalo con 0 y F y A y 5 y caminando y todo eso, y la dirección para hacer una prueba de bit de dirección. Mi favorito es una prueba pseudoaleatoria. tome un lfsr (muy fácil de codificar, determinista y repetible y es "suficientemente aleatorio"), siembre, llene la memoria con números aleatorios (no se salte ninguno ni se detenga en seco, de principio a fin, pase una semilla al principio, asegure/elija el lfsr no se repite dentro del espacio en el que lo está utilizando), sembréelo y vuelva a leerlo. sembrarlo, llenar la memoria con los valores invertidos del aleatorizador, sembrarlo verificar. Cambia la semilla y repite. Tiendo a dejar que una prueba como esta se ejecute por un tiempo. Encuentra muy rápidamente problemas de bit de dirección y problemas de línea de datos y muchos de los problemas normales más rápido que las pruebas tradicionales.

¿Qué sucede si reduce la velocidad del reloj y corre más lento? ¿Cambia?

Si no es hardware, concéntrese en el software, ¿cuál es la diferencia entre la placa de desarrollo y su placa? divida la aplicación en partes y vea si alguna se ejecuta o falla, sin importar cuánto la recorte.

ahh, sdram, ¿está funcionando tu actualización? al realizar una prueba de aleatorización descrita anteriormente, agregue una prueba que llene la memoria, espere muchos segundos o minutos y luego vuelva a leer. Lento es tan difícil de pasar como rápido.
Gracias. Crearé estas pruebas como sugieres y veré si puedo encontrar el problema... También probaré tu sugerencia de esperar unos minutos antes de volver a leer los datos para verificar la actualización, una muy buena idea. ¡No había pensado en eso!
mismo trato con eeprom y flash, pero hay que esperar más. Tenía una eeprom que tardaba un par de semanas en desvanecerse/cambiar de estado.