Jump to content

    

Проблема подключения sdram к stm32

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.

тайминги1.PNG

тайминги2.PNG

Чьих семинаров? Мне действительно очень интересно, не могли бы Вы дать ссылку на какой-нибудь из них?

Share this post


Link to post
Share on other sites

имхо - hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_10; не правильно .

У вас же только 256 колонок в ряду. Дальше не смотрел.

Share this post


Link to post
Share on other sites
21 минуту назад, Lmx2315 сказал:

имхо - hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_10; не правильно .

У вас же только 256 колонок в ряду. Дальше не смотрел.

Ваше имхо абсолютно верно, видимо, я ,когда даташит изучал, перепутал свою память, в которой 4 Мег х 16, с той, в которой 16 Мег х 4. Настройки инициализации поменял, но всё равно всё ещё не работает.

перепуточки.PNG

Edited by Nowsan

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now