Перейти к содержанию

STM32H7 работа с SDRAM. Проблема

Добрый день, форумчане!

 

Мы перешли на наших платах с STM32F429 на STM32H743. Сейчас пытаюсь оживить SDRAM (MT48LC16M16A2). Ввиду того, что регистры у FMC аналогичны (за исключением двух вещей: нет статусного сигнала BUSY и необходимо после настройки включать FMC в регистре FMC_BCR1), перетянул настройку SDRAM с контроллера STM32F4. Внутреннюю частоту (120 МГц) и частоту SDRAM (60 МГц) настроил точно также как и STM32F4. Повторюсь, снял с платы F4 и поставил H7 для освоения.

Пишу по 16 бит без burst режима. Ремап не делал. Пишу по адресу 0xC0000000 (банк 1 SDRAM) и добавляю смещение.

 

Но вот почему-то не хочет запускаться нормально FMC.

Обнаружил осциллографом:

1. Нет сигналов BA0, BA1 и UDQM, LDQM. Хотя пишу в каждый банк.

2. Сигналы RAS и CAS не имеют сдвига друг относительно друга. но может так и должно быть не знаю.

 

Экспериментально обнаружил, что если писать в 0х60000000 то сигналы появляются (кроме BA0), но всё равно не записать в SDRAM данные. В примерах на HAL вижу, что настраивают они банк2 минуя банк 1. Может там что-то не так с ним.

 

Кто-нибудь уже разбирался с темой STM32H7 и SDRAM? Буду признателен за любую помощь!

 

#define SDRAM_START_ADDR ((uint32_t) 0xC0000000)			// SDRAM bank1 area start address

static void fmc_SDRAM_Config(void)
{
FMC_Bank1->BTCR[0] &= ~(1 << FMC_BCR1_FMCEN_Pos);

FMC_Bank5_6->SDCR[0] = FMC_SDCR1_SDCLK_1 | FMC_SDCR1_CAS_1 | FMC_SDCR1_NB | FMC_SDCR1_MWID_0 | FMC_SDCR1_NR_1 | FMC_SDCR1_NC_0; 

uint8_t TMRD, TXSR, TRAS, TRC, TWR, TRP, TRCD;
TMRD = 2;
TXSR = 5;
TRAS = 5;
TRC = 4;
TWR = 4;
TRP = 2;
TRCD = 2;	
FMC_Bank5_6->SDTR[0] = (uint32_t) (((TMRD - 1) << FMC_SDTR1_TMRD_Pos) |
									((TXSR - 1) << FMC_SDTR1_TXSR_Pos) |
									((TRC - 1) << FMC_SDTR1_TRC_Pos) |
									((TRAS - 1) << FMC_SDTR1_TRAS_Pos) |
									((TRP - 1) << FMC_SDTR1_TRP_Pos) |			
									((TWR - 1) << FMC_SDTR1_TWR_Pos) |
									((TRCD - 1) << FMC_SDTR1_TRCD_Pos));						

FMC_Bank1->BTCR[0] |= (1 << FMC_BCR1_FMCEN_Pos);
}
static void fmc_SDRAM_Initialization_Sequence(void)
{
/*
	STEP 1: Clock enable command
*/
FMC_Bank5_6->SDCMR  = (uint32_t)((FMC_MODE_CLOCKCONFIG << FMC_SDCMR_MODE_Pos) |\
								(1 << FMC_SDCMR_CTB1_Pos) |\
								((1 - 1) << FMC_SDCMR_NRFS_Pos) |\
								(0 << FMC_SDCMR_MRD_Pos));

/*
	Delay = 1000 mks
*/
HAL_Delay(1);	

/*
	STEP 2: All Bank Precharge command
*/
FMC_Bank5_6->SDCMR  = (uint32_t)((FMC_MODE_PALL << FMC_SDCMR_MODE_Pos) |\
								(1 << FMC_SDCMR_CTB1_Pos) |\
								((1 - 1) << FMC_SDCMR_NRFS_Pos) |\
								(0 << FMC_SDCMR_MRD_Pos));
/*
	STEP 3: Auto refresh command (NRFS = TRC in SDCR1 register)
*/
FMC_Bank5_6->SDCMR  = (uint32_t)((FMC_MODE_AUTOREFRESH << FMC_SDCMR_MODE_Pos) |\
								(1 << FMC_SDCMR_CTB1_Pos) |\
								((8 - 1) << FMC_SDCMR_NRFS_Pos) |\
								(0 << FMC_SDCMR_MRD_Pos));

/*
	STEP 4: MRD register program:
	Mode Register = 0b0000 0100 0100 0 (CL = 2; M9 - Single Location Access)
*/
uint32_t  tmpmrd = (uint32_t)0x220;
FMC_Bank5_6->SDCMR  = (uint32_t)((FMC_MODE_LOADMODEREG << FMC_SDCMR_MODE_Pos) |\
								(1 << FMC_SDCMR_CTB2_Pos) |\
								((1 - 1) << FMC_SDCMR_NRFS_Pos) |\
								(tmpmrd << FMC_SDCMR_MRD_Pos));

/*
	STEP 5: Set refresh count
*/
FMC_Bank5_6->SDRTR = (FMC_Bank5_6->SDRTR & FMC_SDRTR_REIE) | (0x000001EF << 1);
}

void fmc_SDRAM_Init(void)
{
RCC->D1CCIPR |= (RCC->D1CCIPR & RCC_D1CCIPR_FMCSEL) | RCC_D1CCIPR_FMCSEL_1;	// FMC kernel clock source = per_pll2 = 120 MHz
RCC->AHB3ENR |= RCC_AHB3ENR_FMCEN;			// Enable the FMC interface clock

fmc_SDRAM_GPIOConfig();						

fmc_SDRAM_Config();

fmc_SDRAM_Initialization_Sequence();

}

int main(void)
{
Init_SoftwareModules();

fmc_SDRAM_Init();

uint32_t Address, Pattern;

while(1)
{
	Address = SDRAM_START_ADDR;
	Pattern = 0xAAAA;
	MemTest_WriteReadSDRAM(Address, Pattern, dbw16Bit);

	Address = SDRAM_START_ADDR + 0x4000;
	Pattern = 0xAAAA;
	MemTest_WriteReadSDRAM(Address, Pattern, dbw16Bit);

	Address = SDRAM_START_ADDR + 0x8000;
	Pattern = 0xAAAA;
	MemTest_WriteReadSDRAM(Address, Pattern, dbw16Bit);

	Address = SDRAM_START_ADDR + 0xC000;
	Pattern = 0xAAAA;
	MemTest_WriteReadSDRAM(Address, Pattern, dbw16Bit);	
}
}

Изменено пользователем IgorKossak
[codebox] для длинного кода. [code]-для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сам не делал, т.к. на моей плате NUCLEO-H743ZI SDRAM нет, но Вы можете глянуть, какие настройки производятся кубом. Я понимаю нелюбовь многих к этой софтине, но деваться некуда, других примеров просто нет.

Кроме того, в кубе есть примеры для платы STM32H743I_EVAL, на которой есть SDRAM чип. Можно там что-то подсмотреть.

 

Я тоже сижу, раскуриваю разные примеры по кубу и тамошним платам...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Процы сильно разные как по командам так и по архитектуре, замена пин то пин не пройдёт. Читайте изучайте даташит и различие архитектур, команд. Все похоже, но разное вплоть до длины команд их, ширины ригистров, адресации и тд. если у вас F4 и H7. Коррекций много, тупой заменой кода не пройдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Совместимость по пинам есть, по крайней мере H743 TQFP работает на плате F429 discovery. Но вот разводка SDRAM не позволяет получить не то что 133 мгц, а и 100Мгц тактовой.

А теперь вопрос- где можно посмотреть разводку TQFP H743 + SDRAM, работоспособную на 133 мгц, желательно в 4 слоях? BGA варианты не интересуют, т.к гербера BGA доступны у ST.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Делел проект на STM32F746G с SDRAM и видео выходом. SDRAM инитил куском либы из примеров, идущих с кубом-мх. Конкретно файл stm32746g_discovery_sdram.c (17 013 байт) но, как уже говорили, 133 там никак не получалось, и когда читал доку на H7xx то как запомнилось, выше 100 частоту SDRAM на нем тоже поднять нельзя. У меня на 100МГц плата в 4 слоя без особых ухищрений, единственно на что смотрели - чтоб длина проводника тактовой была не менее максимального из остальных адресов/данных/команд.

Из доки на F746

===

SDRAM waveforms and timings

• CL = 30 pF on data and address lines. CL = 10 pF on FMC_SDCLK unless otherwise

specified.

In all timing tables, the THCLK is the HCLK clock period.

– For 3.0 V≤VDD≤3.6 V, maximum FMC_SDCLK= 100 MHz at CL=20 pF (on

FMC_SDCLK)

===

да, про куб - на прямую проект им сгенеренный с SDRAM у меня не заработал, только с другими файлами из примеров от этого же куба.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Сам не делал, т.к. на моей плате NUCLEO-H743ZI SDRAM нет, но Вы можете глянуть, какие настройки производятся кубом. Я понимаю нелюбовь многих к этой софтине, но деваться некуда, других примеров просто нет.

Кроме того, в кубе есть примеры для платы STM32H743I_EVAL, на которой есть SDRAM чип. Можно там что-то подсмотреть.

 

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

На данный момент могу объяснить это только тем, что у Cortex-m4 трех этапный конвейер процессора, а Cortex-m7 он уже шести этапный. Во всех остальных принципах оптимизации процессоры идентичны. Так что пока вот так.

 

Небольшое уточнение к предыдущему сообщению.

Запись в SDRAM нужно сопровождать командой DSB (это я имел в виду). Данная команда выжидает пока процессор полностью выполнит все операции до этой команды и затем идет дальше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
используют эту команду после записи

О какой команде речь?

upd: увидел комментарий... Если Вам требуется вытолкнуть кэш (например перед запуском DMA) то для этого другие другие средства.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
О какой команде речь?

upd: увидел комментарий... Если Вам требуется вытолкнуть кэш (например перед запуском DMA) то для этого другие другие средства.

 

Это лишь моё объяснение, почему в Кубовских примерах на работу с SDRAM они используют команду DSB после записи. Может быть я ошибаюсь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Совместимость по пинам есть, по крайней мере H743 TQFP работает на плате F429 discovery. Но вот разводка SDRAM не позволяет получить не то что 133 мгц, а и 100Мгц тактовой.

А теперь вопрос- где можно посмотреть разводку TQFP H743 + SDRAM, работоспособную на 133 мгц, желательно в 4 слоях? BGA варианты не интересуют, т.к гербера BGA доступны у ST.

 

Вы запаяли H743 в F429 Discovery? SDRAM удалось запустить ? На какой частоте? Инициализация по сравнению с 429 сильно разнится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вы запаяли H743 в F429 Discovery? SDRAM удалось запустить ? На какой частоте? Инициализация по сравнению с 429 сильно разнится?

Не я. Информация отсюда http://www.cqham.ru/forum/showthread.php?3...3%EC%FF-STM32H7 пост №4

А я посмотрел на гербера 429 дискавери и попытался переразвести нормально и наткнулся на проблемы с частотой и разводкой.

Ссылки на код в теме есть- оттуда можно взять инициализацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А я посмотрел на гербера 429 дискавери и попытался переразвести нормально и наткнулся на проблемы с частотой и разводкой.

 

Наверное возможно и на этой плате произвести такую замену ...

http://starterkit.ru/html/index.php?name=s...view&id=120

 

Поспешил. H7 нет в таких корпусах.

Изменено пользователем nanorobot

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
BGA варианты не интересуют, т.к гербера BGA доступны у ST.

 

А меня интересуют. Но я не представляю как можно воспользоваться гербер файлами. Сделать по ним клон отладочной платы? Подсмотреть приемы разводки?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Но я не представляю как можно воспользоваться гербер файлами.

В первом приближении именно клон. Схема контроллер плюс SDRAM один в один от дискавери, гербера импортируются и обрезаются. Остальные цепи контроллера можно разводить в соответствии с новой схемой.

А иначе только вдумчивое курение

AN4803: High-speed SI simulations using IBIS and board-level simulations using HyperLynx SI on STM32 32-bit ARM® Cortex® MCUs

Скачивание IBIS модели контроллера и памяти и разводка с выравниванием длины в соответствии с моделями.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В первом приближении именно клон.

 

Попытался заказать плату в Тенхосвязь Екатеринбург. Не берутся.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Попытался заказать плату в Тенхосвязь Екатеринбург. Не берутся.

Ну да, в BGA оно намного дороже получается. Поэтому хотелось бы найти рабочую разводку на TQFP, хотя бы на 100 МГц. И еще непонятно как верифицировать разводку в железе. Гонять сутками тест памяти? Вот если бы шину SDRAM сделали 36 битную с контролем по Хеммингу с выпадание в трап по несовпадению кодов... Кто нибудь встречал такой АРМ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти