Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: xmega128a1 + sdram
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
bekor
возникла необходимость внешней памяти на xmega128a1
под рукой есть 8 штук SDRAM 8Mx8 byte (MT48LC8M8A2)
подскажите пожалуйста можно ли этот SDRAM присобачить к xmega128a1 ???
в даташите на мк написано что организация памяти должна быть 4 битная для SDRAM
а у меня вроде 8 битная 05.gif
prottoss
Цитата(bekor @ Jan 10 2011, 04:39) *
в даташите на мк написано что организация памяти должна быть 4 битная для SDRAM
а у меня вроде 8 битная 05.gif

XMEGA A MANUAL (Rev H) ->24. EBI - External Bus Interface -> 24.8 SDRAM Configuration

Chip Select 3 on the EBI can be configured from SDRAM operation, and the EBI must be config-
ured for 3-Port or 4-Port interface. The SDRAM can be configured for 4-bit or 8-bit data bus, and
4-Port interface must be used for 8-bit data bus.
The SDRAM interface signals from the EBI to
the SDRAM is listed in Table 24-2 on page 273.
Duhas
вся проблема что в А1 нету 4-х портов под EBI...
bekor
вот досада а 05.gif

скажите пожалуйста а достать 4 битную SDRAM очень трудно ?
на компютерный планках памяти вообше бывают 4 битные или там только 8 и 16 ???

мне нужно иметь как минимум 8МБ памяти,
этот вопрос решаемый или прийдется брать другую иксмегу ?
а кстати на каких моделях есть 4 порта под EBI ?
prottoss
Цитата(Duhas @ Jan 10 2011, 16:02) *
вся проблема что в А1 нету 4-х портов под EBI...
Да, на самом деле, для А1 только три портаsad.gif Не понятно нахрен они так сделали - тем паче что чипы 100-выводные...
Duhas
хрен их разбери.. в спецификации семейства А есть слова о четырехпортовой конфигурации... в принципе мона часть адреса выставлять не железом а софтом..

могет атымел готовит линейку А0.. иль еще чего ..

ну можно наверно и по извращаться.. с помощью одного из битов адреса менять мультиплексором местами 4 бита.. только надо подумать как правильно это сделать..
prottoss
Цитата(bekor @ Jan 10 2011, 16:28) *
вот досада а 05.gif

скажите пожалуйста а достать 4 битную SDRAM очень трудно ?
Я не спец по SDRAM sm.gif но судя по даташитам, опять же, не вижу проблем подключить 8-битную как 4-битную. Просто не подключать старшие-младшие 4 бита.... Если, конечно, нет ограничений на количество (цену?) используемых чипов памяти.
bekor
Цитата(prottoss @ Jan 10 2011, 14:22) *
Я не спец по SDRAM sm.gif но судя по даташитам, опять же, не вижу проблем подключить 8-битную как 4-битную. Просто не подключать старшие-младшие 4 бита.... Если, конечно, нет ограничений на количество (цену?) используемых чипов памяти.


тоесть вы хотите сказать что если цеплять туда 8 битную память то единственной проблемой будет
то что использовать можно будет только половину памяти ?
prottoss
Цитата(bekor @ Jan 10 2011, 20:21) *
тоесть вы хотите сказать что если цеплять туда 8 битную память то единственной проблемой будет
то что использовать можно будет только половину памяти ?
Да.
Вы даташит какойнить хоть мельком открывали?sm.gif
Duhas
ну если пол объема хватает - то не проблема ..
bekor
вот здорово yeah.gif

есть еще вопросы
генератор кода в CVAVR требует ввести кучу параметров для всяких там задержк,
но не знаю откуда брать эти цыфры, в даташите на память их вроде небыло.
и еше как обяснить компилятору чтоб большие массивы хранить во внешней памяти а
все остальные глобальные переменные во внутреннюю память ?
Нажмите для просмотра прикрепленного файла
Duhas
по задержкам мона порыть ДШ.. там должны быть времена доступа и т.д.. но память у вас я думаю много скоростнее хмеги.. так что задержки мона и по нулям... задержку инициализации - я бы поглядел в ДШ...

ну и на край мона минимальные задержки везде выставить...
bekor
а что на счет row bits, column bits,
и SDRAM self refresh ??

а еще компилятор ругается что только первые 64КБ будет использоваться с прямым доступом
потому что указатели 16 битные

это значит что для доступа к памяти придется вручную писать функции какие то ?
Duhas
это смотрите в ДШ на память там слово в слово такие же параметры... кол-во столбцов и строк.. точнее их адресных битов...

ко тому как там ваш компилятор будет пользовать и прочее - не ко мне )
KKV2003
Меня лично их EBI-нутая система шин не порадовала и я под свой проект сделал подпрограммы управления SDRAM без всякой кривой аппаратной поддержки шины. Не так уж и сложно подергать ножками - скорости вроде хватает. Конечно, не сильно быстро получается ( по сравнению с аппаратным потоковым доступом на 50 МГц ), но "программное" потоковое чтение-запись в burst-режиме SDRAM вполне резко работает. А поскольку через EBI ATxMega работает без поддержки burst ( насколько я понял ), то и я ничего не теряю. И никаких заморочек с DMA не приходится придумывать... У меня просто данные валятся снаружи по 8 бит и прямо в SDRAM rolleyes.gif
В другом проекте на ATxMega мы подключили 4-х битную SDRAM - тоже весьма резко качает ( 2 цикла чтения полубайт = чтение байта ).

Насколько я понял, row bits - количество разрядов адреса для строк, column bits - то же для адресации внутри строки.
SDRAM self refresh - наверняка признак использования самостоятельной регенерации памяти ( хотя может быть и какой-нибудь режим указать придется, кто бы его читал ). Но в своем проекте я эту регенерацию использую ( самому морочиться с ручной регенерацией - не обязательно ). Считал/записал и перевел память обратно в режим само-ренегерации ( он же спящий режим )... santa2.gif
bekor
Подключил SDRAM (16M x 8) заработало сразу! rolleyes.gif

но есть две проблемы:

1. компилятор видит только первые 64КБ.
2. если поднести руку к микросхеме памяти уже на расстоянии 1см, контроллер сбросывается.

p.s. керамический кондер 100n у памяти между Vdd и Vss присутствует,
неиспользуемый полубайт а так же все остальные неиспользованные ноги оставил в воздухе,
может от этого происходит сброс ???
prottoss
Цитата(bekor @ Jan 14 2011, 19:00) *
Подключил SDRAM (16M x 8) заработало сразу! rolleyes.gif

но есть две проблемы:

1. компилятор видит только первые 64КБ.
2. если поднести руку к микросхеме памяти уже на расстоянии 1см, контроллер сбросывается.

p.s. керамический кондер 100n у памяти между Vdd и Vss присутствует,
неиспользуемый полубайт а так же все остальные неиспользованные ноги оставил в воздухе,
может от этого происходит сброс ???

1. В настройках проекта разрешите внешнюю шину памяти и укажите ее количество.
2. Конечно же нужно было подтянуть неиспользуемые линии данных к напряжению питания. Так же поступить и с остальными не используемыми входами... Очень может влиять разводка платы на помехоустойчивость.
bekor
Цитата(prottoss @ Jan 14 2011, 15:23) *
1. В настройках проекта разрешите внешнюю шину памяти и укажите ее количество.

это я и делаю но компилер грит типа немогу исползовать больше 64КБ памяти потомучто у меня указатели 16 битные.


Цитата(prottoss @ Jan 14 2011, 15:23) *
2. Конечно же нужно было подтянуть неиспользуемые линии данных к напряжению питания. Так же поступить и с остальными не используемыми входами... Очень может влиять разводка платы на помехоустойчивость.


эту проблему я тоьк что решил,
надо было CS заземлить rolleyes.gif

Нажмите для просмотра прикрепленного файла
prottoss
Цитата(bekor @ Jan 14 2011, 19:33) *
это я и делаю но компилер грит типа немогу исползовать больше 64КБ памяти потомучто у меня указатели 16 битные.
Модель LARGE или HUGE нуна сделать

Код
#pragma location = 0x0100000
__no_init char membase[1024];

void main(void)
{    
      int i = 0;
    while(1)
          membase[i] = (char)(i++);
}

Компилируется без проблем (IAR 5.30)

Цитата(bekor @ Jan 14 2011, 19:43) *
Я же говорю - у Вас модель памяти - SMALL
bekor
Цитата(prottoss @ Jan 14 2011, 15:50) *
Модель LARGE или HUGE нуна сделать


сделал LARGE но не помогло 05.gif
KKV2003
А как насчет Huge-модели? Может пример от Atmel-а скомпилять? Они там все под эту модель.

Хотя у меня лично были очень большие проблемы с Huge-моделью памяти. Пока не отказался от нее, не работали простейшие вещи ( передача параметров в процедуру, циклы )... smile3046.gif
bekor
huge модели там нету
там только small, medium и large

уауууууу нашел заводской пример для SDRAM в папке с компилятором yeah.gif
ща попробую разобраться...
bekor
разобрался rolleyes.gif
Код
/* External memory >64k write function */
void mem_write(unsigned long addr, unsigned char data)
{
unsigned char s,r;
s=SREG;
#asm("cli")
r=RAMPX;
RAMPX=((unsigned char *) &addr)[2];
*((unsigned char*) addr)=data;
RAMPX=r;
SREG=s;
}

/* External memory >64k read function */
unsigned char mem_read(unsigned long addr)
{
unsigned char s,r,data;
s=SREG;
#asm("cli")
r=RAMPX;
RAMPX=((unsigned char *) &addr)[2];
data=*((unsigned char*) addr);
RAMPX=r;
SREG=s;
return data;
}

работает !

но скорость чтения и записи не очень радует.
максимальная скорость получаеться примерно 100КБ/с при минимальных задержках в настройках EBI

это нормально или можно добиться большей скорости ?
KKV2003
Цитата(bekor @ Jan 14 2011, 18:16) *
разобрался rolleyes.gif
Код
/* External memory >64k write function */

}

работает !

но скорость чтения и записи не очень радует.
максимальная скорость получаеться примерно 100КБ/с при минимальных задержках в настройках EBI

это нормально или можно добиться большей скорости ?

Вообще чтение из SDRAM происходит примерно за 7-8 тактов периферийной шины. А уж ее скорость задается пользователем. Если ядро запустить на 32 МГц и использовать удвоение частоты периферийной шины, то SDRAM будет работать на 64 МГц. И на чтение будет уходить порядка 100-150 нСек, что весьма не плохо.
"Курите" документацию по генераторам xMega - там много интересного. Свой проект я "выкурил" из этого атмеловского примера...
bekor
Спасибо,
буду разбираться, хотя у меня и сейчас 32MHz
bekor
вот настроил процессор на 32МГц а периферию на 64МГц
скорость работы SDRAM поднялась с 100КБ/с до 160КБ/с
но всеравно мало...
мне нужно хотябы 500КБ/с

что еще можно придумать ?

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



ууу разобрался [CENSORED] 08.gif
вся проблема была в том что основное времья жрало не само чтение а вызов функции чтения,
вынул эти строки из функции и прям в цикл в место вызова запихнул и скорость поднялась до 580КБ/с

теперь осталось разобраться с глобальным отключением прерываний,
непонятно зачем оно вообше нужно если обращение к SDRAM производиться апаратными средствами EBI ?
KKV2003
Поздравляю с успехом. А с прерываниями вряд-ли подскажу, ибо их аппаратным доступом не пользуюсь... Может доку их "докурить"? blush.gif
bekor
спасибо, rolleyes.gif
с прерыванием тоже разбирусь как нибудь,
точнее пока что проблем не выявилось с этим
пока все нормально работает...
bekor
возможно ли писать этот кусок кода на ассемблере чтобы уменьшить время его выполнения ?
Код
unsigned char s,r,data;

s=SREG;
#asm("cli")
r=RAMPX;
RAMPX=((unsigned char *) &addr)[2];
data=*((unsigned char*) addr);
RAMPX=r;
SREG=s;
demiurg_spb
Цитата(bekor @ Feb 4 2011, 15:49) *
возможно ли писать этот кусок кода на ассемблере чтобы уменьшить время его выполнения ?
Код
unsigned char s,r,data;

s=SREG;
#asm("cli")
r=RAMPX;
RAMPX=((unsigned char *) &addr)[2];
data=*((unsigned char*) addr);
RAMPX=r;
SREG=s;


Возможно всё. Что за компилятор?
Можно ассемблерную вставку написать, либо в отдельном nnn.S файле написать асмовую функцию.
bekor
Цитата(demiurg_spb @ Feb 6 2011, 13:01) *
Возможно всё. Что за компилятор?

CodeVisionAVR rolleyes.gif
demiurg_spb
Цитата(bekor @ Feb 6 2011, 20:19) *
CodeVisionAVR rolleyes.gif

тогда асмовые вставки выглядят примерно так:
Код
    #asm
       ld   r30,y+
       ld   r31,y+
       adiw r30,0
    #endasm
Напишите то что нужно Вам и будет счастье...

Вы с asm для AVR знакомы?

http://www.atmel.com/dyn/resources/prod_do...nts/doc0856.pdf
http://www.atmel.com/dyn/resources/prod_do...nts/doc1022.pdf
http://www.avr-asm-download.de/beginner_en.pdf
zombi
Цитата(bekor @ Feb 4 2011, 15:49) *
возможно ли писать этот кусок кода на ассемблере чтобы уменьшить время его выполнения ?

Может для начала посмотреть как на асме выглядят эти процедуры после кодевижона.
И тогда подумать можно ли их ускорить.
Цитата(bekor @ Jan 18 2011, 00:42) *
и еше вопрос, почему перед чтением в этих функциях глобально запрешаются прерывания ?

Я тоже не понимаю зачем прерывания запрещать.
Возможно для того чтобы эти фукции были атомарны и также как LDS,STS не прерывались.
bekor
Цитата
Напишите то что нужно Вам и будет счастье...

хочу читать байт по заданному адресу с SDRAM.
Цитата
Вы с asm для AVR знакомы?

К сожалению с ASM не дружу.
Цитата
как на асме выглядят эти процедуры после кодевижона

Вот это
Код
         sx1=SREG;
         #asm("cli")
         rx1=RAMPX;
         RAMPX=((unsigned char *) &addr_a1)[2];
         vdac_a1=*((unsigned char*) addr_a1);
         RAMPX=rx1;
         SREG=sx1;
         addr_a1++;

компиль превратил в это:

Код
;         sx1=SREG;
_0x84:
    IN   R3,63
;         #asm("cli")
    cli
;         rx1=RAMPX;
    IN   R2,57
;         RAMPX=((unsigned char *) &addr_a1)[2];
    __GETB1MN _addr_a1,2
    OUT  0x39,R30
;         vdac_a1=*((unsigned char*) addr_a1);
    LDS  R26,_addr_a1
    LDS  R27,_addr_a1+1
    LD   R13,X
;         RAMPX=rx1;
    OUT  0x39,R2
;         SREG=sx1;
    OUT  0x3F,R3
;         addr_a1++;
    LDI  R26,LOW(_addr_a1)
    LDI  R27,HIGH(_addr_a1)
    CALL __GETD1P_INC
    __SUBD1N -1
    CALL __PUTDP1_DEC
zombi
Цитата(bekor @ Feb 7 2011, 10:47) *
Вот это
.
компиль превратил в это:
.

Мдаааа...
Лишний раз убедился что если нужно быстродействие нужно на асме писать.
Помочь это ускорить не смогу т.к. не знаком с кодевижоном и никогда не писал на СИ для мк.

З.Ы. А вот это макросы чтоли?
__GETB1MN _addr_a1,2
__SUBD1N -1

UraGun
Сейчас вожусь с тем же самым. По моему твёрдому убеждению после прокуренной доки на эксмегу, и закупленных непонятно зачем на радиорынке SDRAM планок с 8ми и 16 битными микросхемами, нашел тайминги в доке на эксмегу. там четко показано последовательное вычитывание двух тетрад по одному адресу. А значит, при подключении 8ми битной микросхемы, траблов не будет, но и работать не будет тоже. т.к. вместо двух тетрад, расположенных по одному адресу будут вычитываться два последовательных адреса. За сим возня с 8ми и 16 битными кристаллами была отложена. Закупил за бугром 100 штук MT48LC32M4A2-7EG. Это именно то, что нужно, все 128 кбит при 4х разрядах данных. Щас как раз собираю макет. Кстаит, не только я применил эту память, вот эти ребятки тоже :
http://alvidi.de/avr_xmodul_V2_0_en.html
но у них пол памяти только, потому что 16 микросхема.
Кстати они весьма любезно выложили и схему :
http://alvidi.de/data_sheets/avr_xschematic_V2_0.pdf
Успехов, коллеги.

ЗЫ памятью могу поделиться. 5$/шт, остправлю в любой город куда ходят поезда из Запорожья. Без проблем скажем по 10 штучек, кому нужно. Мне пока столько не выработать. Пишите, звоните, если что +380-6666666-82 Михаил.
korobov_michael
Добрый день. У меня дополнительный вопрос по работе со SDRAM.

Стоит связка ATxmega128A1+MT48LC16M4A2P-75:G. Тесты прошли нормально, память с контроллером работает. Однако, когда контроллер при отладке попадает в breakpoint, и находится в стопе какое-то время, содержимое SDRAM разрушается. Компилятор и отладчик от ИАРа. Знает ли кто-нибудь, есть ли возможность как-то настроить отладчик, чтобы даже в стопе от EBI шли команды refresh на SDRAM? А то задолбался, чес-слово! К тому же думаю, что на ARM'ах, которые предназначены для работы со SDRAM, эта проблема ну уж точно должна была быть решена

Спасибо.
KKV2003
Сильно сомневаюсь, чтобы можно было бы тормознуть процессор с сохранением работоспособности памяти если это не заложено автоматически. Когда к памяти не производится обращение, то на нее можно ( нужно ) подавать команду SelfRefresh, то есть самостоятельной регенерации. В этом режиме ей даже тактовых импульсов подавать не надо. Но вот как действует EBI-контроллер - я не знаю совершенно.

Есть подозрение, что можно вручную контроллеру памяти указывать перейти в режим SelfRefresh - тогда даже если проц тормознется, то содержимое оперативки должно сохраняться. Хотя пока наши люди такой возможности не нашли. Да и отладчиком пока xMeg-у не мучили. Может и мы с таким столкнемся. Может быть Вам тоже не тормозить процессор - использовать другие методы отладки?

P.S. При работе с SDRAM без использования EBI таких проблем, мне кажется, не будет. Команду можно подать и вручную. Разве что тормознется в процессе обращения к памяти, ДО команды SelfRefresh.
AlexG_changed
Судя по справке AVR Studio 5 в JTAGICE mkII и 3 кое-что предусмотрено для регенерации SDRAM во время останова:

XMEGA OCD
OCD and clocking

When the MCU enters stopped mode, the OCD clock is used as MCU clock. The OCD clock is either the JTAG TCK if the JTAG interface is being used, or the PDI_CLK if the PDI interface is being used.

The JTAGICE mkII does not offer a variable clock rate for XMEGA targets.

SDRAM refresh in stopped mode

When the OCD is in stopped mode, the MCU is clocked by the PDI or JTAG clock, as described in the paragraph above. Since nothing is known of this frequency by the debugger or OCD, a low refresh period (0x10) is automatically used. This value can't be changed by the user.
korobov_michael
В AppNote 1312 нашел штуку, которая напрямую, конечно, не подойдет, но, быть может, окажется полезной.

2.5 SDRAM Refresh Considerations


...


When in sleep mode and the clock to the EBI module is stopped, it is possible to enter Self-refresh mode for the SDRAM module. To enable Self-refresh, set the SDRAM Self-refresh Enable bit (SDSREN) in Control Register B (CTRLB) for Chip Select block 3. Note that it is not possible to access the SDRAM when in Self-refresh mode.
Получится, конечно, полный изврат, но можно перед потенциальной точкой останова записать этот бит. Вопрос только в том, сколько времени требуется EBI, чтобы выполнить эту операцию.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.