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

Изменение частоты SDRAM на LPC1788

Проект на LPC1788 + SDRAM. Необходимо в ходе работы изменить тактовую частоту CPU.

Так как SDRAM тактируется от клока CPU (с делителем /1 или /2), то и частота SDRAM поменяется. А значит - необходимо заново проинитить контроллер SDRAM (EMC). Но нужно это сделать не потеряв содержимого SDRAM.

А в даташите указано, что значения регистров управления EMC можно изменять только если EMC disabled или находится в idle.

Правильно ли я понимаю, что для этого достаточно обеспечить чтобы:

1) дождаться статуса "EMC is idle" в регистре EMC.STATUS;

2) установить бит "Low-power mode" в регистре EMC.CONTROL;

3) перестроить частоту CPU (PLL и т.п.) обспечив, чтобы в течение этого времени не было выборок кода или данных из SDRAM или прочих обращений к ней;

4) переинитить EMC для нового значения клока;

5) сбросить бит "Low-power mode" в регистре EMC.CONTROL.

Будет-ли производиться refresh памяти в течение пунктов 1...5?

Или может у кого-то есть правильная процедура переиницализации EMC для LPC17xx без потери данных в SDRAM?

Изменено пользователем haker_fox
Уточнил название темы, добавил теги, переместил в нужный раздел.

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


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

Вроде бы считается, что DRAM гарантированно хранит данные 64 мс без рефреша. Поэтому можно принудительно сделать рефреш во всех рядах. 64 мс должно хватить на изменение любых настроек. Потом снова принудительный рефреш, а дальше уже штатный режим.

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


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

Поэтому можно принудительно сделать рефреш во всех рядах. 64 мс должно хватить на изменение любых настроек. Потом снова принудительный рефреш, а дальше уже штатный режим.

Вот. А как это сделать принудительный рефреш? Вижу - среди команд SDRAM есть команда "AUTO REFRESH or SELF REFRESH (Enter self refresh mode)". Это оно?

И как её использовать? Как я понимаю SDRAM делает рефреш последовательно для каждой строки (в моём чипе их 8192) - дать 8192 раз эту команду? Или дать её и подождать какое-то время?

В регистре статуса есть бит "Self-refresh acknowledge", но как его использовать? Даташит молчит. :(

 

PS: Наверное можно дождаться idle-состояния EMC, установить регистр периода рефреша на минимальное значение, подождать 8192 этих периодов, перенастроить частоту, переинитить EMC, опять подождать 8192 минимальных периодов рефреша, установить нормальный период рефреша.

Тогда максимальное время на перестройку частоты составит == 64мс - 8192*мин_период_рефреша_строки*2. Может быть так?

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


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

А зачем изменяется частота, может можно обойтись без этого? Это энергосбережение что-ли какое-то?

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


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

Проект на LPC1788 + SDRAM. Необходимо в ходе работы изменить тактовую частоту CPU.

У sdram есть собственная команда глубокого сна. После такой команды не требуется внешний клок, можно вообще всё остановить. Но есно мк должен быть настроен на реген sdram силами самого sdram. Сейчас уже трудно найти чипы без таких функций.

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


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

Вот. А как это сделать принудительный рефреш? Вижу - среди команд SDRAM есть команда "AUTO REFRESH or SELF REFRESH (Enter self refresh mode)". Это оно?

Даташит на SDRAM читать не пробовали? Он говорит, что это Auto Refresh. Исполнить 8192 раз - и все ряды будут свежие.

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


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

Даташит на SDRAM читать не пробовали? Он говорит, что это Auto Refresh. Исполнить 8192 раз - и все ряды будут свежие.

Какой именно? Я их уже несколько скачал - нигде нет алгоритма и нет объяснения что такое "auto refresh" или "self refresh" и каким порядком их применять.

Как подать команду, какие нужны задержки и где и т.п.? Остаётся только гадать.

К тому же, как я понял, контроллер EMC в LPC17xx не умеет принудительно подавать команду "auto refresh" если судить по юзермануалу на LPC1788.

Есть только какой-то бит отвечающий за вход в "self refresh", но как им пользоваться, как туда входить и выходить??? В юзермануале ничего не нахожу. Поэтому и спрашиваю.

 

У sdram есть собственная команда глубокого сна. После такой команды не требуется внешний клок, можно вообще всё остановить. Но есно мк должен быть настроен на реген sdram силами самого sdram. Сейчас уже трудно найти чипы без таких функций.

Как его включить? Биты какие-то немного описаны, но не описан порядок использования.

Может быть так?:

1. Дождаться SDRAM idle (EMC.STATUS.BUSY == 0).

2. Выставить запрос входа в "self refresh" (EMC.DYNAMICCONTROL = 1 << 2). Но не понятно - остальные биты в 0 или как? Как быть с частотой EMCCLK на SDRAM - отключить или нет?

3. Дождаться "Self-refresh acknowledge" (EMC.STATUS.SA == 1).

4. Перевести EMC в режим "low power" (EMC.CONTROL.L = 1).

5. Здесь как я понимаю можно отключить EMCCLK и перепрограммировать частоту CPU. А SDRAM в это время будет сама от собственного внутреннего генератора обновляться?

6. Здесь можно перепрограммировать все конфигурационные регистры SDRAM?

7. Перевести EMC в режим "normal" (EMC.CONTROL.L = 0).

8. Выставить запрос выхода из "self refresh" (EMC.DYNAMICCONTROL = 0 << 2 | 1 << 1).

9. Дождаться "Self-refresh acknowledge" (EMC.STATUS.SA == 0).

Не уверен что всё так, что порядок верный. К тому же в конце процедуры инициализации SDRAM, ей надо подать несколько команд (с задержками между ними). Будут ли они работать когда чип SDRAM находится в "self-refresh"? Или вначале вывести из него?

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


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

Какой именно? Я их уже несколько скачал - нигде нет алгоритма и нет объяснения что такое "auto refresh" или "self refresh" и каким порядком их применять.

Почитайте AS4C16M16SA:

The AutoRefresh command is used during normal operation of the SDRAM and is analogous to CAS#-before-RAS# (CBR) Refresh in conventional DRAMs. This command is non-persistent, so it must be issued each time a refresh is required. The addressing is generated by the internal refresh controller. This makes the address bits a "don't care" during an AutoRefresh command. The internal refresh counter increments automatically on every auto refresh cycle to all of the rows. The refresh operation must be performed 8192 times within 64ms. The time required to complete the auto refresh operation is specified by tRC(min.). To provide the AutoRefresh command, all banks need to be in the idle state and the device must not be in power down mode (CKE is high in the previous cycle). This command must be followed by NOPs until the auto refresh operation is completed. The precharge time requirement, tRP(min), must be met before successive auto refresh operations are performed.

Мне кажется, вполне исчерпывающе описано.

 

К тому же, как я понял, контроллер EMC в LPC17xx не умеет принудительно подавать команду "auto refresh" если судить по юзермануалу на LPC1788.

Я не в курсе. У меня LPC4370. Там есть вот такая штука:

Dynamic Memory Auto-refresh Period register

This register enables you to program the auto-refresh period, and auto-refresh to active command period, tRFC. It is recommended that this register is modified during system initialization, or when there are no current or outstanding transactions. This can be ensured by waiting until the EMC is idle, and then entering low-power, or disabled mode. This value is normally found in SDRAM data sheets as tRFC, or sometimes as tRC. This register is accessed with one wait state.

Если LPC17xx это тоже умеет, то всё становится совсем просто.

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


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

Мне кажется, вполне исчерпывающе описано.

Если LPC17xx это тоже умеет, то всё становится совсем просто.

Я это видел - в стандартной процедуре инициализации SDRAM после включения есть:

EMC.DYNAMIC.CONTROL = B0 | B1 | 2 << 7; //Issue SDRAM PALL (precharge all) command

EMC.DYNAMIC.REFRESH = 2; //установка периода refresh == 32 такта

DelayCpuTimer(256); //задержка на 256 тактов

а после уже в EMC.DYNAMIC.REFRESH записывается штатное значение периода рефреш, равное 64мс/8192 == 7.8125мкс.

Т.е. - должно выполниться 8 циклов refresh, что соответствует рекомендациям из многих aplication notes о порядке инита SDRAM.

Вероятно таким образом можно и всю SDRAM обновить с помощью авторефреша установив в EMC.DYNAMIC.REFRESH = 1 - минимальное значение (16 тактов) и сделав задержку в 8192*16 тактов.

 

Значит видимо можно использовать или этот способ (авторефреш всей SDRAM, реинит, авторефреш всей SDRAM). Или self refresh как писал выше. Я так понимаю - для self refresh-а не нужно подавать клок на чип SDRAM?

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


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

Насколько я понимаю, достаточно просто считать. Помнится чтобы пропускную ОЗУ увеличить вообще регенерацию отключали, при непрерывном чтении.

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


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

Насколько я понимаю, достаточно просто считать. Помнится чтобы пропускную ОЗУ увеличить вообще регенерацию отключали, при непрерывном чтении.

Семён Семёныч! Прочитать что-то из каждого ряда. Кстати, да :cranky:

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


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

Семён Семёныч! Прочитать что-то из каждого ряда. Кстати, да :cranky:

auto refresh = act + pre

read = act + read + pre

 

ЗЫ. авто рефреш означает что адрес ряда берется из счетчика внутри памяти. Можно самому банки открывать и закрывать. Проще это делать в режиме чтения.

 

Я так понимаю - для self refresh-а не нужно подавать клок на чип SDRAM?

The SELF REFRESH command can be used to retain data in the SDRAM, even if the rest of the system is powered down. When in the self refresh mode, the SDRAM retains data without external clocking.

The SELF REFRESH command is initiated like an AUTO REFRESH command except CKE is disabled (LOW). Once the SELF REFRESH command is registered, all the inputs to the SDRAM become “Don’t Care” with

the exception of CKE, which must remain LOW. Once self refresh mode is engaged, the SDRAM provides its own internal clocking, causing it to perform its own AUTO REFRESH cycles. The SDRAM must remain

in self refresh mode for a minimum period equal to tRAS and may remain in self refresh mode for an indefinite period beyond that.

The procedure for exiting self refresh requires a sequence of commands. First, CLK must be stable (stable clock is defined as a signal cycling within timing constraints specified for the clock pin) prior to CKE going

back HIGH. Once CKE is HIGH, the SDRAM must have NOP commands issued (a minimum of two clocks) for tXSR because time is required for the completion of any internal refresh in progress

выйдите правильно потом

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


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

Семён Семёныч! Прочитать что-то из каждого ряда. Кстати, да :cranky:

Осталось угадать как распределены строки и столбцы по карте каждого конкретного чипа... Да ещё и все кеши перед этим не забыть сбросить...

 

ЗЫ. авто рефреш означает что адрес ряда берется из счетчика внутри памяти. Можно самому банки открывать и закрывать. Проще это делать в режиме чтения.

выйдите правильно потом

Да, наверное оптимальнее всего использовать "self refresh". Так и поступлю.

А если не получится - буду делать принудительный рефреш всего чипа выставив минимальный период авторефреша с последующей задержкой на время рефреша всех строк.

Спасибо, вроде стало более понятно :)

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


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

Вернулся к этому проекту. Провозился довольно долго, но всё-таки добился результата. ;)

Опишу вкратце результат, может кому поможет:

Реализовывал это дело на LPC1788. Старался получить идеальный вариант - Self Refresh. Прочие варианты с авторефрешем всей памяти и потом кратковременным отключением SDRAM без потери данных, оставил на случай если не получится сделать Self Refresh.

У LPC1788 в контроллере внешней памяти, судя по мануалу, есть возможность включить режим Self Refresh (регистр EMC.DYNAMIC.CONTROL бит 2), но мне так и не удалось добиться его включения с помощью EMC-контроллера. При использовании этого бита я почему-то получал последовательность команд Precharge, AutoRefresh и др. вместо Self Refresh. Что только ни делал. В мануале очень скудная инфа на этот счёт (т.е. - её почти нет). После аппаратного RESET-а МК, в EMC-контроллере стоит статус "Self Refresh" и после установки бита 2 в EMC.DYNAMIC.CONTROL в регистре статуса появляется индикация что SDRAM как будто в режиме Self Refresh. Но по факту я не вижу на шине соответствующей команды входа в Self Refresh. И содержимое SDRAM после этого через несколько секунд разрушается. Т.е. - EMC-контроллер считает Slef Refresh включен, а SDRAM так не думает.

 

После многих опытов удалось решить проблему вручную:

1.Дожидаюсь опустошения write-буферов (EMC.STATUS).

2.Выключаю авторефреш силами EMC-контроллера (EMC.DYNAMIC.REFRESH = 0).

3.Дожидаюсь завершения всех операций SDRAM (idle в EMC.STATUS).

4.Останавливаю операции по шине (EMC.DYNAMIC.CONTROL = B0 | B1 | 3 << 7). С включённым постоянно клоком и CKE==1.

5.Устанавливаю GPIO-состояния линий: CKE=1,CS=1,RAS=1,CAS=1,WE=1 и все их на вывод.

6.Переключаю линии CKE,CS,RAS,CAS,WE на GPIO (до этого они управлялись от EMC). Состояния на них не должны измениться при этом. CLK и другие линии (DQL, DQH, данных и адреса) оставляю подключенными к EMC.

7.Формирую с помощью GPIO команду "Вход в Self Refresh" (CKE=0,CS=0,RAS=0,CAS=0, WE-без изменений). Она защёлкивается ближайшим клоком CLK. Так как в этом МК все эти сигналы выведены на один порт, их можно изменить одной командой записи в порт. Если бы они были на разных портах, то и сигнал CLK надо было бы формировать через GPIO.

8.Выдержка времени нужное число клоков.

9.Теперь можно выключить клок и все линии, кроме CKE, использовать как угодно. CKE должна оставаться в низком состоянии. SDRAM уже в Self Refresh.

 

Выход из режима Self Refresh несложный: включить CLK, установить CKE=1, выдержать нужное число клоков (это будет команда INHIBIT, выводящая из Self Refresh), перевести CKE,CS,RAS,CAS,WE на управление от EMC. Ну и т.д.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...