На макетной плате STM32F429 есть память IS42S16400J
Нажмите для просмотра прикрепленного файла
которая нормально работает с такими настройками
CODE
/* Timing configuration for 90 Mhz of SD clock frequency (180Mhz/2) */
/* TMRD: 2 Clock cycles */
SDRAM_Timing.LoadToActiveDelay = 2;
/* TXSR: min=70ns (6x11.90ns) */
SDRAM_Timing.ExitSelfRefreshDelay = 7;
/* TRAS: min=42ns (4x11.90ns) max=120k (ns) */
SDRAM_Timing.SelfRefreshTime = 4;
/* TRC: min=63 (6x11.90ns) */
SDRAM_Timing.RowCycleDelay = 7;
/* TWR: 2 Clock cycles */
SDRAM_Timing.WriteRecoveryTime = 2;
/* TRP: 15ns => 2x11.90ns */
SDRAM_Timing.RPDelay = 2;
/* TRCD: 15ns => 2x11.90ns */
SDRAM_Timing.RCDDelay = 2;
hsdram.Init.SDBank = FMC_SDRAM_BANK2;
hsdram.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
hsdram.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
hsdram.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
hsdram.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
hsdram.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
hsdram.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_3;
hsdram.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE;
hsdram.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1;
HAL_SDRAM_Init(&hsdram, &SDRAM_Timing);
На другой плате у меня запаяна память MT48LC16M16A2P-6A
Нажмите для просмотра прикрепленного файла
настроил ее так
CODE
hsdram1.Instance = FMC_SDRAM_DEVICE;
/* hsdram1.Init */
hsdram1.Init.SDBank = FMC_SDRAM_BANK2;
hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;//8
hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13;//12
hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;//16
hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_3;
hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE;
hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1;
/* Timing configuration for 90 MHz of SD clock frequency (180MHz/2) */
/* TMRD: 2 Clock cycles */
SdramTiming.LoadToActiveDelay = 2;//ok
/* TXSR: min=70ns (6x11.90ns) */
SdramTiming.ExitSelfRefreshDelay = 7;//ok
/* TRAS: min=42ns (4x11.90ns) max=120k (ns) */
SdramTiming.SelfRefreshTime = 4;//42-120
/* TRC: min=63 (6x11.90ns) */
SdramTiming.RowCycleDelay = 7;//ok
/* TWR: 2 Clock cycles */
SdramTiming.WriteRecoveryTime = 3;//12ns или clk + 6ns
/* TRP: 15ns => 2x11.90ns */
SdramTiming.RPDelay = 2;//18ns
/* TRCD: 15ns => 2x11.90ns */
SdramTiming.RCDDelay = 2;//18ns
HAL_SDRAM_Init(&hsdram1, &SdramTiming);
Проблема заключается в том, что при записи в память по нечетным адресам в четвертом разряде появляется единичка
то есть если записать
Код
*((uint32_t *)0xD0000000) = 1;
*((uint32_t *)0xD0000001) = 2;
*((uint32_t *)0xD0000002) = 3;
*((uint32_t *)0xD0000003) = 4;
*((uint32_t *)0xD0000001) = 2;
*((uint32_t *)0xD0000002) = 3;
*((uint32_t *)0xD0000003) = 4;
то прочитывается так 0x09 0x02 0x0B 0x04
подскажите, где искать ошибку?