Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: External SRAM + ATmega***
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
pitter_3
Всем здрасте!!!

К ATmega128 надо подключить SRAM, раньше такого не делал, хочу избежать подводных камней, подскажите.


Использую ATmega128 на 16MHz
Буду использовать 64K-bit SRAM: 6264 (К537РУ17) в магазине сказали так, но на микрухе написано чё попало – белибирда.
Скорее всего: fast access time 85/100ns (max) возможно 70ns, но не уверен, т.к производителя не знаю.

(64K-bit хотя целиком столько мне не надо)
Использовать буду Normal Mode, т.е. 4096Internal SRAM, никаких заморочек с ATmega103 Compatibility mode мне не надо.



В силу того, что ATmega128 работает на 16MHz, а SRAM 85/100ns (70ns?) возникает вопрос, получится ли адекватная работа SRAM, даже если использовать wait-state.

Подскажите, какой wait-state использовать?


На какую защелку лучше обратить внимание? Какую серию смотреть?


НА ЧТО ЕЩЁ ОБРАТИТЬ ВНИМАНИЕ????

Заранее СПС.



Table 4. Wait States(1)

SRWn1 SRWn0 Wait States

0 0 No wait-states
0 1 Wait one cycle during read/write strobe
1 0 Wait two cycles during read/write strobe
1 1 Wait two cycles during read/write and wait one cycle before driving out new address
Aleksandr Baranov
Цитата(pitter_3 @ Feb 19 2010, 07:36) *

НА ЧТО ЕЩЁ ОБРАТИТЬ ВНИМАНИЕ????


Если используется WinAVR, обратить внимание на makefile и разрешить работу внешней память в какой-то ранней секции, например, init1.
pitter_3
А кто-нибудь подскажет по поводу wait-state?

В целом я вообще могу перефразировать вопрос:
Кто-нибудь работал с внешним SRAM + Atmega?
SysRq
Цитата(pitter_3 @ Feb 20 2010, 08:29) *
Кто-нибудь работал с внешним SRAM + Atmega?
Что вас смущает? Микросхему памяти сейчас не назову (дома схем нет). Память используется под хранение определенных данных, а не как основная, инициализирую поэтому из main(). У нас на интрефейсе внешней памяти еще ПЛИС сидит - разнесены по адресам. Ессно, все адреса выше внутренней SRAM МК для удобства.

CODE
// External SRAM page configuration:
// 1100h - 7FFFh / 8000h - FFFFh (FPGA / External SRAM)
// Lower page wait state(s): None
// Upper page wait state(s): 1r/w
void XMEM_initialize(void)
{
XMCRA = _BV(SRL2);

MCUCR |= (_BV(SRE) | _BV(SRW10));
}

#define XMEM_write(address, value) (*((uint8_t * const) (address))) = ((uint8_t) (value))
#define XMEM_read(address) (*((uint8_t * const) (address)))

Работает, ATMega128, 16MHz.
prottoss
Вот так делал я. См приложенные файлы. Правда там у меня 62256 но это не суть важно.
Регистр-защелку младших адресов ставить нужно с записью по высокому уровню. Серия может быть любая типа AC/ACT/HC/HCT.
В МК настроить работу внешней памяти с одним циклом ожидания. См. приложенные файлы.

Имейте ввиду, что из 8КБАЙТ памяти Вашей МК будет использоваться только старшие 4. Это связанно с тем, что младшие 4 КБ находятся в адресном пространстве внутренней SRAM МК. Вообще есть пути решения этой проблемы.

Рекомендую почитать перевод даташита на М128 на http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh128/2_1.htm
pitter_3
Всем спасибо.
Цитата(prottoss @ Feb 21 2010, 02:12) *
Имейте ввиду, что из 8КБАЙТ памяти Вашей МК будет использоваться только старшие 4. Это связанно с тем, что младшие 4 КБ находятся в адресном пространстве внутренней SRAM МК. Вообще есть пути решения этой проблемы.


6264 - 64Kbyte - 8k word x 8bit. Но Вашу мысль я понял. Спасибо.


Кстати, если я использую только одну микруху SRAM, то ведь можно же не использовать разбиение на Lower page & Upper page?
prottoss
Цитата(pitter_3 @ Feb 21 2010, 21:47) *
Кстати, если я использую только одну микруху SRAM, то ведь можно же не использовать разбиение на Lower page & Upper page?
Я не понял Вашего вопроса. Что такое Lower page & Upper page?
SysRq
Цитата(pitter_3 @ Feb 21 2010, 17:47) *
Кстати, если я использую только одну микруху SRAM, то ведь можно же не использовать разбиение на Lower page & Upper page?
Да.

--

Цитата(prottoss @ Feb 21 2010, 18:03) *
Что такое Lower page & Upper page?

m128_S0709.pdf, стр. 32:
Цитата
It is possible to configure different wait-states for different External Memory addresses. The
external memory address space can be divided in two sectors that have separate wait-state bits.
prottoss
Цитата(SysRq @ Feb 22 2010, 00:15) *
Ааа, да, точно. Забыл про это.
ae_
Цитата(pitter_3 @ Feb 21 2010, 22:47) *
Всем спасибо.


6264 - 64Kbyte - 8k word x 8bit. Но Вашу мысль я понял. Спасибо.


Кстати, если я использую только одну микруху SRAM, то ведь можно же не использовать разбиение на Lower page & Upper page?

Никуда не пропадут Ваши 4кбайт из 8кбайт внешней 6264 из-за маскирования внутренней RAM, достаточно выделить ещё один вывод РС5 под линию адреса А13, но никуда его не подключать. Это - единственный минус, недоступность использования одного вывода I/O для своих нужд. Взамен получаем непрерывное адресное пространство памяти:
0x0000 - 0x001F регистры R0-R31
0x0020 - 0x005F I/O
0x0060 - 0x00FF ext I/O
0x0100 - 0x10FF internal SRAM 4kbyte
0x1100 - 0x30FF external SRAM 8kbyte
Аналогично можно целиком использовать весь объём внешней памяти вплоть до 32кбайт (62256) не теряя при этом первые 4к из-за маскирования адресов. Подробнее - в datasheet, описание регистра XMCRB, "Using all Locations of External Memory Smaller than 64 KB".
Александр Куличок
защелку лучше использовать из быстродействующих серий (ACT, AHC) или из "советский" серии 1533. Ставить именно защелку: 373/573 или ИР22. (Приходилось видеть платы от игровых автоматов, на которых умудрились поставить 374 микросхему). При использовании серии НС могут быть ошибки при записи и считывании из памяти. Причем довольно редкие и нерегулярные. (Проверено на своем печальном опыте). Скорее всего, это было из-за бОльшего времени удержания в серии HC, так как ошибки не зависели от тактовой и циклов ожидания (мега держит данные 5нс)
Я в дополнение еще обычно активирую функцию bus keeper.
Цитата
достаточно выделить ещё один вывод РС5 под линию адреса А13, но никуда его не подключать. Это - единственный минус, недоступность использования одного вывода I/O для своих нужд.

В меге128 этого минуса нет. Линии A13-А15 при помощи XMCRB просто не подключаются к порту изнутри (при XMM2=XMM0=1; XMM1=0), поэтому нет смысла выводить неподключенную А13. Для подтверждения моих слов посмотрите, как реализовано считывание при размере памяти 64кБайта.
defunct
Цитата(pitter_3 @ Feb 20 2010, 07:29) *
А кто-нибудь подскажет по поводу wait-state?

wait-state для 70ns памяти с кварцем на 11.0592 -- 0.
Для 14.7456Mhz и выше - ws=1.

55ns и более быстрая память - при любой тактовой на которой способна работать мега - ws=0.
SysRq
Посмотрел м\с памяти у нас: U62H256A. Надо будет с 0 wait-state попробовать rolleyes.gif
wellcom
Цитата(prottoss @ Feb 21 2010, 03:12) *
Вот так делал я. См приложенные файлы. Правда там у меня 62256 но это не суть важно.
Регистр-защелку младших адресов ставить нужно с записью по высокому уровню. Серия может быть любая типа AC/ACT/HC/HCT.
В МК настроить работу внешней памяти с одним циклом ожидания. См. приложенные файлы.

Имейте ввиду, что из 8КБАЙТ памяти Вашей МК будет использоваться только старшие 4. Это связанно с тем, что младшие 4 КБ находятся в адресном пространстве внутренней SRAM МК. Вообще есть пути решения этой проблемы.

Рекомендую почитать перевод даташита на М128 на http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh128/2_1.htm

Подскажите пожалуйста, почему у Вас адрес ADDR0-ADDR7 подключены к выводам А0-А7 чипа UT62256, а ADDR8-ADDR15 как то непонятно, куда попало. Вы используете весь обьем памяти? (не пинайте. только начал разбираться с внешней памятью, и вообще с памятью...)
lisstret
Хороший пример в этом случае это модуль WIZ200 WEB. Там как раз ATMEGA128+HY62256 и WIZ5300) Схемы есть, есть программный код от производителя. Так что глазами пробежаться можно подглядеть.

http://www.efo.ru/doc/Wiznet/Wiznet.pl?2935

У меня больше другой вопрос. Как сделать так, чтоб во внешний СРАМ загружались данные программы. То есть, допустим есть проект, в котором память данных занимает 8 КБ. Соответственно 4 КБ во внутреннем ОЗУ и остальные 4 КБ получается помещаются только во внешний ОЗУ. Но перед запуском прошивки нужно же настроить интерфейс внешнего СРАМА, указав в каких-то регистрах 128МЕГИ, что мы используем внешний срам с такий wait-state и т.д. После этого должна начать запускаться основная программа которая и выгрузит из FLASH'a данные во внешний СРАМ. Так вот, тут над бутлоэдер писать или что-то наподобе него, чтоб он настроил доступ 128МЕГИ к внешнему СРАМУ? Надеюсь понятно сказал, а то я особо объяснять не умею)
ReAl
Цитата(lisstret @ Jan 22 2013, 06:51) *
Как сделать так, чтоб во внешний СРАМ загружались данные программы.
Никаких бутлоадеров не нужно, просто надо как можно раньше включить интерфейс внешней памяти.
Для avr-gcc (WinAVR, AVR-STUDIO 6 с еёйным toolchain и т.д.) нужно поместить короткий код в секцию памяти кода .init3, которая выполнится до копирования инициализированных данных из флеша в ОЗУ и до очистки bss (в .init1 тоже можно, но осторожнее).
У меня это макросами
Код
#define INIT_CODE(_number_,_name_)\
    static void init_##_number_##_##_name_ (void) __attribute__ ((section(".init" #_number_), naked, used));\
    static void init_##_number_##_##_name_ (void)

#define INIT_CODE_(n,l) INIT_CODE(n,l)
#define INIT(_number_) INIT_CODE_(_number_,__LINE__)
и где-то в программе такое:
Код
INIT(3)
{
    MCUCR = (1 << SRE);
    XMCRA = (4 << SRL0) | (0 << SRW00);
    XMCRB = (1 << XMBK);
}


В других компиляторах надо смотреть в сторону __low_level_init() и подобного, такая функция, по идее, должна вызываться до инициализации памяти. Но она уже будет вызываться, так что стек должен быть во внутренней памяти (что и так желательно для большей скорости работы). В случае с init-секциями код выполняется линейно, без вызовов и стек не нужен.
lisstret
Спасибо! Видимо, зря я не особо заглядывал в документацию на компилятор. Сейчас посижу поразбираюсь, как распределить данные по адресному пространству внутренного озу и внешнего
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.