Перейти к содержанию
    

BF-561: проблема с подключением Bank_1 SDRAM

Гость Мехмед Каптан

К контроллеру SDRAM BF561 подключены 2 микросхемы 32M16 (64 мегабайта каждая). По умолчанию поддерживается работа только с Банком_0 размером 64 Мбайта

 

(EBIU_SDBCTL=0x00000015

что означает:

Bank_0 Column Address Width = 9 бит

Bank_0 Size = 64 Мбайт

Bank_0 Enable=1)

 

Для подключения банка_1 я записываю в EBIU_SDBCTL 0x00001515 в надежде, что смогу работать с банком_1 так же, как и с банком_0 - однако массив данных в банк_1 не записывается. В банк_0 он размещается и вычитывается без проблем.

 

Что я делаю не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот это почитайте

http://electronix.ru/forum/index.php?showtopic=14831&view=findpost&p=654862

 

Вам из xml файла надо удалить всё лишнее и оставить только:

<register name="EBIU_SDBCTL" reset-value="0x00001515" core="Common" />

Изменено пользователем sevstels

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость Мехмед Каптан

Нет изменений.... =(

 

Компилятор, кстати, 5.0 update 6

Изменено пользователем Мехмед Каптан

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А Вы проверили, выполнил VDSP установку регистров или нет?

С подключенным JTAG запустите загрузку.

 

После загрузки кода, не запускайте на выполнение.

Откройте закладку Register-> Extended Regs-> External Bus Interface

Там найдите EBIU_SDBCTL и посмотрите значение.

 

Если не совпадает - проверьте пути в xml файле.

Они должны быть скорректированы под Ваше размещение проекта и VDSP и будут отличаться от примера.

 

--

Напишите, как у Вас подключены пины CS SDRAM.

Если на CS0-SMS0 и CS1-SMS1 DSP, то у вас 2 внешних банка по 64MB а не 1 на 128.

Как один банк на 128MB он будет виден уже изнутри, т е после контроллера.

 

-

-

Изменено пользователем sevstels

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость Мехмед Каптан

Тьфу, ну да...Оба подключены к SMS0 - значит, у меня один банк_0. Ясно. Плата с DSP не моя, просто.

 

Если расширить банк_0 до 128 Мбайт, то моя программа вообще не запускается.

Одно важное замечание: программа у меня под LwIP VDK. Без VDK можно задействовать все 128 Мбайт, а с VDK только 64.

Наверняка, нужно в ldf-файле что-то вручную прописывать. Что?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А сколько разрядов память, 16 или 32?

У меня 32х разрядная стоит, поэтому CS разнесены.

Если у Вас 16и разрядная, то похоже ошибки нет ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну дык ... у Вас всего 64 метра на борту... чего же вы ещё хотите?

128 оттуда никак не выдавить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость Мехмед Каптан

Добавил register name="EBIU_SDBCTL" reset-value="0x00000027" core="Common"

 

(Bank_0 Column Address Width = 10 бит

Bank_0 Size = 128 Мбайт

Bank_0 Enable=1)

 

Программа запустилась, но при считывании из области выше 64 Мбайт - глохнет.

 

Ну дык ... у Вас всего 64 метра на борту... чего же вы ещё хотите?

128 оттуда никак не выдавить.

 

 

Так у меня же 2 таких микросхемы. Две микросхемы по 64 Мегабайт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильно глохнет - пусто там ... т е нет ничего.

У Вас всего 64 мегабайта.

32 литра в одной банке с пивом, 32 литра в другой.

Всего 64 литра.

 

Когда вы хотите отхлебнуть из соседней бочки - там пусто ;)

 

Запутался я с вашей памятью ...

Загляните плиз в datasheet и напишите ёмкость в битах.

Они обычно всегда пишут этот параметр.

А потом посчитаем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость Мехмед Каптан

Ну как нет?

 

Две микросхемы 32М16. То есть, каждая микросхема вмещает 32.000.000 шестнадцатиразрядных слов. Итого в каждой микросхеме 64 мегабайта.

Подобным образом подключены микросхемы на EZKIT - только там 2штуки 16М16 общей сложностью 64 мегабайта в обоих.

 

Когда я вычитываю память с помощью View->Debug windows->Image viewer - все вычитывается.

 

Вот, только что с помощью DMA записал массив данных начиная с адреса 0x4000002 - размещается правильно и правильно считывается с помощью Image viewer. Когда выполняется функция sendto из LwIP VDK, то приложение глохнет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понятно.

 

>>Для подключения банка_1 я записываю в EBIU_SDBCTL 0x00001515 в надежде, что смогу работать с банком_1 так же, как и с банком_0 - однако массив данных в банк_1 не записывается. В банк_0 он размещается и вычитывается без проблем.

 

Тогда с точки зрения контроллера, у вас один 32х разрядный 128MB внешний банк.

Проверьте, сброшен ли бит EBIU_SDGCTL (0 << WIDTHp) //use 32bit memory bus

 

EBIU_SDBCTL в этом случае устанавливать только для нулевого банка

//Setup for Bank 0

*pEBIU_SDBCTL =

(2 << EB0CAW)| //column address width: 0-8bit,1-9bit,2-10bit,3-11 bit

(3 << EB0SZ)| //Total SDRAM bank size:0-16MB,1-32MB,2-64MB,3-128MB

(1 << EB0E); //1=SDRAM external bank enable

 

Вроде так должно быть ...

 

Кстати "глохнуть" может и по другой причине.

Если у Вас используется защита памяти, то обращение к "закрытым" адресам вызывает исключение, и программа зависает.

 

-

Изменено пользователем sevstels

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость Мехмед Каптан

Защиты памяти никакой нету. Когда запись в память производится аппаратно, через DMA, сбоев не возникает. Когда VDK-приложение пытается программно записать либо считать ячейку памяти в области свыше 64 Мб - возникает остановка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я с VDK никогда не работал и не знаю как там реализуется доступ.

 

 

Если страничной зашиты нет, то тогда остаётся только попробовать выровнять адресацию.

#define ALIGN_TO_NEXT_WORD_BOUNDARY(x) ( (char *)(((((int)(x)) + 3) >> 2) << 2))

 

//выравнивание

pAddress = ALIGN_TO_NEXT_WORD_BOUNDARY(INPUT_BUFFER);

 

Даёте макросу адрес вашего буфера в памяти, получаете выровненый адрес, затем туда пишете

*pAddress = 0xAA;

 

 

Всё же проверьте наличие защиты памяти.

Для этого просмотрите Register->Core->L1 Data Memory Registers

Или принудительно установите разрешение доступа

Что то типа этого:

 

*pDMEM_CONTROL &= ~ENDCPLB; //Access to CPLB setup

asm ("ssync;");

 

*pDCPLB_ADDR15 = 0x06000000; //сюда начало страницы памяти

asm ("ssync;");

 

*pDCPLB_DATA15 = 0x0003001D; //сюда параметры доступа (PAGE_SIZE_4MB | CPLB_D_NOCACHE)

asm ("ssync;");

 

*pDMEM_CONTROL |= ENDCPLB;

asm ("ssync;");

 

//теперь можно попробовать записать

 

pAddress = 0x06000000;

*pAddress = 0xAA;

 

Проверьте соответствие типа указателя данным. Если пишете 1 байт то char* итд ..

Потестите с еденичным байтом, так проще понять причину затыка.

Пока других идей нет.

 

- ps

 

Надеюсь, Вы ldf файл поправили и там всё сделано для 128MB памяти?

И перенесли свои буфера в соответствующее место примерно так.

 

/*Memory SDRAM 128MB*/

MEM_SDRAM_BANK0 { TYPE(RAM) START(0x00000004) END(0x01FFFFFF) WIDTH(8) }*/

MEM_SDRAM_BANK1 { TYPE(RAM) START(0x02000000) END(0x03FFFFFF) WIDTH(8) }*/

MEM_SDRAM_BANK2 { TYPE(RAM) START(0x04000000) END(0x05FFFFFF) WIDTH(8) }*/

MEM_SDRAM_BANK3 { TYPE(RAM) START(0x06000000) END(0x07FFFFFF) WIDTH(8) }*/

 

MEM_INPUT_BUFFER {TYPE(RAM) WIDTH(8) START(0x06000000) END(0x07FDFFFF)}

 

//Это положить в: SECTIONS p0

.loop_buffer NO_INIT

{

_INPUT_BUFFER = .;

. = . + 0x01FDFFFF;

_INPUT_BUFFERend = .;

} > MEM_INPUT_BUFFER

Изменено пользователем sevstels

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Писать по адресу 0x06000000 надо ядром A, или в ldf сделать INPUT_BUFFER общим для ядер A и B.

Вероятно, Ваша программа может останавливается по этой причине.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...