Гость Мехмед Каптан 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба К контроллеру 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 он размещается и вычитывается без проблем. Что я делаю не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 12 октября, 2009 Опубликовано 12 октября, 2009 (изменено) · Жалоба Вот это почитайте http://electronix.ru/forum/index.php?showtopic=14831&view=findpost&p=654862 Вам из xml файла надо удалить всё лишнее и оставить только: <register name="EBIU_SDBCTL" reset-value="0x00001515" core="Common" /> Изменено 12 октября, 2009 пользователем sevstels Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость Мехмед Каптан 12 октября, 2009 Опубликовано 12 октября, 2009 (изменено) · Жалоба Нет изменений.... =( Компилятор, кстати, 5.0 update 6 Изменено 12 октября, 2009 пользователем Мехмед Каптан Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 12 октября, 2009 Опубликовано 12 октября, 2009 (изменено) · Жалоба А Вы проверили, выполнил VDSP установку регистров или нет? С подключенным JTAG запустите загрузку. После загрузки кода, не запускайте на выполнение. Откройте закладку Register-> Extended Regs-> External Bus Interface Там найдите EBIU_SDBCTL и посмотрите значение. Если не совпадает - проверьте пути в xml файле. Они должны быть скорректированы под Ваше размещение проекта и VDSP и будут отличаться от примера. -- Напишите, как у Вас подключены пины CS SDRAM. Если на CS0-SMS0 и CS1-SMS1 DSP, то у вас 2 внешних банка по 64MB а не 1 на 128. Как один банк на 128MB он будет виден уже изнутри, т е после контроллера. - - Изменено 12 октября, 2009 пользователем sevstels Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость Мехмед Каптан 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба Тьфу, ну да...Оба подключены к SMS0 - значит, у меня один банк_0. Ясно. Плата с DSP не моя, просто. Если расширить банк_0 до 128 Мбайт, то моя программа вообще не запускается. Одно важное замечание: программа у меня под LwIP VDK. Без VDK можно задействовать все 128 Мбайт, а с VDK только 64. Наверняка, нужно в ldf-файле что-то вручную прописывать. Что? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба А сколько разрядов память, 16 или 32? У меня 32х разрядная стоит, поэтому CS разнесены. Если у Вас 16и разрядная, то похоже ошибки нет ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость Мехмед Каптан 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба Память 16 разрядная (32М16 - 32 мегаслов 16-битных) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба Ну дык ... у Вас всего 64 метра на борту... чего же вы ещё хотите? 128 оттуда никак не выдавить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость Мехмед Каптан 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба Добавил 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 Мегабайт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба Правильно глохнет - пусто там ... т е нет ничего. У Вас всего 64 мегабайта. 32 литра в одной банке с пивом, 32 литра в другой. Всего 64 литра. Когда вы хотите отхлебнуть из соседней бочки - там пусто ;) Запутался я с вашей памятью ... Загляните плиз в datasheet и напишите ёмкость в битах. Они обычно всегда пишут этот параметр. А потом посчитаем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость Мехмед Каптан 12 октября, 2009 Опубликовано 12 октября, 2009 · Жалоба Ну как нет? Две микросхемы 32М16. То есть, каждая микросхема вмещает 32.000.000 шестнадцатиразрядных слов. Итого в каждой микросхеме 64 мегабайта. Подобным образом подключены микросхемы на EZKIT - только там 2штуки 16М16 общей сложностью 64 мегабайта в обоих. Когда я вычитываю память с помощью View->Debug windows->Image viewer - все вычитывается. Вот, только что с помощью DMA записал массив данных начиная с адреса 0x4000002 - размещается правильно и правильно считывается с помощью Image viewer. Когда выполняется функция sendto из LwIP VDK, то приложение глохнет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 12 октября, 2009 Опубликовано 12 октября, 2009 (изменено) · Жалоба Понятно. >>Для подключения банка_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 Вроде так должно быть ... Кстати "глохнуть" может и по другой причине. Если у Вас используется защита памяти, то обращение к "закрытым" адресам вызывает исключение, и программа зависает. - Изменено 12 октября, 2009 пользователем sevstels Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость Мехмед Каптан 13 октября, 2009 Опубликовано 13 октября, 2009 · Жалоба Защиты памяти никакой нету. Когда запись в память производится аппаратно, через DMA, сбоев не возникает. Когда VDK-приложение пытается программно записать либо считать ячейку памяти в области свыше 64 Мб - возникает остановка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 14 октября, 2009 Опубликовано 14 октября, 2009 (изменено) · Жалоба Я с 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 Изменено 14 октября, 2009 пользователем sevstels Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 14 октября, 2009 Опубликовано 14 октября, 2009 · Жалоба Писать по адресу 0x06000000 надо ядром A, или в ldf сделать INPUT_BUFFER общим для ядер A и B. Вероятно, Ваша программа может останавливается по этой причине. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться