Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-дек-13 14:11

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: 2014-ноя-10 17:21 
Не в сети

Зарегистрирован: 2014-ноя-10 12:42
Сообщения: 1
Здравствуйте. Столкнулся с ошибкой при работе с данным проектом. Делаю следующие действия:

1. Загружаю проект в CodeMaster.
2. Выполняю до строки ClockConfig();
3. Загружаю и запускаю проект в CCS
4. Пошагово выполняю проект в CodeMaster до строки "RST_CLK->DSP_CLOCK = 2 << RST_CLK_DSP_CLOCK_DSP_C1_SEL_Pos; //DSP_C1_SEL = HSE = 8.192 MHz"

И в этом месте вылетает ошибка: "Аппаратная ошибка #0x0119". Подскажите в чем может быть проблема?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-18 14:07 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 733
Откуда: АО "ПКК Миландр"
Какая маркировка на микросхеме?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-дек-24 14:00 
Не в сети

Зарегистрирован: 2014-ноя-12 09:08
Сообщения: 11
Здравствуйте.Вопрос есть.Используя демо-пример я из ARM ядра с помощью приведённых там функций пишу массив из 500 значений по адресу данных DSP,а как вычитывать эти данные в CodeComposter,чтобы например другому массиву из DSP можно было обращаться к нему и что-то с ним делать?Как сделать,чтобы в те адреса по которым я пишу не задействовал под свои переменные CodeComposter и как потом ARM могло считать результаты обработки этих данных,чтобы ARM знал что одни данные готовы от одних вычеслений и их пора забрать,а как сказать,что другие данные уже готовы и их нужно забрать,т.е. типа прерывания от разных событий в DSP нужно сделать?Есть какое-то описание для этого?Или пример или руководство по программированию ARM и DSP ,например какой синтаксис прерывания,какие есть прагмы и какой их синтаксис?Типа описание может похожее из зарубежных брендов,ведь ARM, DSP это аналоги зарубежных моделей?Ответьте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-июл-23 15:12 
Не в сети

Зарегистрирован: 2012-июн-01 14:12
Сообщения: 38
Доброго времени суток!

Есть вопрос по работе с мостом пересинхронизации в процессоре 1901ВЦ1Т.

Есть основной код.

Код:
void main()
   {
   ConfigClockCoreRISC();
   LoadAndRunDSP();
   while(1);
   }

и процедуры
1)
Код:
void ConfigClockCoreRISC(void)
   {
   RST_CLK->HS_CONTROL = RST_CLK_HS_CONTROL_HSE_ON;

   while((RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_HSE_RDY) != RST_CLK_CLOCK_STATUS_HSE_RDY);
   RST_CLK->CPU_CLOCK = 2 << RST_CLK_CPU_CLOCK_CPU_C1_SEL_Pos;
   RST_CLK->PLL_CONTROL = (6 << RST_CLK_PLL_CONTROL_PLL_CPU_MUL_Pos)
                             | RST_CLK_PLL_CONTROL_PLL_CPU_ON
                          ;

   while((RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_PLL_CPU_RDY) != RST_CLK_CLOCK_STATUS_PLL_CPU_RDY);
   RST_CLK->PER_CLOCK |= 1 << 3;
   EEPROM->CMD = 2 << 3;           
   RST_CLK->PER_CLOCK &= ~(1 << 3);
   RST_CLK->CPU_CLOCK |= (RST_CLK_CPU_CLOCK_CPU_C2_SEL)
                         |((0x7<<RST_CLK_CPU_CLOCK_CPU_C3_SEL_Pos)&RST_CLK_CPU_CLOCK_CPU_C3_SEL_Msk)
                         |((1 << RST_CLK_CPU_CLOCK_HCLK_SEL_Pos)&RST_CLK_CPU_CLOCK_HCLK_SEL_Msk)
                         ;
   }



2)
Код:
void LoadAndRunDSP(void)
   {
   uint16_t * DSP_Pointer;
   if ((RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_HSE_RDY) != RST_CLK_CLOCK_STATUS_HSE_RDY)
      {
      RST_CLK->HS_CONTROL |= RST_CLK_HS_CONTROL_HSE_ON;
      while((RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_HSE_RDY) != RST_CLK_CLOCK_STATUS_HSE_RDY);
      }
   RST_CLK->DSP_CLOCK = 0 << RST_CLK_DSP_CLOCK_DSP_C1_SEL_Pos;
   RST_CLK->PLL_CONTROL |= RST_CLK_PLL_CONTROL_PLL_DSP_ON
                           |(8 << RST_CLK_PLL_CONTROL_PLL_DSP_MUL_Pos)
                           ;
   while((RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_PLL_DSP_RDY) != RST_CLK_CLOCK_STATUS_PLL_DSP_RDY);
   RST_CLK->DSP_CLOCK |= RST_CLK_DSP_CLOCK_DSP_C2_SEL
                         //| RST_CLK_DSP_CLOCK_DSP_C3_SEL
                         | RST_CLK_DSP_CLOCK_DSP_CLK_EN
                         ;

   RST_CLK->DSP_CONTROL_STATUS|=0x8010;   
   RST_CLK->DSP_CONTROL_STATUS&=0xFFF2; 
   while ((RST_CLK->DSP_CONTROL_STATUS & 0x000D) != 0);
   WriteDataDelayDSPMemory();
   sleep_iter(10);
   DSP_CLK->CLKMD = 0x7800;
   while ((DSP_CLK->CLKMD & 0x7800) != 0x7800);
   WriteDataDelayDSPMemory();

   DSP_Pointer = (uint16_t*)(0x30000100); // main
   *DSP_Pointer++ = 0x6bf8 ;WriteDataDelayDSPMemory();
   *DSP_Pointer++ = 0x0080 ;WriteDataDelayDSPMemory();

   DSP_Pointer = (uint16_t*)(0x30020000+0x000D*2); // main
   *DSP_Pointer++ = 0x6bf8 ;WriteDataDelayDSPMemory();
   *DSP_Pointer++ = 0x0080 ;WriteDataDelayDSPMemory();
   *DSP_Pointer++ = 0x0001 ;WriteDataDelayDSPMemory();
   *DSP_Pointer++ = 0x6bf8 ;WriteDataDelayDSPMemory();
   *DSP_Pointer++ = 0x0081 ;WriteDataDelayDSPMemory();
   *DSP_Pointer++ = 0x0001 ;WriteDataDelayDSPMemory();
   *DSP_Pointer++ = 0xf073 ;WriteDataDelayDSPMemory();
   *DSP_Pointer = 0x000d ;WriteDataDelayDSPMemory();

   DSP_Pointer = (uint16_t*)(0x30020000+0xFF80*2); // vector
   *DSP_Pointer++ = 0xF495 ;WriteDataDelayDSPMemory();
   *DSP_Pointer++ = 0xF495 ;WriteDataDelayDSPMemory();
   *DSP_Pointer++ = 0xF073 ;WriteDataDelayDSPMemory();
   *DSP_Pointer = 0x000D ;WriteDataDelayDSPMemory();

   EnableCoreDSP();
   }


3)

void sleep_iter(uint32_t C)
{
while (C--);
}

4) Процедуру WriteDataDelayDSPMemory честно скопипастил из проекта, который нашел на форуме здесь в теме.
Код:
void WriteDataDelayDSPMemory(void)
{
        while((RST_CLK->DSP_CONTROL_STATUS&0x4000)==0);
}


Вопрос в том, что если ставить малое значение для sleep_iter() в функции LoadAndRunDSP; , то DSP_CLK->CLKMD = 0x7800; присваивание, вроде как, не успевает проводится, хотя операции с мостом пересинхронизации вроде закончены (судя по флагу.
Что я не правильно использую?
Может после подачи тактирования на переферию надо ждать, т.к. мост пересинхронизации тоже является переферией DSP со стороны DSP?

P.S.
Естественно память у меня не пишется. и до запуска DSP дело не доходит.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-июл-27 15:57 
Не в сети

Зарегистрирован: 2012-июн-01 14:12
Сообщения: 38
Выяснил, что присвоение
Код:
DSP_CLK->CLKMD |= 0x6000;

необходимо проводить ЧЕРЕЗ НЕКОТОРОЕ время после снятия сброса
Код:
RST_CLK->DSP_CONTROL_STATUS&=0xFFF2;

если этот сброс следует сразу за настройкой тактирования DSP ядра
Код:
RST_CLK->DSP_CLOCK |= RST_CLK_DSP_CLOCK_DSP_C2_SEL
                                   //| RST_CLK_DSP_CLOCK_DSP_C3_SEL
                                   | RST_CLK_DSP_CLOCK_DSP_CLK_EN
                                   ;

Но если между установкой тактовой частоты и устранением сброса ядра DSP прошло некоторое время (sleep_iter(10)), то присвоение проходит нормально
Код:
   RST_CLK->DSP_CLOCK |= RST_CLK_DSP_CLOCK_DSP_C2_SEL
                         //| RST_CLK_DSP_CLOCK_DSP_C3_SEL
                         | RST_CLK_DSP_CLOCK_DSP_CLK_EN
                         ;
   sleep_iter(10); // !!!!!
   RST_CLK->DSP_CONTROL_STATUS|=0x8010;
   RST_CLK->DSP_CONTROL_STATUS&=0xFFF2;
   DSP_CLK->CLKMD |= 0x6000;

Необходимое время ожидания ответить затрудняюсь, так как не исследовал его зависимость от частот ядер, задержки доступа к FLASH памяти у RISC.

Единственное,что нашел в спецификации в разделе "16.6 Функционирование DSP ядра после сброса"
Цитата:
Для правильной системной операции после подачи синхпросигнала, в течении нескольких тактов бит RST_DSP_MEM должен находится в исходном состоянии.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB