реклама на сайте
подробности

 
 
> Изменение частоты SDRAM.
jcxz
сообщение Jun 21 2016, 12:59
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Проект на 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?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Jun 21 2016, 13:22
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Вроде бы считается, что DRAM гарантированно хранит данные 64 мс без рефреша. Поэтому можно принудительно сделать рефреш во всех рядах. 64 мс должно хватить на изменение любых настроек. Потом снова принудительный рефреш, а дальше уже штатный режим.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 21 2016, 13:38
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Jun 21 2016, 19:22) *
Поэтому можно принудительно сделать рефреш во всех рядах. 64 мс должно хватить на изменение любых настроек. Потом снова принудительный рефреш, а дальше уже штатный режим.

Вот. А как это сделать принудительный рефреш? Вижу - среди команд SDRAM есть команда "AUTO REFRESH or SELF REFRESH (Enter self refresh mode)". Это оно?
И как её использовать? Как я понимаю SDRAM делает рефреш последовательно для каждой строки (в моём чипе их 8192) - дать 8192 раз эту команду? Или дать её и подождать какое-то время?
В регистре статуса есть бит "Self-refresh acknowledge", но как его использовать? Даташит молчит. sad.gif

PS: Наверное можно дождаться idle-состояния EMC, установить регистр периода рефреша на минимальное значение, подождать 8192 этих периодов, перенастроить частоту, переинитить EMC, опять подождать 8192 минимальных периодов рефреша, установить нормальный период рефреша.
Тогда максимальное время на перестройку частоты составит == 64мс - 8192*мин_период_рефреша_строки*2. Может быть так?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 21 2016, 20:22
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Jun 21 2016, 16:38) *
Вот. А как это сделать принудительный рефреш? Вижу - среди команд SDRAM есть команда "AUTO REFRESH or SELF REFRESH (Enter self refresh mode)". Это оно?

Даташит на SDRAM читать не пробовали? Он говорит, что это Auto Refresh. Исполнить 8192 раз - и все ряды будут свежие.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 22 2016, 06:08
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Jun 22 2016, 02:22) *
Даташит на SDRAM читать не пробовали? Он говорит, что это Auto Refresh. Исполнить 8192 раз - и все ряды будут свежие.

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

Цитата(AVI-crak @ Jun 22 2016, 01:08) *
У 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"? Или вначале вывести из него?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 22 2016, 07:44
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Jun 22 2016, 09:08) *
Какой именно? Я их уже несколько скачал - нигде нет алгоритма и нет объяснения что такое "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.

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

Цитата(jcxz @ Jun 22 2016, 09:08) *
К тому же, как я понял, контроллер 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 это тоже умеет, то всё становится совсем просто.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 01:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016