Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема с SDRAM STM32F429
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Atlantis-
Здравствуйте!
На макетной плате 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;


то прочитывается так 0x09 0x02 0x0B 0x04

подскажите, где искать ошибку?
kolobok0
Цитата(Atlantis- @ May 13 2015, 09:48) *
...подскажите, где искать ошибку?


тупой вопрос...
а пытались проверять разводку-пайку-кз ?
KSN
Макетная плата - собственной разработки или покупная? Качество пайки проверяли?
Atlantis-
Цитата(KSN @ May 13 2015, 09:59) *
Макетная плата - собственной разработки или покупная? Качество пайки проверяли?

собственной разработки. никогда раньше не работал с SDRAM, не совсем понимаю что нужно проверять. Линии данных - при записи по четным адресам корректно работают, читается то что пишется.
Распиновка микросхем одинаковая, только у меня добавляется линия A12
Golikov A.
Очень похоже на КЗ каких-то линий
собственно младшей линии адреса на 4 бит данных (наиболее вероятно), но могут быть и другие варианты

пропишите в память все 0 и считайте
пропишите все 0xFFFFFF... и считайте
пропишите все 0xAAAAA... и считайте
пропишите все 0x55555... и считайте
значение адреса
значение реверса, то есть в 0 адрес макс значение, а в максимальный адрес 0

стандартные тесты памяти, по ним можно будет понять что происходит (скорее всегоsm.gif)
Atlantis-
пропаял D3 - заработало))) но по четным то адресам писал правильно! от А0 до D0-D3 очень далеко, почти на противоположных сторонах процессора.
сейчас буду тестить...

пишу нули
Код
for(uint32_t i=0; i<33554430;i++)
{
    *((uint32_t *)(0xD0000000+i)) =0;
}


на последнем адресе (0хD1FFFFFD) улетает в Hardfault, 3 байта почему то не дописывает
Golikov A.
Цитата
А0 до D0-D3 очень далеко, почти на противоположных сторонах процессора.


может в кристалле памяти они близко, нога то в воздухе висела, мало ли что на нее наводилось

последний адрес не может быть FD вы же пишите по 4 байта, потому и вылетаете за границы

у вас адреса должны быть
0 4 8 ... и так далее... или пишите через
*((uint8_t *)(0xD0000000+i)) =0;


а если совсем крассиво то надо делать так

Цитата
int32_t * pointer = (int32_t *)0xD0000000;

while (pointer < (int32_t *)0хD2000000)
*pointer++ = pointer;


ну или что-то вроде...
Atlantis-
спасибо, теперь все работает правильно!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.