vovka1960 0 18 октября, 2010 Опубликовано 18 октября, 2010 (изменено) · Жалоба И все же - возвращаясь к началу. Из чего должен состоять первый (самый что ни на есть простой) пример? Скажем - мне надо удостоверится, что все крутится и тупо вывести на какой-то GPIO пин частоту (бесконечный цикл, в котором пин меняет свое значение на обратное). Язык - С/С++. Подстановка в проект простенького main() привело к требованию точки входа _c_int00. Поиски по интернету дали ссылку на доки от TI, где вычитал, что требуется rts.src. Но трансляция с ним привела к огромной куче ошибок.. Возможно - надо просто подставить библиотеку.. Но в каталоге C6000 этих rts-библиотек оказалась куча.. Причем для 64хх их оказалось 8! Четыре для 6400 и 4 для 64plus (интересно - 6455 к которому из них относится?? в списке rts6400, rts6400_eh, rts6400e, rts6400e_eh, rts64plus, rts64plus_eh, rts64pluse, rts64pluse_eh) Просит cmd-файл для линкера. В каталоге lib для С6000 есть lnk.cmd. Может его подставить или все же надо что-то свое ваять? Перечитал еще раз DSP for Dummies... Так и не понял, откуда берется процедура _c_int00 :unsure: В общем - нужно что-то типа вводной по программированию в CCS3 для С6455... Изменено 18 октября, 2010 пользователем Вовка_Бызов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovka1960 0 19 октября, 2010 Опубликовано 19 октября, 2010 · Жалоба Ладно - разобрались сами. выяснилось, что rts6400 для старых процессоров, а для нашего (6455) нужна 64plus. Что базовая библиотека - это 64plus, что добавок к имени буковки "e" означает big endian (по умолчанию - little endian), что _eh - это exception handling - обработка исключений при выполнении функций библиотеки. В каталоге csl библиотеки есть c6455.cmd для линкера. В общем - проект собрали (исходник - пример csl_plcc.c), загрузили, исполнили.. Теперь - вопрос по GPIO. Смотрел пример из CSL. Смотрел функции API для GPIO. Как-то все заумно. Открыть сессию, закрыть сессию.. Бррр. Более того - в примере csl есть обращение непосредственно к регистрам с помощью макросов CSL_FINST. В общем - нельзя ли по-проще, только макросами? И где есть описание этих макросов (в доке к CSL есть описание только API и лишь перечисление самих макросов). Ведь по сути - надо включить GPIO, настроить нужный пин как выход и - вперед.. Да - и еще - в примере есть строки do { gpioEn = (Bool) CSL_FEXT(((CSL_DevRegs*)CSL_DEV_REGS)->PERSTAT0, DEV_PERSTAT0_GPIOSTAT); } while (gpioEn != TRUE); printf("Powersaver clock for GPIO is enabled\n"); Не понял, что это такое.. Кто такой "Powersaver clock". И вообще - как разбираться, что куда устанавливают эти макросы? Т.е. - опять вопрос - где эти описания.. Буду рад помощи :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
talus 0 19 октября, 2010 Опубликовано 19 октября, 2010 · Жалоба Теперь - вопрос по GPIO. Смотрел пример из CSL. Смотрел функции API для GPIO. Как-то все заумно. Открыть сессию, закрыть сессию.. Бррр. Более того - в примере csl есть обращение непосредственно к регистрам с помощью макросов CSL_FINST. В общем - нельзя ли по-проще, только макросами? Буду рад помощи :laughing: А не проще ли Вам просто самому написать свой макрос, прочитайте мануал по какому адресу лежат регистры настройки и управления GPIO. TI предоставляет подробную документацию, там черным по белому английским буквами все написано ;) Проще некуда же *pAddressGPIO ^= (1 << (BIT)) P.S. лично я на CSL забил Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovka1960 0 20 октября, 2010 Опубликовано 20 октября, 2010 · Жалоба А не проще ли Вам просто самому написать свой макрос, прочитайте мануал по какому адресу лежат регистры настройки и управления GPIO. TI предоставляет подробную документацию, там черным по белому английским буквами все написано ;) Проще некуда же *pAddressGPIO ^= (1 << (BIT)) P.S. лично я на CSL забил alexeyv, в принципе, правильно утверждал, что использование символических имен регистров и макросов их установки существенно улучшает переносимость кода. API CSL - безусловно нафиг, но вот базис API - макросы и символические имена - применять, ИМХО, полезно. Тем более - их трансляция приводит к тем же простым конструкциям. Поэтому и ищу описание подробное. Но - между делом - изучаю spru584a.pdf (General-Purpose Input/Output (GPIO) Reference Guide). Одно другое не исключает. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovka1960 0 20 октября, 2010 Опубликовано 20 октября, 2010 (изменено) · Жалоба Ну - с регистрами и макросами более-менее разобрались... Теперь надо бы выяснить, какое реальное быстродействие может обеспечить C6455. Как разогнать ядро, чтобы такт изменения GPIO пина был больше, чем 240 nS? Или - 5 МГц - это и есть тактовая частота процессора в режиме выполнения кода без кэша? Что-то уж больно мало... Где же они, хваление гигагерцы? :crying: Или все же в настройки PLL можно что-то вносить? В базовом примере hwSetup.preDiv = (Uint32) 0x00000002; hwSetup.pllM = (Uint32) 0x000000015; hwSetup.pllDiv4 = (Uint32) 0x00000002; hwSetup.pllDiv5 = (Uint32) 0x00000002; Правда, в последствии PLLDIV4 меняется на 4... Тактовая частота на входе - 50 МГц. В общем - к тем, кто игрался с PLLC - вопрос. Как добиться максимума быстродействия (пока без изменения напряжения питания на ядре - пока в I2C не хочется лезть...) ? Изменено 20 октября, 2010 пользователем Вовка_Бызов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
talus 0 20 октября, 2010 Опубликовано 20 октября, 2010 · Жалоба Теперь надо бы выяснить, какое реальное быстродействие может обеспечить C6455. Как разогнать ядро, чтобы такт изменения GPIO пина был больше, чем 240 nS? Или - 5 МГц - это и есть тактовая частота процессора в режиме выполнения кода без кэша? Что-то уж больно мало... Где же они, хваление гигагерцы? :crying: А если подумать, кто вам обещал дергать ножкой на частоте процессора то а? Если хотети посмотреть работу PLL надо не GPIO дергать, а использовать, если есть, специальную ножку типа "CLKOUT", а ножко-дрыгатель хорош, чтобы тик таймера смотреть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovka1960 0 20 октября, 2010 Опубликовано 20 октября, 2010 · Жалоба А если подумать, кто вам обещал дергать ножкой на частоте процессора то а? Если хотети посмотреть работу PLL надо не GPIO дергать, а использовать, если есть, специальную ножку типа "CLKOUT", а ножко-дрыгатель хорош, чтобы тик таймера смотреть. А никто и не собирался с частотой проца дергать ножкой.. Дергали вот так: register volatile Uint32 *pset; register volatile Uint32 *pclr; register int i; pset = &(((CSL_GpioRegs*)CSL_GPIO_0_REGS)->SET_DATA); pclr = &(((CSL_GpioRegs*)CSL_GPIO_0_REGS)->CLR_DATA); for (;;) { for (i = 0; i < 5; i++); *pclr = CSL_FMK(GPIO_SET_DATA_SET3, CSL_GPIO_SET_DATA_SET_SET); for (i = 0; i < 5; i++); *pset = CSL_FMK(GPIO_SET_DATA_SET3, CSL_GPIO_SET_DATA_SET_SET); } В итоге - период вот этого "счастья" составил 2.3 uS! Из них - на изменение GPIO уходит 240nS (было вычислено путем примерной оценки длительности вносимой задержки и вычитания из общего периода). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
talus 0 20 октября, 2010 Опубликовано 20 октября, 2010 · Жалоба Ну - с регистрами и макросами более-менее разобрались... Или все же в настройки PLL можно что-то вносить? В базовом примере hwSetup.preDiv = (Uint32) 0x00000002; hwSetup.pllM = (Uint32) 0x000000015; hwSetup.pllDiv4 = (Uint32) 0x00000002; hwSetup.pllDiv5 = (Uint32) 0x00000002; Правда, в последствии PLLDIV4 меняется на 4... 2,3us маловато будет для вашей настройки, ибо получается 50 / 2 * 15 = 375 SYSREFCLK(C64x+ MegaModule) или 2,67нс на такт, т.е. для 2,3us 681 тик процессора. Не верю © ;) Проверьте бит PLLCTL.[0] и в соответсвии с SPRS276J настройте как надо все параметры PLL до вашей частоты 1000 или 1200 или 720 или 850. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovka1960 0 21 октября, 2010 Опубликовано 21 октября, 2010 (изменено) · Жалоба Проверьте бит PLLCTL.[0] и в соответсвии с SPRS276J настройте как надо все параметры PLL до вашей частоты 1000 или 1200 или 720 или 850. Спасибо! Щас нарисую собственную настройку PLL. Нашел строгую последовательность и параметры. Вопрос по существу дела. Перед началом установки по инструкции требуется сделать задержку (после PowerUp) на время стабилизации PLL. Так вот - во-первых, время стабилизации указано как "не менее 150 мкс" - какое же принимать? - во вторых - как принято у этих процессоров делать задержки такие? Не включать же таймер... Хотя - может и так... Или накрутить кучу asm(" NOP 9") в цикле? Но - тогда сколько? Какая тактовая после PowerUp устанавливается? Изменено 21 октября, 2010 пользователем Вовка_Бызов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovka1960 0 21 октября, 2010 Опубликовано 21 октября, 2010 · Жалоба Ну вот - после непродолжительных изучений sprs276j и sprue56 была составлена прога для инициализации pllc (PLL1). Процессор успешно разогнан на 1 ГГц (по крайней мере - вычисленная по осциллографу длительность NOP составила 1ns). Йессс! Всем спасибо! А CSL API - в сад! Адназначна! :maniac: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovka1960 0 21 октября, 2010 Опубликовано 21 октября, 2010 (изменено) · Жалоба Если можно - еще вопрос - теперь по программированию DDR2. Есть там битик такой "self-refresh mode" (SR в SDRFG регистре) . По умолчанию он выключен... Включать ли его и что это за режим? В доках от TI об этом ничего.. По крайней мере - в spru970c :unsure: Да... Что-то еще нужно ему для работы с DDRAM - попытка настроить регистры самостоятельно успехом не увенчалась.. И вообще - взглянув в область регистров DDRAM, я с удивлением обнаружил там сплошные нули... Будто бы и области такой нету.. Может чего не включил? Нужный разряд на процессоре в единичке... Может - еще что-то надо ему сказать? Или область регистров (в отличие от описания) лежит не по адресу 0x78000000 ? Ну - с этой "мелочью" разобрался быстро (в PERCFG1 надо было битик поставить).. Но... В общем - в результате работы моих настроек DDRAM как-то работает - но странно. Данные считываются не по тем адресем, по которым пишу. Т.е. в окне Memory пишу, скажем, по адресу 0xE00002D0, а данные появляются в ...2D8 (и вообще - данные считываются с адресом +8 к адресу записи!). Но! Если писать в адрес 2D4 - то все нормально - они там, на месте!... Лажа какая-то.. (пишу 32-разрядными словами) Изменено 21 октября, 2010 пользователем Вовка_Бызов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovka1960 0 22 октября, 2010 Опубликовано 22 октября, 2010 · Жалоба Последние результаты исследования (с осциллографом в руках). Пишем, а затем - читаем по 8 32-разрядных слов. Смотрим адресную шину. DEA02 - нормально (т.е. - сначала длинный 0, потом - длинная 1), DEA01 - тоже норма (0 - 1 - 0 - 1). А вот на DEA00 - постоянный 0! На земле не сидит. Лажа какая-то.. Вот программа инициализации DDR (если это поможет). Не могу понять - что происходит :( void my_ddram_setup ( void ) { /*PERCFG1 - enable DDRAM interface*/ CSL_FINST(((CSL_DevRegs*)CSL_DEV_REGS)->PERCFG1, DEV_PERCFG1_DDR2CTL, ENABLE); /*DMCCTL*/ CSL_FINST (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->DMCCTL, DDR2_DMCCTL_IFRESET, ASSERT); /*SDCFG*/ CSL_FINST (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDCFG, DDR2_SDCFG_NM, 32BIT); CSL_FINST (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDCFG, DDR2_SDCFG_CL, THREE); CSL_FINST (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDCFG, DDR2_SDCFG_IBANK, FOUR); CSL_FINST (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDCFG, DDR2_SDCFG_PAGESIZE, 1024W_PAGE); CSL_FINST (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDCFG, DDR2_SDCFG_TIMUNLOCK, SET); /* SDRFC*/ CSL_FINST (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDRFC, DDR2_SDRFC_SR, EXIT); CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDRFC, DDR2_SDRFC_REFRESH_RATE, 1560); /*SDTIM1*/ CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM1, DDR2_SDTIM1_T_RFC, 20); CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM1, DDR2_SDTIM1_T_RP, 2); CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM1, DDR2_SDTIM1_T_RCD, 2); CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM1, DDR2_SDTIM1_T_WR, 2); CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM1, DDR2_SDTIM1_T_RAS, 7); CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM1, DDR2_SDTIM1_T_RC, 10); CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM1, DDR2_SDTIM1_T_RRD, 2); CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM1, DDR2_SDTIM1_T_WTR, 1); /*SDTIM2*/ CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM2, DDR2_SDTIM2_T_ODT, 0); CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM2, DDR2_SDTIM2_T_SXNR, 22); CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM2, DDR2_SDTIM2_T_SXRD, 199); CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM2, DDR2_SDTIM2_T_RTP, 1); CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDTIM2, DDR2_SDTIM2_T_CKE, 2); CSL_FINST (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->SDCFG, DDR2_SDCFG_TIMUNLOCK, CLEAR); /*DMCCTL*/ CSL_FINS (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->DMCCTL, DDR2_DMCCTL_RL, 4); CSL_FINST (((CSL_Ddr2Regs *) CSL_DDR2_0_REGS)->DMCCTL, DDR2_DMCCTL_IFRESET, RELEASE); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fguy 5 26 октября, 2010 Опубликовано 26 октября, 2010 (изменено) · Жалоба рекомендую взять исходники от дск6455 и разобраться с ними - все есть на сайте спектрумдиджиталс (только на ней проц на 1200 МГц) на дспбиос рекомендую забить - надеюсь сможете сами запрограммировать контроллер прерываний и таймера вкратце по инициализации проца - посмотрите по схеме какие параметры выставлены конфигурационными резисторами и что запаяно в натуре после включения и загрузки программы сначала нужно включить нужную периферию, а потом уже настраивать плл, гпио, емиф м все остальное по вкусу Изменено 26 октября, 2010 пользователем fguy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wator 0 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Ну вот - после непродолжительных изучений sprs276j и sprue56 была составлена прога для инициализации pllc (PLL1). Процессор успешно разогнан на 1 ГГц (по крайней мере - вычисленная по осциллографу длительность NOP составила 1ns). Йессс! Всем спасибо! А CSL API - в сад! Адназначна! :maniac: Подниму тему. Не могу настроить процессор tms320c6455 на частоту 1Ггц. Владимир или еще кто-либо другой, если вы знаете, как, поделитесь, пожалуйста! Попытки поиграться с pllc оказались тщетными! Буду рад любой помощи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 10 сентября, 2015 Опубликовано 10 сентября, 2015 · Жалоба Подниму тему. Не могу настроить процессор tms320c6455 на частоту 1Ггц. Владимир или еще кто-либо другой, если вы знаете, как, поделитесь, пожалуйста! Попытки поиграться с pllc оказались тщетными! Буду рад любой помощи! Когда-то давно использовалась такая функция: int PLL_Init() { CSL_Status status_pllc1; CSL_PllcHwSetup hwSetup_pllc1; CSL_PllcHwSetup hwSetupRead_pllc1; // Initialize the PLLC CSL module status_pllc1 = CSL_pllcInit(0); if(status_pllc1 != CSL_SOK) return 1; // Clear local data structures memset(&pllc1, 0, sizeof(CSL_PllcObj)); // Open the PLLC CSL module hPll1 = CSL_pllcOpen(&pllc1, CSL_PLLC_1, 0, &status_pllc1); if((hPll1 == 0) || (status_pllc1 != CSL_SOK)) return 2; // Setup PLLC hardware parameters hwSetup_pllc1.divEnable = (CSL_BitMask32) CSL_PLLC_DIVEN_PLLDIV4 | CSL_PLLC_DIVEN_PREDIV | CSL_PLLC_DIVEN_PLLDIV5; hwSetup_pllc1.preDiv = 1; hwSetup_pllc1.pllM = 20; hwSetup_pllc1.pllDiv4 = 2; hwSetup_pllc1.pllDiv5 = (Uint32)0x00000002; hwSetup_pllc1.pllMode = CSL_PLLC_PLLCTL_PLLEN_PLL; status_pllc1 = CSL_pllcHwSetup(hPll1, &hwSetup_pllc1); if(status_pllc1 != CSL_SOK) { status_pllc1 = CSL_pllcClose(hPll1); return 3; } // Read back status_pllc1 = CSL_pllcGetHwSetup(hPll1, &hwSetupRead_pllc1); if(status_pllc1 != CSL_SOK) { status_pllc1 = CSL_pllcClose(hPll1); return 4; } // PLL2 Settings CSL_Status status_pllc2; CSL_PllcHwSetup hwSetup_pllc2; CSL_PllcDivideControl arg1_pllc2; CSL_PllcDivRatio arg2_pllc2; CSL_BitMask32 response_pllc2; CSL_BitMask32 argPllCtrl; // Clear local data structures memset(&pllc2, 0, sizeof(CSL_PllcObj)); // Open the PLLC CSL module hPll2 = CSL_pllcOpen(&pllc2, CSL_PLLC_2, 0, &status_pllc2); // Setup PLLC hardware parameters hwSetup_pllc2.divEnable = 0; hwSetup_pllc2.pllDiv1 = 5; hwSetup_pllc2.pllMode = CSL_PLLC_PLLCTL_PLLEN_PLL; CSL_pllcHwSetup(hPll2, &hwSetup_pllc2); // Command to enable PLLDIV4 arg1_pllc2.divNum = CSL_PLLC_DIVSEL_PLLDIV1; arg1_pllc2.divCtrl = CSL_PLLC_PLLDIV_ENABLE; CSL_pllcHwControl(hPll2, CSL_PLLC_CMD_PLLDIV_CONTROL, &arg1_pllc2); // Command to change PLLDIV1 Divider Ratio arg2_pllc2.divNum = CSL_PLLC_DIVSEL_PLLDIV1; arg2_pllc2.divRatio = 5; CSL_pllcHwControl(hPll2, CSL_PLLC_CMD_SET_PLLRATIO, &arg2_pllc2); // Set GOSET bit to change/set the dividers argPllCtrl = 0x010000; // value to set the GOSET bit CSL_pllcHwControl(hPll2, CSL_PLLC_CMD_PLLCONTROL, &argPllCtrl); // Poll for divide-ratio change and clock alignment to complete do { CSL_pllcGetHwStatus (hPll2, CSL_PLLC_QUERY_STATUS, &response_pllc2); } while (response_pllc2 & CSL_PLLC_STATUS_GO); return 0; } Правильность установки частоты проверялась на ноге GP1/SYSCLK4. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться