Jump to content

    

Nowsan

Участник
  • Content Count

    8
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. Ваше имхо абсолютно верно, видимо, я ,когда даташит изучал, перепутал свою память, в которой 4 Мег х 16, с той, в которой 16 Мег х 4. Настройки инициализации поменял, но всё равно всё ещё не работает.
  2. Как я уже сказал, пользуюсь библиотекой 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. Чьих семинаров? Мне действительно очень интересно, не могли бы Вы дать ссылку на какой-нибудь из них?
  3. Спасибо большое за советы, проверю ещё разочек все настройки инициализации, после чего буду искать осцилографф. Будем думать, будем смотреть. Когда (если) решу проблему, обязательно напишу.
  4. Всё верно. На отладочной плате стоит 32-х разрядная sdram, а у меня 16. Да я это учёл. Я использую библиотеку HAL, так что вполне возможно она где-то косячит.
  5. В качестве основы я брал код для отладочной платы STM32F769I_EVAL (если у Вас есть на компе CobeMX и все библиотеки обновлены, то этот пример Вы можете найти тут ...\CubeMxRepository\STM32Cube_FW_F7_V1.15.0\Projects\STM32F769I_EVAL\Examples\FMC\FMC_SDRAM). МК на отладочной плате почти такой же как и на моей, только корпус разный. Также на платах разные микросхемы sdram, но, судя по даташитам, тайминги совпадают. Из осциллографов есть только Hantek 6074BC с полосой пропускания 70 МГц. И то ли у меня руки из одного места, то ли действительно ПО для данного осцилограффа не позволяет нормально снимать и сохранять данные с него для дальнейшего анализа.
  6. Сейчас решил всё ещё раз проверить и заметил несколько особенностей, которые не заметил ранее. Программа проверки sdram состоит в следующем: всевозможная инициализация, затем каждые две секунды буфер Tx (размер каждого элемента 2 байта) заполняется новыми значениями, потом этот массив отправляется на sdram и тут же считывается обратно в Rx буфер (размер каждого элемента 2 байта). Не знаю как я мерил вчера, но сейчас увидел активность на ножках WE и CS (рис. 1 и 2), правда непонятно почему на ножке CS активность постоянная. В режиме отладки проверил содержимое Rx буфера, и оказалось, что в нём значения равны последнему элементу Tx буфера, но если между записью и считыванием добавить задержку, скажем, 100 мс (рис. 3), то содержимое Rx буфера по нулям. Насчёт ногодрыга, с ним всё в порядке в плане частот. Мультиметром в режиме прозвонки проверил наличие сигнала от ножки МК до ножки sdram, с этим всё в порядке.
  7. С блокировочными конденсаторами, по питанию sdram действительно всё не так хорошо, как должно быть. Там есть две штуки 0805 под ней.
  8. Имеется плата с микроконтроллером STM32F769II и микросхемой sdram MT48LC4M16A2. Прошил мк тестовой программой. В ней на sdram записывается информация из одного буфера, а затем читается в другой. Проблема в том, что этого не происходит, второй буфер остаётся пустой. Сигналов WE и CS с помощью логического анализатора (макс. 24 МГц) не увидел. Простым "ногодрыгом" удостоверился, что ножки МК в принципе живые. Вопрос такой, может ли в данном случае неграмотная разводка платы (а в том, что она неграмотная сомневаться не приходиться) сделать устройство полностью неработоспособным. Устройство разведено на 4-х слойной печатной плате. В основном вся разводка выполнена на внутренних слоях, а значит почти у всех дорожек есть два переходных отверстия. Верхние два слоя залиты, насколько возможно, GND полигонами, два нижних слоя залиты VCC полигонами. Ещё есть такой момент, уже не касательно разводки ПП. Я заметил что всех отладочных платах от STM для тактирования МК используется кварц на 25 МГц, я же использую 10 МГц, при этом скорректировав все делители и умножители так, чтобы тактирование ядра и FMC совпадало с примерами, но вдруг всё же мистическим образом это не правильно и нужно использовать именно 25 МГц?