реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> проблема с SDRAM STM32F429
Atlantis-
сообщение May 13 2015, 06:48
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Здравствуйте!
На макетной плате 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

подскажите, где искать ошибку?

Сообщение отредактировал Atlantis- - May 13 2015, 06:50
Go to the top of the page
 
+Quote Post
kolobok0
сообщение May 13 2015, 06:59
Сообщение #2


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



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


тупой вопрос...
а пытались проверять разводку-пайку-кз ?
Go to the top of the page
 
+Quote Post
KSN
сообщение May 13 2015, 06:59
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Макетная плата - собственной разработки или покупная? Качество пайки проверяли?
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение May 13 2015, 07:08
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



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

собственной разработки. никогда раньше не работал с SDRAM, не совсем понимаю что нужно проверять. Линии данных - при записи по четным адресам корректно работают, читается то что пишется.
Распиновка микросхем одинаковая, только у меня добавляется линия A12
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 13 2015, 07:20
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Очень похоже на КЗ каких-то линий
собственно младшей линии адреса на 4 бит данных (наиболее вероятно), но могут быть и другие варианты

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

стандартные тесты памяти, по ним можно будет понять что происходит (скорее всегоsm.gif)
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение May 13 2015, 08:38
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



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

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


на последнем адресе (0хD1FFFFFD) улетает в Hardfault, 3 байта почему то не дописывает
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 13 2015, 09:27
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
А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;


ну или что-то вроде...
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение May 13 2015, 10:52
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



спасибо, теперь все работает правильно!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 01:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01447 секунд с 7
ELECTRONIX ©2004-2016