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

Тестовый пример проекта для TMS320C6455

И все же - возвращаясь к началу.

Из чего должен состоять первый (самый что ни на есть простой) пример?

 

Скажем - мне надо удостоверится, что все крутится и тупо вывести на какой-то 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...

Изменено пользователем Вовка_Бызов

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


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

Ладно - разобрались сами. выяснилось, что 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:

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


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

Теперь - вопрос по GPIO. Смотрел пример из CSL. Смотрел функции API для GPIO. Как-то все заумно. Открыть сессию, закрыть сессию.. Бррр. Более того - в примере csl есть обращение непосредственно к регистрам с помощью макросов CSL_FINST.

В общем - нельзя ли по-проще, только макросами?

Буду рад помощи :laughing:

А не проще ли Вам просто самому написать свой макрос, прочитайте мануал по какому адресу лежат регистры настройки и управления GPIO. TI предоставляет подробную документацию, там черным по белому английским буквами все написано ;)

Проще некуда же

*pAddressGPIO ^= (1 << (BIT))

P.S. лично я на CSL забил

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


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

А не проще ли Вам просто самому написать свой макрос, прочитайте мануал по какому адресу лежат регистры настройки и управления GPIO. TI предоставляет подробную документацию, там черным по белому английским буквами все написано ;)

Проще некуда же

*pAddressGPIO ^= (1 << (BIT))

P.S. лично я на CSL забил

alexeyv, в принципе, правильно утверждал, что использование символических имен регистров и макросов их установки существенно улучшает переносимость кода.

API CSL - безусловно нафиг, но вот базис API - макросы и символические имена - применять, ИМХО, полезно. Тем более - их трансляция приводит к тем же простым конструкциям.

 

Поэтому и ищу описание подробное. Но - между делом - изучаю spru584a.pdf (General-Purpose Input/Output (GPIO) Reference Guide). Одно другое не исключает. :rolleyes:

 

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


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

Ну - с регистрами и макросами более-менее разобрались...

 

Теперь надо бы выяснить, какое реальное быстродействие может обеспечить 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 не хочется лезть...) ?

Изменено пользователем Вовка_Бызов

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


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

Теперь надо бы выяснить, какое реальное быстродействие может обеспечить C6455. Как разогнать ядро, чтобы такт изменения GPIO пина был больше, чем 240 nS? Или - 5 МГц - это и есть тактовая частота процессора в режиме выполнения кода без кэша? Что-то уж больно мало... Где же они, хваление гигагерцы? :crying:

А если подумать, кто вам обещал дергать ножкой на частоте процессора то а?

Если хотети посмотреть работу PLL надо не GPIO дергать, а использовать, если есть, специальную ножку типа "CLKOUT", а ножко-дрыгатель хорош, чтобы тик таймера смотреть.

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


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

А если подумать, кто вам обещал дергать ножкой на частоте процессора то а?

Если хотети посмотреть работу 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 (было вычислено путем примерной оценки длительности вносимой задержки и вычитания из общего периода).

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


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

Ну - с регистрами и макросами более-менее разобрались...

Или все же в настройки 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.

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


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

Проверьте бит PLLCTL.[0] и в соответсвии с SPRS276J настройте как надо все параметры PLL до вашей частоты 1000 или 1200 или 720 или 850.

Спасибо! Щас нарисую собственную настройку PLL. Нашел строгую последовательность и параметры.

Вопрос по существу дела. Перед началом установки по инструкции требуется сделать задержку (после PowerUp) на время стабилизации PLL. Так вот - во-первых, время стабилизации указано как "не менее 150 мкс" - какое же принимать? - во вторых - как принято у этих процессоров делать задержки такие? Не включать же таймер... Хотя - может и так... Или накрутить кучу asm(" NOP 9") в цикле? Но - тогда сколько? Какая тактовая после PowerUp устанавливается?

Изменено пользователем Вовка_Бызов

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


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

Ну вот - после непродолжительных изучений sprs276j и sprue56 была составлена прога для инициализации pllc (PLL1). Процессор успешно разогнан на 1 ГГц (по крайней мере - вычисленная по осциллографу длительность NOP составила 1ns). Йессс!

 

Всем спасибо!

 

А CSL API - в сад! Адназначна! :maniac:

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


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

Если можно - еще вопрос - теперь по программированию DDR2. Есть там битик такой "self-refresh mode" (SR в SDRFG регистре) . По умолчанию он выключен... Включать ли его и что это за режим? В доках от TI об этом ничего.. По крайней мере - в spru970c :unsure:

 

Да... Что-то еще нужно ему для работы с DDRAM - попытка настроить регистры самостоятельно успехом не увенчалась..

И вообще - взглянув в область регистров DDRAM, я с удивлением обнаружил там сплошные нули... Будто бы и области такой нету.. Может чего не включил?

 

Нужный разряд на процессоре в единичке... Может - еще что-то надо ему сказать? Или область регистров (в отличие от описания) лежит не по адресу 0x78000000 ?

 

Ну - с этой "мелочью" разобрался быстро (в PERCFG1 надо было битик поставить).. Но... В общем - в результате работы моих настроек DDRAM как-то работает - но странно. Данные считываются не по тем адресем, по которым пишу. Т.е. в окне Memory пишу, скажем, по адресу 0xE00002D0, а данные появляются в ...2D8 (и вообще - данные считываются с адресом +8 к адресу записи!). Но! Если писать в адрес 2D4 - то все нормально - они там, на месте!... Лажа какая-то.. (пишу 32-разрядными словами)

Изменено пользователем Вовка_Бызов

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


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

Последние результаты исследования (с осциллографом в руках). Пишем, а затем - читаем по 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);
}

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


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

рекомендую взять исходники от дск6455 и разобраться с ними - все есть на сайте спектрумдиджиталс (только на ней проц на 1200 МГц)

на дспбиос рекомендую забить - надеюсь сможете сами запрограммировать контроллер прерываний и таймера

вкратце по инициализации проца - посмотрите по схеме какие параметры выставлены конфигурационными резисторами и что запаяно в натуре

после включения и загрузки программы сначала нужно включить нужную периферию, а потом уже настраивать плл, гпио, емиф м все остальное по вкусу

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

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


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

Ну вот - после непродолжительных изучений sprs276j и sprue56 была составлена прога для инициализации pllc (PLL1). Процессор успешно разогнан на 1 ГГц (по крайней мере - вычисленная по осциллографу длительность NOP составила 1ns). Йессс!

 

Всем спасибо!

 

А CSL API - в сад! Адназначна! :maniac:

Подниму тему. Не могу настроить процессор tms320c6455 на частоту 1Ггц. Владимир или еще кто-либо другой, если вы знаете, как, поделитесь, пожалуйста! Попытки поиграться с pllc оказались тщетными! Буду рад любой помощи!

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


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

Подниму тему. Не могу настроить процессор 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.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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