Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как SDRAM-память работает вместе с микроконтроллером?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
h0rr0rr_drag0n
Дано - у меня есть отладочная плата SK-AT91SAM9260-SIM300 от стартеркита (http://starterkit.ru/html/index.php?name=s...=view&id=28).
На ней стоит микроконтроллер - AT91SAM9260. К нему подключены две микросхемы - SDRAM память от самсунга (http://www.samsung.com/global/system/busin...trial_rev11.pdf).

Успешно сломал мозг, пытаясь понять как работает эта SDRAM-память, в частности, как она взаимодействует с микроконтроллером (AT91SAM9260) и как с ней работать программно. Ниже, много странных вопросов...

0) Где бы почитать про особенности организации работы SDRAM с CPU/МК? Где описано, как все эти номера строк и столбцов преобразовываются в обычные адреса, что происходит когда приложение хочет записать/прочитать что-то по какому-то адресу в SDRAM и так далее...?

1) Где узнать размер слова, которым память обменивается с микроконтроллером? Размер слова должен совпадать с разрядностью шины данных? Или же размер слова может произвольно варьироваться? Если да, то как его вычислить?

2) Количество строк и столбцов всегда жестко задается в даташите или же эти величины можно варьировать?

3) В документации на мою отладочную плату написано, что на ней установлено 64 Мб памяти. На самом деле там стоят 2 микросхемы по 256 мегабайт каждая. Они имеют 16-битную шину данных, но подключены к микроконтроллеру через 32-битную шину - D[0:15] к шине данных одной микросхемы и D[16:31] к шине данных второй. Таким образом, как я понял, младшие 16-бит слова физически лежат в одной микросхеме, а старшие в другой. Итак, я имею 256 Мб памяти на плате.
Еще, в документации написано, что память 4-х банковая, откуда я и получаю 64 мегабайта памяти. Но мне непонятно, откуда взялось это деление на банки и почему я не могу использовать сразу все 256 мегабайт??

4) Я правильно понимаю, что судя по описанию адресного пространства для AT91SAM9260 я могу обращаться к SDRAM, начиная с адреса 0x2 000 0000 и заканчивая адресом 0x2400 0000 (для 64Мб = 0x4000 000)? А трансляцией из подобных "обычных" адресов в номера строк и колонок занимается контроллер-SDRAM?


5) Есть ли какие-то особые требования к размещению исполняемого кода в SDRAM? Например, должен ли он располагаться в в начале строки, банка? Поясняю причину вопроса - у меня есть самосборное ядро линукса, несжатое. Заметил, что если его разместить в SDRAM по адресу 0x2040 0000, то оно грузится, если же по адресу 0x2000 8000, то оно не грузится. Какая может быть разница между этими двумя адресами для ядра? Ему не все ли равно, главное лишь бы места хватало и ничего не перекрывалось?
aaarrr
Цитата(h0rr0rr_drag0n @ Jan 23 2012, 00:47) *
0) Где бы почитать про особенности организации работы SDRAM с CPU/МК? Где описано, как все эти номера строк и столбцов преобразовываются в обычные адреса, что происходит когда приложение хочет записать/прочитать что-то по какому-то адресу в SDRAM и так далее...?

Соответствие физических адресов адресам вида банк-строка-столбец приведены в даташите на МК (см. 22. SDRAM Controller (SDRAMC)).

Цитата(h0rr0rr_drag0n @ Jan 23 2012, 00:47) *
1) Где узнать размер слова, которым память обменивается с микроконтроллером? Размер слова должен совпадать с разрядностью шины данных? Или же размер слова может произвольно варьироваться? Если да, то как его вычислить?

Размер слова может быть равен разрядности шины или же быть меньше её.

Цитата(h0rr0rr_drag0n @ Jan 23 2012, 00:47) *
2) Количество строк и столбцов всегда жестко задается в даташите или же эти величины можно варьировать?

Со стороны памяти жестко заданы. Со стороны контроллера можно варьировать, это нужно, чтобы иметь возможность работать с различными типами памяти.

Цитата(h0rr0rr_drag0n @ Jan 23 2012, 00:47) *
3) В документации на мою отладочную плату написано, что на ней установлено 64 Мб памяти. На самом деле там стоят 2 микросхемы по 256 мегабайт каждая...

256 мегабит, а не мегабайт. Всего 256*2/8=64 мегабайта.

Цитата(h0rr0rr_drag0n @ Jan 23 2012, 00:47) *
4) Я правильно понимаю, что судя по описанию адресного пространства для AT91SAM9260 я могу обращаться к SDRAM, начиная с адреса 0x2 000 0000 и заканчивая адресом 0x2400 0000 (для 64Мб = 0x4000 000)? А трансляцией из подобных "обычных" адресов в номера строк и колонок занимается контроллер-SDRAM?

Правильно.

Цитата(h0rr0rr_drag0n @ Jan 23 2012, 00:47) *
5) Есть ли какие-то особые требования к размещению исполняемого кода в SDRAM? Например, должен ли он располагаться в в начале строки, банка? Поясняю причину вопроса - у меня есть самосборное ядро линукса, несжатое. Заметил, что если его разместить в SDRAM по адресу 0x2040 0000, то оно грузится, если же по адресу 0x2000 8000, то оно не грузится. Какая может быть разница между этими двумя адресами для ядра? Ему не все ли равно, главное лишь бы места хватало и ничего не перекрывалось?

Никаких требований нет.
VladimirB
Цитата(h0rr0rr_drag0n @ Jan 23 2012, 00:47) *
Дано - у меня есть отладочная плата ...

0)Про SDRAM - на википедии и в книжках про основы электроники, цифровой смехотехники.
про номера столбцов и банки вообще можно не парится - их нужно указать лишь при инициализации контроллера памяти
используются прямые адреса, а контроллер сам их разложит на столбцы и банки
1)ARM - 32разрядный МП
2)жёстко
3)МБ - мегабайт, Мб - мегабит
две микросхемы по 256 мегабит образуют суммарно 512мегабит или 64мегабайта
xor.kruger
Можете еще посмотреть Atmel'овский апп-ноут под название "Using SDRAM on AT91SAM9 Microcontrollers", скачать можно по ссылке
sparcmaster
Цитата(h0rr0rr_drag0n @ Jan 23 2012, 00:47) *
4) Я правильно понимаю, что судя по описанию адресного пространства для AT91SAM9260 я могу обращаться к SDRAM, начиная с адреса 0x2 000 0000 и заканчивая адресом 0x2400 0000 (для 64Мб = 0x4000 000)?

Только правильно 0x2 000 0000 - 0x23FFFFFF.
_4afc_
Цитата(h0rr0rr_drag0n @ Jan 22 2012, 23:47) *
5) Есть ли какие-то особые требования к размещению исполняемого кода в SDRAM? Например, должен ли он располагаться в в начале строки, банка? Поясняю причину вопроса - у меня есть самосборное ядро линукса, несжатое. Заметил, что если его разместить в SDRAM по адресу 0x2040 0000, то оно грузится, если же по адресу 0x2000 8000, то оно не грузится. Какая может быть разница между этими двумя адресами для ядра? Ему не все ли равно, главное лишь бы места хватало и ничего не перекрывалось?


Варианта на мой взгляд два:
1. Загружаемый вами код с адреса 0x2000 8000 затирает собой часть загрузчика.
2. В загрузчике жёстко прописано грузить линукс с адреса 0x2040 0000 - надо перекомпилить загрузчик.
h0rr0rr_drag0n
Что ж, теперь мне стала понятна "магия" работы MCU с SDRAM и мозг больше не взрывается. Всем спасибо за ответы!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.