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

scorp2011

Участник
  • Постов

    72
  • Зарегистрирован

  • Посещение

Весь контент scorp2011


  1. Разводка SDR SDRAM к ARM

    Заполучил живую мной разведённую плату на двух SDR(2x16bit) подключенных к LPC3250 по примеру платы Phytec, работает на 104МГц. Одно из подозрений почему АРМ иногда вылетает на дата или код аборт, это неправильно разведённая плата. Согласно рекомендации NXP D0..Dx и QMx по длине не должны отличаться более чем на 7.5мм. У меня длины колеблются от 10мм до 28мм(считая с обоих сторон резисторов 22 Ома). Кроме того CLK я развёл не по Y топологии а последовательно к двум чипам памяти. Действительно ли это большая ошибка или у кого и похуже работало? Настройки памяти и EMC контроллера 100 раз проверял.
  2. OK6410

    Здравствуйте. Почитал на форуме несколько сообщений в которых упоминается эта плата. Я так понял что она немного отличается от mini6410 и других её вариантов. Вообщем на форуме не нашёл ответов на мою проблему. Что у меня получилось: Могу запускать WinCE. Для этого прошиваю в SD карту специальный загрузчик SD_boo с помощью SD_Writer.exet, а также копирую туда образ системы . При включении и загрузке с SD этот загрузчик пишет с SD в NAND систему. При следующем включении и загрузке с NAND WinCE6.0 работает, но он китайский блин. Тоже самое и с WinCE7, правда для его прошивки пришлось вручную в консоле отключить KITL. Теперь что у меня не получается, так это прошить Линукс. Есть u-boot версии 1.1.6 который вроде распознаёт новую NAND на 2G. Есть образ ядра 2.6.28. Пишу mmc.bin которую дают китайцы на диске. Пишу её на SD с помощью всё той же SD_Writer.exe в загрузочную область SD. Затем скидываю u-boot.bin, zImage и cramfs на SD. Включаю питание с загрузкой с SD и на СОМ порту вижу что u-boot.bin, zImage и cramfs записались в NAND автоматически при этом в СОМ порту выводилась шапка u-bootа и в конце я остаюсь в его коммандной строке. Если теперь включаю плату с загрузкой с NAND то она мёртвая, что на экране что по СОМ порту хотя по идее u-boot должен находиться с нулевого адреса NAND. Не понимаю где могут быть грабли. Откуда начинать копать? Или может кто поделится работающим загрузчиком, желательно сразу с SD. Спасибо P.S. Как оказалось, в китайском мануале(надо учить китайский :) ) написано что если до этого в NAND была установлена WinCE, то надо находясь в WinCE загрузщике выполнить команду А(очиства блоков) т.к. винда начальные блоки резервирует както. Вообщем ядро запустилось. Пока зависло на калибровке тачскрина...будем читать по китайски дальше... P.S. Вообщем ещё что удалось сделать, на китайском сайте нашёл что сборка китайская 2.6.28 с диска клинит на калибровке тачскрина. Так как не нашёл образы для 2.6.36 а сам пока не умею их компилировать то решил загрузить сборку Андроида. Зашилась в NAND с десятого раза. Постоянно в консоле выдавала что исправляет ошибки на NANDе но запустился. Работает похабно медленно, иожет из за ошибок, вроде WinCE шустрее была. Буду двигаться в таком направлении: сделаю свою сборку Линукса(ещё не знаю какой версии, у китайцев 3.0.1 для этой платы исходники есть) и одновременно чёто делать чтоб забыть про NAND и грузиться с SD в DDRAM ну и там и крутиться. Буду раз советам и поправкам
  3. http://electronix.ru/forum/lofiversion/index.php/t85735.html Всё дело в лицензии
  4. VAR-SOM-AM35 CPU: TI AM3517

    Вот и я себе OK6410 заказал. Сижу жду в нетерпении весь. Накачал с разных китайских сайтов доки на разные исполнения этой платы. Так что ждите вопросов
  5. Я сейчас не на работе и поэтому под рукой ничего нет, но помню что в описании как использовать медленную CRC написано что её надо ещё раз вызвать типа с нулевым или пустым значением, чтото такое. Почитайте внимательно. Вот из их примера: #ifdef SLOW_CRC16 sum = slow_crc16(sum,(unsigned char *)&__checksum_begin, (unsigned int)&__checksum_end -(unsigned int)&__checksum_begin +1); sum = slow_crc16(sum,(unsigned char *)&zero, 2); #elif defined FAST_CRC16 sum = fast_crc16(sum,(unsigned char *)&__checksum_begin, (unsigned int)&__checksum_end -(unsigned int)&__checksum_begin +1); #endif
  6. А что такое CCCV? Уже понял. Интересно, а как начинающий должен работать? Я так понимаю берётся пример и от него отталкиваются. Тем более этот кусок программы это часть портированного куска для АРМа от Segger
  7. Кому интересно, разобрался. Смысл в том что Idle задача не имеет стека и поэтому не унарные операции могут быть прерваны менеджером задач, а когда переключение задач не произойдёт то при возврате в Idle содержимое регистров может быть попорчено, поэтому надо делать так __ramfunc void OS_Idle(void) { // Idle loop: No task is ready to exec while (1) { OS_EnableRegion();//ДОБАВЛЕНО if((LowPowerEnable != 0) && ((PWR_CTRL&4)!=0)) { PWR_CTRL &= 0xFFFFFFFB;//идём в Direct Run EMCDynamicRefresh = 0x6; // (64ms/8192)*13MHz/16 } OS_LeaveRegion();//ДОБАВЛЕНО } }
  8. Mass Storage в IAR 5.4

    У меня IAR 6.20 и всё пошло с первого раза из примера
  9. Может я навалил всё в кучу вначале. Забудем на время про autorefresh у SDRAM и STOP режим процессора. Есть task Idle в RTOS во время которой я процессор перевожу в Direct Run. PERIPH_CLK что в Run что в Direct Run работает с частотой 13МГц(или от SYSCLK или HCLKPLL/16). HCLK в Run работает с частотой 104МГц а в Direct Run естественно 13МГц. Ядро ARM_CLK 208МГц в Run режиме и 13 в Direct Run. Экран разворачивается от внешнего входа поэтому проблем с понижением частоты для экрана нет. SDR SDRAM пожет работать при пониженной частоте ядра(DDR не может), для этого я авторефреш меняю чтоб всё также за 64мс вся SDRAM рефреш сделала. А на счет научного тыка, так я натыкался до предела, дальше не знаю куда тыкать поэтому и спрашиваю. Если процессор постоянно в Run режиме то нет проблем. Если постоянно в Direct Run то тоже нормально. А вот как только переключать начинаю для понижения потребления то вылетает, причём не сразу а черех несколько секунд.
  10. А если код вертится в SDRAM, то загнать память в selfrefesh, или это долго происходить будет по времени? А нельзя ли на пониженное потребление перейти. Вот тут пример http://www.iar.com/Global/Resources/Viewpo...0management.pdf
  11. Нет, ну перед STOP режимом я LCD отключаю, и жду пока SDRAM перейдёт в autorefresh. Почему во время Idle задачи когда я просто понижаю частоту и потребление, происходит этот аборт? LCD то я в Idle задаче не могу отключить, экран потухнет а это же во время работы
  12. Data-abort на LPC3250

    Здравствуйте. У меня такая проблема, никак не могу понять от чего. Система с SDRAM один в один как на плате Phytek, две 16-бит SDRAM как 32бит память. Код вертится в SDRAM, RTOS Segger/PowerPac, компилятор IAR 6.20. LCD контроллер выводит с SDRAM 320x240 16-бит. Инициализация контроллера и MMU из примера Seggera. Если Idle задачу ставлю в iRAM в таком виде(int32 LowPowerEnable=1 в SDRAM): __ramfunc void OS_Idle(void) { // Idle loop: No task is ready to exec while (1) { if((LowPowerEnable != 0) && ((PWR_CTRL&4)!=0)) { PWR_CTRL &= 0xFFFFFFFB;//идём в Direct Run EMCDynamicRefresh = 0x6; // (64ms/8192)*13MHz/16 } } } то черен несколько секунд исполнения программы контроллер вылетает на дата аборт(иногда и на аборт инструкции) именно в Idle процессе чаще всего в одном месте: 399 if((LowPowerEnable != 0) && ((PWR_CTRL&4)!=0)) \ OS_Idle: \ ??OS_Idle_0: \ 00000000 ........ LDR R0,??DataTable17 \ 00000004 000090E5 LDR R0,[R0, #+0] \ 00000008 000050E3 CMP R0,#+0 \ 0000000C FBFFFF0A BEQ ??OS_Idle_0 \ 00000010 ........ LDR R0,??DataTable17_1;; 0x40004044 \ 00000014 000090E5 LDR R0,[R0, #+0]!!!!!!!!!!!!!!!!!!!!!Вылетает тут \ 00000018 040010E3 TST R0,#0x4 \ 0000001C F7FFFF0A BEQ ??OS_Idle_0 400 { 401 PWR_CTRL &= 0xFFFFFFFB; \ 00000020 ........ LDR R0,??DataTable17_1;; 0x40004044 \ 00000024 000090E5 LDR R0,[R0, #+0]!!!!!!!!!!!!!!!!!!!!!или тут \ 00000028 0400D0E3 BICS R0,R0,#0x4 \ 0000002C ........ LDR R1,??DataTable17_1;; 0x40004044 \ 00000030 000081E5 STR R0,[R1, #+0] \ 00000034 F1FFFFEA B ??OS_Idle_0 402 //EMCDynamicRefresh = 0x6; // (64ms/8192)*13MHz/16 403 } При этом в R0 совсем не адрес PWR_CTRL. Это не проблема выравнивания получается как обычно бывает, а ошибка доступа к несуществуещему адресу Да ещё, имеется void myHookSub( void ) { PWR_CTRL_bit.HCKL_FORCE = 0;//возвращаемся в Run mode EMCDynamicRefresh = 0x32; } Тоесть таким образом я организовал режим пониженного потребления в Idle. Заметил если отключить DCACHE то проблема исчезает, но экран перерисовывается очень медленно. Если Idle перенести в SDRAM то тоже перестаёт вылетать. Если LowPowerEnable обьявляю в iRAM тоже проблема вроде уходит. Если контроллер кручу всегда в Direct Run режиме(13 Мгц кварц), или в Run то тоже не вылетает. Создаётся впечатление что кэширование както конфликтует в Direct Run и iRAM. Вообщем я запутался. Ещё эта проблема усугубляется если в настройках PLL на Периферию я даю деление 15.5 а не 16(так я подстроил частоту чтоб при переключении Direct Run UART работал на той же частоте, почемуто PLL не точно на 16 умножает). Конечно есть решение не крутить програму в iRAM и режим пониженного потребления сделать черех FORCE_HCLK(так тоже всё нормально, но дело в том что я собираюсь переводить контроллер в STOP который через Direct Run и в iRAM(SDRAM в авторефреш загоняю без проблем) и тоже клинит. Да и хочу понять почему не работает как положенно. Пользуюсь J-Link, J-Trace нет.
  13. стоимость uC/OS-II

    Maintenance charges это апдейты и тех поддержка. а по поводу цен, так большая наверно с исходниками
  14. А по поводу CSTACK, так его вроде IAR советует отключать так как Segger(что есть в итоге PowerPac) некорректно работает с IAR
  15. Честно говоря с этим кешированием я не очень разобрался, но вот так работает лучше. Кстати cf7k, вы правы, у меня бяка была при анимации __no_init static U16 _aVRAM[VRAM_SIZE*2]; #define LCD_VRAM ((U32)&_aVRAM[0] + 0x4000000) // write to non cached SDRAM area
  16. Чтобы не было выпадения картинки когда видеопамять в SDRAM, надо разместить её в кэшированной областе. Честно говоря я не помню как конкретно, но кажется вот так int16 Array[VIDEOSIZE]; #define VIDEOMEMORY Array+0x4000 В понедельник загляну на работе к свой код и исправлю если что. А по поводу SDRAM, у меня ядро на 208 а память если память не изменяет на 104MHz и всё работает. Я скопировал настройки и железо с платы Phytek. Могу поделиться в понедельник если надо
  17. Поделитесь пожалуйста, на будущее если кто поиском вашу тему найдет с такойже проблемой
  18. При переносе всех буферов в IRAM проблема исчезла, но на самом деле проблема была в другом. я понизил в 2 раза скорость шины HCLK со 104 до 52. Когда вернул, то всё заработало даже в SDRAM
  19. А вы уверены что вы в Debug режиме а не в Release? В настройках проекта в примерах посмотрите как это устанавливается. Там гдето прописывается DEBUG в списке переменных проекта, на память не помню. Хотя если вы готовый проект пробуете то в левом верхнем углу где список файлов проекта просто поменяйте Release на Debug
  20. Это драивер котории шел с фаиловои системои PowerPac в комплекте с операционкои
  21. Использую IAR для компиляции программы в SDRAM АРМа. Сама программа около 2М, но нужно использовать в ней массив 8М. Если обьявляю его даже как no_init всё равно в результате бинарный файл 10М. Пробовал через heap и malloc. Результат тот же. Похоже heap включается в размер бинарника. Или я чтото не то делаю? Хотелось бы иметь 2М кода и загружать его в SDRAM, а не все ненужные 10М
  22. Здравствуйте. Есть LPC3250 с подключенной SD картой в 4битном режиме. Всё скопировано с Phytec платы(на ней кстати такая же проблема). Запускаю простую програмку (В RTOS PowerPac с одной задачей и файловой системой как в примере). В бесконечном цикле открываю файл, записываю пару килобайт, закрываю файл. Если программу с данными запустить в IRAM то проблем нет. Если же в SDRAM то через некоторое время код виснет в этой функции: int FS_MMC_HW_X_WriteData(U8 Unit, const void * pBuffer, unsigned NumBytes, unsigned NumBlocks) { int r; U32 * pFifoReg; U32 * p; pFifoReg = (void *)MCI_FIFO_ADDR; NumBytes *= NumBlocks; p = (U32 *)pBuffer; if (((U32)pBuffer & 0x1f) || (NumBytes & 0x1f)) { p = _GetBufferAddr(); FS_MEMCPY(p, pBuffer, NumBytes); } OS_ARM_DCACHE_CleanRange(p, (NumBytes + 0x1f) & ~0x1f); _DMAStart(pFifoReg, p, NumBytes, MEMORY_TO_PERIPHAL); _WriteControlReg(Unit); r = 0; // No error so far while ((GPDMA_RAW_INT_TCSTAT & 0x01) == 0); Виснит тут GPDMA_INT_TCCLR = 1; if (MCI_STATUS & (1 << 1)) { MCI_CLEAR = (1 << 1); return FS_MMC_CARD_WRITE_CRC_ERROR; } if (MCI_STATUS & (1 << 4)) { MCI_CLEAR = (1 << 4); return FS_MMC_CARD_WRITE_CRC_ERROR; } while((MCI_STATUS & (1 << 10)) == 0); MCI_CLEAR = (1 << 10); while((MCI_STATUS & (1 << 8)) == 0); MCI_CLEAR = (1 << 8); return r; } Пробовал буфер, откуда пишу в файл, организовать в IRAM. Заметил что виснет когда в функцию передается адрес памяти в SDRAM, видимо файловая система использует внутренние буферы из стека для записи системной информации. Ну вообщем вопрос вот в чем, почему DMA клинит? Как его настроить? Вроде в описании LPC3250 нет как перешивать приоритеты. Как бы понятно что происходит конфликт DMA и самого кода. Какой выход? Один из вариантов, организовать все буферы для файловой системы в IRAM, но есть опасения что файловая система для буферов использует стек который в SDRAM по любому. Кто что может посоветовать? Подумал может это контроллер SD карты не отвечает на запросы DMA(If a peripheral performs a split or retry, the DMA Controller stalls and waits until the transaction can complete), но почему тогда всё работает когда код в IRAM?
  23. SAM9260 и SPI

    Мастер генерирует CLK(ну CS не проблема) и принимает сразу данные с одного канала. Slave будет подключен на прием со второго канала. CLK для slave берется от мастера а выход просто в воздухе.
  24. Если программа нормально работает с той областью памяти а JTAG нет, то сравните настройки EMC SDRAM контроллера в программе с настройками в скрипте, в скрипте чтото не то. Не забудьте про настройки клоков относящихся к EMC контроллеру
  25. Как вариант, посмотрите листинг программы, где что в каких областях памяти слинковалось. А не грузится это как? Скиньте сюда из окна JTAG что там выдаются за команды и какие ошибки, может на мысль наведет.
×
×
  • Создать...