Nowsan 0 25 июня, 2019 Опубликовано 25 июня, 2019 · Жалоба 2 часа назад, Aner сказал: Тут много непонятно, начиная со схемы, которую не выложили, может там ошибка. Да разводка никакая с точки зрения правил разводки, но вполне может что то и работать. И таки ничего по вашей проге не написали, как конфигурили, как делители и тд. Для 10 мег тоже нужно все пересчитать правильно, учитывая всю структуру внутренних и наружных интерфейсов. Как то пересчитывал с 25 на 12 мгц, не все так хорошо получилось с Ethrenet10/100. Как я уже сказал, пользуюсь библиотекой HAL. Инициализация модуля sdram у меня выглядить следующим образом: hsdram1.Instance = FMC_SDRAM_DEVICE; /* hsdram1.Init */ hsdram1.Init.SDBank = FMC_SDRAM_BANK1; hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_10; hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12; hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_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_2; hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE; hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0; /* SdramTiming */ SdramTiming.LoadToActiveDelay = 2; SdramTiming.ExitSelfRefreshDelay = 6; SdramTiming.SelfRefreshTime = 4; SdramTiming.RowCycleDelay = 6; SdramTiming.WriteRecoveryTime = 2; SdramTiming.RPDelay = 2; SdramTiming.RCDDelay = 2; if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) { Error_Handler( ); } В Error_Hanlder программа не уходит. Затем идёт инициализация самой микросхемы памяти: __IO uint32_t tmpmrd =0; /* Step 1: Configure a clock configuration enable command */ Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; Command->AutoRefreshNumber = 1; Command->ModeRegisterDefinition = 0; /* Send the command */ res=HAL_SDRAM_SendCommand(hsdram, Command, 0xFFFF); /* Step 2: Insert 100 us minimum delay */ /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */ HAL_Delay(1); /* Step 3: Configure a PALL (precharge all) command */ Command->CommandMode = FMC_SDRAM_CMD_PALL; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; Command->AutoRefreshNumber = 1; Command->ModeRegisterDefinition = 0; /* Send the command */ res=HAL_SDRAM_SendCommand(hsdram, Command, 0xFFFF); /* Step 4 : Configure a Auto-Refresh command */ Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; Command->AutoRefreshNumber = 8; Command->ModeRegisterDefinition = 0; /* Send the command */ res=HAL_SDRAM_SendCommand(hsdram, Command, 0xFFFF); HAL_Delay(1); /* Step 5: Program the external memory mode register */ tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 | SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | SDRAM_MODEREG_CAS_LATENCY_3 | SDRAM_MODEREG_OPERATING_MODE_STANDARD | SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE; Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; Command->AutoRefreshNumber = 1; Command->ModeRegisterDefinition = tmpmrd; /* Send the command */ res=HAL_SDRAM_SendCommand(hsdram, Command, 0xFFFF); HAL_Delay(1); /* Step 6: Set the refresh rate counter */ /* (15.62 us x Freq) - 20 */ /* Set the device refresh counter */ hsdram->Instance->SDRTR |= ((uint32_t)((/*1292*/1539)<< 1)); Везде res возращает HAL_OK. Ошибку, связанную с тем, что выбрана другая микросхема памяти, я не вижу. Мои тайминги представлены на первом рисунке. На втором рисунке тайминги из рабочего примера для отладочной платы STM32F769I_EVAL. Чьих семинаров? Мне действительно очень интересно, не могли бы Вы дать ссылку на какой-нибудь из них? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 3 25 июня, 2019 Опубликовано 25 июня, 2019 · Жалоба имхо - hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_10; не правильно . У вас же только 256 колонок в ряду. Дальше не смотрел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nowsan 0 25 июня, 2019 Опубликовано 25 июня, 2019 (изменено) · Жалоба 21 минуту назад, Lmx2315 сказал: имхо - hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_10; не правильно . У вас же только 256 колонок в ряду. Дальше не смотрел. Ваше имхо абсолютно верно, видимо, я ,когда даташит изучал, перепутал свою память, в которой 4 Мег х 16, с той, в которой 16 Мег х 4. Настройки инициализации поменял, но всё равно всё ещё не работает. Изменено 25 июня, 2019 пользователем Nowsan Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться