Portar un controlador PSRAM STM32

1

Tengo una placa de desarrollo STM32F2 que vino con un PSRAM ( IS61WV10248BLL ), y tengo un tablero personalizado con un PSRAM diferente ( MT45W8MW16BGX ).

He logrado que el PSRAM de la placa de desarrollo funcione bien. Sin embargo, tengo problemas para conducir el nuevo PSRAM en mi placa personalizada. La principal diferencia que veo entre los dos recuerdos es que el nuevo PSRAM tiene más pines de dirección. Me he asegurado de inicializar correctamente todos mis relojes y pines GPIO, y he comprobado que el controlador de memoria ARM tiene una configuración razonable.

¿Qué diferencia entre los dos PSRAMs podría hacer que mi antiguo controlador falle?

A continuación se muestra la configuración del controlador de memoria que estoy usando actualmente:

  p.FSMC_AddressSetupTime = 0;
  p.FSMC_AddressHoldTime = 0;
  p.FSMC_DataSetupTime = 4;
  p.FSMC_BusTurnAroundDuration = 1;
  p.FSMC_CLKDivision = 0;
  p.FSMC_DataLatency = 0;
  p.FSMC_AccessMode = FSMC_AccessMode_A;

  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2;
  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM;
  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;  
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
    
pregunta Randomblue

3 respuestas

1

Acabo de echar un vistazo muy rápido a las hojas de datos, y puedo ver que la memoria RAM de Micron tiene tiempos de acceso mucho más altos que la memoria RAM ISSI. Dependiendo de qué tan rápido se está ejecutando tu MCU, es posible que tengas que insertar un par de estados de espera cuando accedas a él.

Eche un vistazo al manual de STM32, que contiene un par de datos útiles para determinar dónde insertar los estados de espera y cuántos (esto se hace a través de FSMC_AddressSetupTime , FSMC_AddressHoldTime y FSMC_DataSetupTime , entre otros).

    
respondido por el sonicwave
1

Para ese PSRAM (MT45W8MW16BGX-701IT), estoy usando estos valores

p.FSMC_AddressSetupTime = 3;
p.FSMC_AddressHoldTime = 0;
p.FSMC_DataSetupTime = 6; 
p.FSMC_BusTurnAroundDuration = 1;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;

FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure);

FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;  
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

Funciona bien con pruebas de memoria de escritura / lectura no críticas en todo el 16MB. Probablemente te sea útil.

Dicho esto, falla en la práctica. Veo que algunas cargas devuelven 0x0000 para los 16 bits más bajos de una carga de 32 bits. Si detengo el depurador y vuelvo a configurar la PC en la instrucción de carga, la segunda vez funciona bien. No estoy seguro de si se trata de un problema de temporización del bus FSMC, la discordia con algún otro dispositivo en el bus, o alguna cosa de caché extraña que no entiendo con el STM32.

    
respondido por el Mark Lakata
0

Estas partes son de diferente tecnología: la parte ISSI es SRAM que no tiene una secuencia de inicio dedicada. La parte de Micron es PSRAM que necesita un encendido y tiempo limpios de acuerdo con la hoja de datos. PSRAM es en realidad DRAM con un circuito de actualización interno y puede comportarse de forma automática si la señal WAIT no se utiliza para retrasar el acceso durante la operación de actualización interna.

    
respondido por el Maxa

Lea otras preguntas en las etiquetas