|
xmega128a1 + sdram |
|
|
|
Jan 9 2011, 17:39
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
возникла необходимость внешней памяти на xmega128a1 под рукой есть 8 штук SDRAM 8Mx8 byte (MT48LC8M8A2) подскажите пожалуйста можно ли этот SDRAM присобачить к xmega128a1 ??? в даташите на мк написано что организация памяти должна быть 4 битная для SDRAM а у меня вроде 8 битная
--------------------
1 километр = 1024 метр
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 39)
|
Jan 9 2011, 19:53
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(bekor @ Jan 10 2011, 04:39)  в даташите на мк написано что организация памяти должна быть 4 битная для SDRAM а у меня вроде 8 битная  XMEGA A MANUAL (Rev H) ->24. EBI - External Bus Interface -> 24.8 SDRAM ConfigurationChip 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.
--------------------
|
|
|
|
|
Jan 10 2011, 05:28
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
вот досада а скажите пожалуйста а достать 4 битную SDRAM очень трудно ? на компютерный планках памяти вообше бывают 4 битные или там только 8 и 16 ??? мне нужно иметь как минимум 8МБ памяти, этот вопрос решаемый или прийдется брать другую иксмегу ? а кстати на каких моделях есть 4 порта под EBI ?
--------------------
1 километр = 1024 метр
|
|
|
|
|
Jan 10 2011, 09:21
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

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

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
вот здорово есть еще вопросы генератор кода в CVAVR требует ввести кучу параметров для всяких там задержк, но не знаю откуда брать эти цыфры, в даташите на память их вроде небыло. и еше как обяснить компилятору чтоб большие массивы хранить во внешней памяти а все остальные глобальные переменные во внутреннюю память ?
Сообщение отредактировал bekor - Jan 10 2011, 09:54
--------------------
1 километр = 1024 метр
|
|
|
|
|
Jan 10 2011, 10:55
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
а что на счет row bits, column bits, и SDRAM self refresh ??
а еще компилятор ругается что только первые 64КБ будет использоваться с прямым доступом потому что указатели 16 битные
это значит что для доступа к памяти придется вручную писать функции какие то ?
Сообщение отредактировал bekor - Jan 10 2011, 12:09
--------------------
1 километр = 1024 метр
|
|
|
|
|
Jan 12 2011, 08:11
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 11-02-08
Пользователь №: 34 931

|
Меня лично их EBI-нутая система шин не порадовала и я под свой проект сделал подпрограммы управления SDRAM без всякой кривой аппаратной поддержки шины. Не так уж и сложно подергать ножками - скорости вроде хватает. Конечно, не сильно быстро получается ( по сравнению с аппаратным потоковым доступом на 50 МГц ), но "программное" потоковое чтение-запись в burst-режиме SDRAM вполне резко работает. А поскольку через EBI ATxMega работает без поддержки burst ( насколько я понял ), то и я ничего не теряю. И никаких заморочек с DMA не приходится придумывать... У меня просто данные валятся снаружи по 8 бит и прямо в SDRAM В другом проекте на ATxMega мы подключили 4-х битную SDRAM - тоже весьма резко качает ( 2 цикла чтения полубайт = чтение байта ). Насколько я понял, row bits - количество разрядов адреса для строк, column bits - то же для адресации внутри строки. SDRAM self refresh - наверняка признак использования самостоятельной регенерации памяти ( хотя может быть и какой-нибудь режим указать придется, кто бы его читал ). Но в своем проекте я эту регенерацию использую ( самому морочиться с ручной регенерацией - не обязательно ). Считал/записал и перевел память обратно в режим само-ренегерации ( он же спящий режим )...
|
|
|
|
|
Jan 14 2011, 09:00
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
Подключил SDRAM (16M x 8) заработало сразу! но есть две проблемы: 1. компилятор видит только первые 64КБ. 2. если поднести руку к микросхеме памяти уже на расстоянии 1см, контроллер сбросывается. p.s. керамический кондер 100n у памяти между Vdd и Vss присутствует, неиспользуемый полубайт а так же все остальные неиспользованные ноги оставил в воздухе, может от этого происходит сброс ???
Сообщение отредактировал bekor - Jan 14 2011, 09:03
--------------------
1 километр = 1024 метр
|
|
|
|
|
Jan 14 2011, 09:23
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(bekor @ Jan 14 2011, 19:00)  Подключил SDRAM (16M x 8) заработало сразу! но есть две проблемы: 1. компилятор видит только первые 64КБ. 2. если поднести руку к микросхеме памяти уже на расстоянии 1см, контроллер сбросывается. p.s. керамический кондер 100n у памяти между Vdd и Vss присутствует, неиспользуемый полубайт а так же все остальные неиспользованные ноги оставил в воздухе, может от этого происходит сброс ??? 1. В настройках проекта разрешите внешнюю шину памяти и укажите ее количество. 2. Конечно же нужно было подтянуть неиспользуемые линии данных к напряжению питания. Так же поступить и с остальными не используемыми входами... Очень может влиять разводка платы на помехоустойчивость.
--------------------
|
|
|
|
|
Jan 14 2011, 09:43
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
Цитата(prottoss @ Jan 14 2011, 15:23)  1. В настройках проекта разрешите внешнюю шину памяти и укажите ее количество. это я и делаю но компилер грит типа немогу исползовать больше 64КБ памяти потомучто у меня указатели 16 битные. Цитата(prottoss @ Jan 14 2011, 15:23)  2. Конечно же нужно было подтянуть неиспользуемые линии данных к напряжению питания. Так же поступить и с остальными не используемыми входами... Очень может влиять разводка платы на помехоустойчивость. эту проблему я тоьк что решил, надо было CS заземлить
--------------------
1 километр = 1024 метр
|
|
|
|
|
Jan 14 2011, 09:50
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(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
--------------------
|
|
|
|
|
Jan 14 2011, 10:00
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
Цитата(prottoss @ Jan 14 2011, 15:50)  Модель LARGE или HUGE нуна сделать сделал LARGE но не помогло
--------------------
1 километр = 1024 метр
|
|
|
|
|
Jan 14 2011, 10:12
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
huge модели там нету там только small, medium и large уауууууу нашел заводской пример для SDRAM в папке с компилятором ща попробую разобраться...
--------------------
1 километр = 1024 метр
|
|
|
|
|
Jan 14 2011, 12:16
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
разобрался Код /* 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 это нормально или можно добиться большей скорости ?
Сообщение отредактировал bekor - Jan 14 2011, 12:19
--------------------
1 километр = 1024 метр
|
|
|
|
|
Jan 17 2011, 04:01
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 11-02-08
Пользователь №: 34 931

|
Цитата(bekor @ Jan 14 2011, 18:16)  разобрался Код /* External memory >64k write function */
} работает ! но скорость чтения и записи не очень радует. максимальная скорость получаеться примерно 100КБ/с при минимальных задержках в настройках EBI это нормально или можно добиться большей скорости ? Вообще чтение из SDRAM происходит примерно за 7-8 тактов периферийной шины. А уж ее скорость задается пользователем. Если ядро запустить на 32 МГц и использовать удвоение частоты периферийной шины, то SDRAM будет работать на 64 МГц. И на чтение будет уходить порядка 100-150 нСек, что весьма не плохо. "Курите" документацию по генераторам xMega - там много интересного. Свой проект я "выкурил" из этого атмеловского примера...
Сообщение отредактировал KKV2003 - Jan 17 2011, 04:07
|
|
|
|
|
Jan 17 2011, 06:53
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
Спасибо, буду разбираться, хотя у меня и сейчас 32MHz
--------------------
1 километр = 1024 метр
|
|
|
|
|
Jan 17 2011, 21:42
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
вот настроил процессор на 32МГц а периферию на 64МГц скорость работы SDRAM поднялась с 100КБ/с до 160КБ/с но всеравно мало... мне нужно хотябы 500КБ/с что еще можно придумать ? и еше вопрос, почему перед чтением в этих функциях глобально запрешаются прерывания ? нельзя ли как то без этого, а то это будет мишать основной программе. ууу разобрался [CENSORED] вся проблема была в том что основное времья жрало не само чтение а вызов функции чтения, вынул эти строки из функции и прям в цикл в место вызова запихнул и скорость поднялась до 580КБ/с теперь осталось разобраться с глобальным отключением прерываний, непонятно зачем оно вообше нужно если обращение к SDRAM производиться апаратными средствами EBI ?
Сообщение отредактировал IgorKossak - Jan 17 2011, 22:12
Причина редактирования: Последнее предупреждение
--------------------
1 километр = 1024 метр
|
|
|
|
|
Jan 18 2011, 18:26
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
спасибо, с прерыванием тоже разбирусь как нибудь, точнее пока что проблем не выявилось с этим пока все нормально работает...
Сообщение отредактировал bekor - Jan 18 2011, 18:28
--------------------
1 километр = 1024 метр
|
|
|
|
|
Feb 4 2011, 12:49
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
возможно ли писать этот кусок кода на ассемблере чтобы уменьшить время его выполнения ? Код unsigned char s,r,data;
s=SREG; #asm("cli") r=RAMPX; RAMPX=((unsigned char *) &addr)[2]; data=*((unsigned char*) addr); RAMPX=r; SREG=s;
--------------------
1 километр = 1024 метр
|
|
|
|
|
Feb 6 2011, 09:01
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(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 файле написать асмовую функцию.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 6 2011, 17:19
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
Цитата(demiurg_spb @ Feb 6 2011, 13:01)  Возможно всё. Что за компилятор? CodeVisionAVR
--------------------
1 километр = 1024 метр
|
|
|
|
|
Feb 6 2011, 20:50
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(bekor @ Feb 4 2011, 15:49)  возможно ли писать этот кусок кода на ассемблере чтобы уменьшить время его выполнения ? Может для начала посмотреть как на асме выглядят эти процедуры после кодевижона. И тогда подумать можно ли их ускорить. Цитата(bekor @ Jan 18 2011, 00:42)  и еше вопрос, почему перед чтением в этих функциях глобально запрешаются прерывания ? Я тоже не понимаю зачем прерывания запрещать. Возможно для того чтобы эти фукции были атомарны и также как LDS,STS не прерывались.
|
|
|
|
|
Feb 7 2011, 07:47
|

Участник

Группа: Участник
Сообщений: 66
Регистрация: 28-06-09
Пользователь №: 50 704

|
Цитата Напишите то что нужно Вам и будет счастье... хочу читать байт по заданному адресу с 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
Сообщение отредактировал bekor - Feb 7 2011, 07:53
--------------------
1 километр = 1024 метр
|
|
|
|
|
Feb 8 2011, 09:00
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(bekor @ Feb 7 2011, 10:47)  Вот это . компиль превратил в это: . Мдаааа... Лишний раз убедился что если нужно быстродействие нужно на асме писать. Помочь это ускорить не смогу т.к. не знаком с кодевижоном и никогда не писал на СИ для мк. З.Ы. А вот это макросы чтоли? __GETB1MN _addr_a1,2 __SUBD1N -1
|
|
|
|
|
Mar 1 2011, 18:34
|

Участник

Группа: Участник
Сообщений: 28
Регистрация: 11-10-05
Из: Запорожье
Пользователь №: 9 516

|
Сейчас вожусь с тем же самым. По моему твёрдому убеждению после прокуренной доки на эксмегу, и закупленных непонятно зачем на радиорынке 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 Михаил.
|
|
|
|
|
Mar 3 2011, 04:52
|
Частый гость
 
Группа: Свой
Сообщений: 118
Регистрация: 11-03-07
Из: Украина, Харьков
Пользователь №: 26 059

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

Группа: Участник
Сообщений: 30
Регистрация: 11-02-08
Пользователь №: 34 931

|
Сильно сомневаюсь, чтобы можно было бы тормознуть процессор с сохранением работоспособности памяти если это не заложено автоматически. Когда к памяти не производится обращение, то на нее можно ( нужно ) подавать команду SelfRefresh, то есть самостоятельной регенерации. В этом режиме ей даже тактовых импульсов подавать не надо. Но вот как действует EBI-контроллер - я не знаю совершенно.
Есть подозрение, что можно вручную контроллеру памяти указывать перейти в режим SelfRefresh - тогда даже если проц тормознется, то содержимое оперативки должно сохраняться. Хотя пока наши люди такой возможности не нашли. Да и отладчиком пока xMeg-у не мучили. Может и мы с таким столкнемся. Может быть Вам тоже не тормозить процессор - использовать другие методы отладки?
P.S. При работе с SDRAM без использования EBI таких проблем, мне кажется, не будет. Команду можно подать и вручную. Разве что тормознется в процессе обращения к памяти, ДО команды SelfRefresh.
|
|
|
|
|
Mar 3 2011, 10:55
|
Участник

Группа: Validating
Сообщений: 64
Регистрация: 16-06-05
Пользователь №: 6 073

|
Судя по справке 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.
|
|
|
|
|
Mar 4 2011, 04:29
|
Частый гость
 
Группа: Свой
Сообщений: 118
Регистрация: 11-03-07
Из: Украина, Харьков
Пользователь №: 26 059

|
В 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, чтобы выполнить эту операцию.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|