problema de SDRAM con LPC1788

2

Este es el diseño de mi PCB:

Miproblemaes:

CuandointentéaccederaSDRamconmicódigodeejemplo(códigodepruebadememoria),todopareceestarbien.TodoslosdatosdeSDRamcambianloquenecesito.PerocuandointentéaccederaunmontóndelugaresenSDRam,losdatossecorrompen.Elcódigoestábien,heprobadoelcódigoenmieval.Juntaynosehaproducidoningúnproblema.Podríaentenderquesitodoslosdatossecorrompenencadaintento.

Aquíestánloscódigosconproblemaysinproblema:

Mostrarécómosehaafectadolamemoria.

Laprimerafotomuestraunalecturadeescrituraexitosa:

La segunda foto muestra datos erróneos:

Yunainteresanteeslatercerafoto.Nohecambiadonada.sólodesplácesehaciaarribayhaciaabajo.Ylosdatosdefectuososcambianysemuevenalosotroslugares.siexisteunproblemadelectura,¿porquénoocurrecuandousoscroll,enlaventanadememoriaconlabandejadecódigosexitosa?Esperoquelasfotospuedanserútiles.

Esta es mi base:

aquíestámicódigodetrabajosimplemente.sinfaltaCadavezquefuncionaperfectamente.

SDRAMInit();wr_ptr=(uint32_t*)SDRAM_BASE_ADDR;char_wr_ptr=(uint8_t*)wr_ptr;/*Clearcontentbefore8bitaccesstest*/_DBG_("Clear content of SDRAM...");
for ( i= 0; i < SDRAM_SIZE/4; i++ )
{
  *wr_ptr++ = 0x00;
}

/* 8 bit write */
_DBG_("Writing in 8 bits format...");
for (i=0; i<SDRAM_SIZE/4; i++)
{
  *char_wr_ptr++ = 0x11;
  *char_wr_ptr++ = 0x22;
  *char_wr_ptr++ = 0x33;
  *char_wr_ptr++ = 0x44;
}

/* verifying */
_DBG_("Verifying data...");
wr_ptr = (uint32_t *)SDRAM_BASE_ADDR;
for ( i= 0; i < SDRAM_SIZE/8; i++ )
{
    if ( *wr_ptr != 0x44332211 )    /* be aware of endianess */
    {
        /* byte comparison failure */
        _DBG_("Verifying fail, testing terminated!");
        while ( 1 );    /* fatal error */
    }
    wr_ptr++;
}

/* byte comparison succeed. */
_DBG_("Continue writing in 16 bits format...");
wr_ptr = (uint32_t *)SDRAM_BASE_ADDR;
short_wr_ptr = (uint16_t *)wr_ptr;

/* Clear content before 16 bit access test */
_DBG_("Clear content of SRAM...");
for ( i= 0; i < SDRAM_SIZE/4; i++ )
{
    *wr_ptr++ = 0;
}

/* 16 bit write */
_DBG_("Writing in 16 bits format...");
for (i=0; i<(SDRAM_SIZE/4); i++)
{
    *short_wr_ptr++ = 0x5AA5;
    *short_wr_ptr++ = 0xAA55;
}

/* Verifying */
wr_ptr = (uint32_t *)SDRAM_BASE_ADDR;

//wr_ptr -= SDRAM_BASE_ADDR/4;
for ( i= 0; i < SDRAM_SIZE/4; i++ )
{
    if ( *wr_ptr != 0xAA555AA5 )    /* be aware of endianess */
    {
        /* 16-bit half word failure */
        _DBG_("Verifying fail, testing termintated!");
    while ( 1 );    /* fatal error */
    }
    wr_ptr++;
}

/* 16-bit half word comparison succeed. */

_DBG_("Verifying complete, testing terminated!");
    while(1);
    
pregunta freewave

4 respuestas

2

Esto no es una respuesta, sino más bien un comentario largo.

Creo que puede tener algunos problemas de integridad de señal y diseño como algunas personas notaron en los comentarios:

  • Primero que todo: no tienes un plano GND continuo bajo tus líneas SDRAM.

Sus líneas SDRAM necesitan tener una impedancia controlada. Para hacer esto, generalmente ponemos un plano GND debajo de trazas y ajustamos la distancia vertical para tener la impedancia correcta. Cuando tienes un "agujero" de GND, estás haciendo un cambio de impedancia y tu señal será alterada. También teniendo via hace algunos cambios de impedancia.

Aquí está el diseño de su PCB con la mayoría del cambio de impedancia resaltado, en algunas líneas hay muchos cambios de impedancia.

  • Lo segundo: parece que no has equilibrado la longitud de tus rastros.

Algunos son más cortos que otros. Las especificaciones de SDRAM deben especificar un sesgo autorizado o una diferencia de longitud entre las trazas.

Como algunas personas sugirieron, debería mirar sus señales con un osciloscopio. Y tal vez un analizador lógico para verificar la validez de sus tiempos.

    
respondido por el zeqL
0

Acerca de: "... simplemente desplácese hacia arriba y hacia abajo. Y los datos defectuosos cambian y se trasladan a otros lugares. Si hay un problema de lectura, ¿por qué no ocurre cuando uso scroll, en la ventana de memoria con la bandeja de códigos exitosa? "
La CEM del LPC1788 tiene 4 búferes pequeños para lectura / escritura (cada búfer tiene 16 DWORD). Estos búferes funcionan como "caché" y pueden ocultar los errores de acceso a SDRAM (si escribiera y leyera un pequeño bloque de datos, lea uno de los búferes, sin acceso real a SDRAM). Otro efecto que debe tener en cuenta: después de escribir en SDRAM sobre el depurador, debe realizar 1-2 pasos ("Paso a paso" en LPCXpresso) para ver el error de SDRAM en el navegador de memoria.

    
respondido por el nxpguest
0

Debe colocar la SDRAM debajo de lpc1788 en la capa inferior y debe tener cuidado con la GND en la capa inferior cerca de la SDRAM. Si lo hace, sus pistas se acortarán y su PCB funcionará bien.

    
respondido por el Sajjad Torkan
0

Verifique todos los errores y escriba todos los errores Dirección, Datos de origen, Datos de error en formato binario. compruebe qué bit tiene error. Es error en el bus de datos o en el bus de direcciones. luego arregle esa red (el filtro de esa red en Altium Designer es una buena técnica). Disculpa por mi mal inglés

    
respondido por el user95258

Lea otras preguntas en las etiquetas