Jump to content

    
Sign in to follow this  
Николандр

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

Recommended Posts

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

 

Мы перешли на наших платах с 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);	
}
}

Edited by IgorKossak
[codebox] для длинного кода. [code]-для короткого!!!

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Делел проект на 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 у меня не заработал, только с другими файлами из примеров от этого же куба.

Share this post


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

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

 

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

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

 

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

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

Share this post


Link to post
Share on other sites
используют эту команду после записи

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

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

Edited by Genadi Zawidowski

Share this post


Link to post
Share on other sites
О какой команде речь?

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

 

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

Share this post


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

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

 

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

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites
А я посмотрел на гербера 429 дискавери и попытался переразвести нормально и наткнулся на проблемы с частотой и разводкой.

 

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

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

 

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

Edited by nanorobot

Share this post


Link to post
Share on other sites
BGA варианты не интересуют, т.к гербера BGA доступны у ST.

 

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

Share this post


Link to post
Share on other sites
Но я не представляю как можно воспользоваться гербер файлами.

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

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

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

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

 

 

 

Share this post


Link to post
Share on other sites
Попытался заказать плату в Тенхосвязь Екатеринбург. Не берутся.

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this