Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 104 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.
Автор Сообщение
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2015-июл-14 09:58 
Не в сети

Зарегистрирован: 2013-дек-23 10:34
Сообщения: 15
Откуда: ПАО Техприбор Санкт-Петербург
Столкнулся со следующей проблемой. После включения прерывания от DMA обработчик прерывания вызывается непереставая.
Код:
    // Enable DMA IRQ
    NVIC_EnableIRQ(DMA_IRQn);

    // Enable SSP1
    SSP_Cmd(MDR_SSP1, ENABLE);

    // Enable DMA channel SSP1
    DMA_Cmd(DMA_Channel_SSP1_RX, ENABLE);

    SSP_DMACmd(MDR_SSP1,SSP_DMA_RXE,ENABLE);

    PORT_SetBits(MDR_PORTC, PORT_Pin_1);

До поднятия пина программа не доходит никогда. Бесконечно крутится в обработчике. Причём обработчик вызывается даже при полном отсутствии причин его вызвать. Тоесть сигнала по SSP нет. Данные не идут. Срабатывать не на что по идее. Почитав советы изложенные в здесь каждый вызов обработчика сопроводил следующими мантрами
Код:
    // Enable SSP1
    SSP_Cmd(MDR_SSP1, ENABLE);

    SSP_DMACmd(MDR_SSP1,SSP_DMA_RXE,ENABLE);

    // Enable DMA channel SSP1
    DMA_Cmd(DMA_Channel_SSP1_RX, ENABLE);

Помогите разобраться в проблеме. Очень нужны прерывания от DMA.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2015-июл-14 10:12 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 393
Цитата:
Срабатывать не на что по идее.

Уверены? Как насчет Errata Ошибка 7.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2015-июл-14 10:18 
Не в сети

Зарегистрирован: 2013-дек-23 10:34
Сообщения: 15
Откуда: ПАО Техприбор Санкт-Петербург
И как быть? :(
Я так понял что чтобы я не делал помимо моих прерываний их будет ещё вызывать АЦП


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2015-июл-27 08:55 
Не в сети

Зарегистрирован: 2014-сен-17 12:19
Сообщения: 37
Откуда: СПб
DzetaHunter писал(а):
И как быть? :(
Я так понял что чтобы я не делал помимо моих прерываний их будет ещё вызывать АЦП

Я в своем проекте делаю такое вступление в функции инициализации:
Код:
/* Инициализация канала DMA */
void DMAInit(void)
{
   /* Подача такта на эти модули НЕОБХОДИМА для корректной работы модуля DMA,
    * поскольку будучи отключенными они удерживают активный уровень на запросе
    * обслуживания DMA */
   MDR_RST_CLK->PER_CLOCK |= RST_CLK_PER_CLOCK_SSP1_EN | RST_CLK_PER_CLOCK_SSP2_EN;
   /* модули SSP1 и SSP2 возводили в активный уровень запрос на прерывание по DMA,
    * поэтому его нужно стереть перед разрешением, чтобы он не провалился в прерывание */
   NVIC_ClearPendingIRQ(DMA_IRQn);

/* далее идет мой код.. */

:)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2016-фев-05 01:07 
Не в сети

Зарегистрирован: 2015-авг-18 12:11
Сообщения: 7
Здравствуйте.
Из материалов форума и errata на 1986ВЕ9х очевидно, что с ADC можно работать через DMA. Однако, в основном описании 1986ВЕ9х до сих пор об этом ничего не сказано. В связи с этим прошу пояснить:

- актуальна ли до сих пор информация, представленная на форуме 05.07.2011 (номера каналов DMA и условия генерации запроса);
- можно ли в м/сх 1986ВЕ9х использовать режим "ADC через DMA" для ответственных применений, или же это придётся делать на свой страх и риск, без гарантий фирмы "Миландр"?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2016-фев-09 12:24 
Не в сети

Зарегистрирован: 2015-авг-18 12:11
Сообщения: 7
Здравствуйте ещё раз.
Хотелось бы получить ответ на вопросы выше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2016-фев-09 14:53 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1280
Откуда: АО "ПКК Миландр"
IgorrAS писал(а):
Здравствуйте.
Из материалов форума и errata на 1986ВЕ9х очевидно, что с ADC можно работать через DMA. Однако, в основном описании 1986ВЕ9х до сих пор об этом ничего не сказано. В связи с этим прошу пояснить:

- актуальна ли до сих пор информация, представленная на форуме 05.07.2011 (номера каналов DMA и условия генерации запроса);
- можно ли в м/сх 1986ВЕ9х использовать режим "ADC через DMA" для ответственных применений, или же это придётся делать на свой страх и риск, без гарантий фирмы "Миландр"?



Контроллер АЦП1 генерирут запрос sreq для 8 канала DMA, АЦП2 генерирует запрос sreq для 9 канала.
Каналы 8 и 9 закреплены за АЦП и могут использоваться.
Проблема в том, что данные запросы не блокируются в самих контроллерах АЦП, но это описано в 0007 ерраты.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2016-фев-09 16:10 
Не в сети

Зарегистрирован: 2015-авг-18 12:11
Сообщения: 7
-=Sergei=- писал(а):
IgorrAS писал(а):
Здравствуйте.
Из материалов форума и errata на 1986ВЕ9х очевидно, что с ADC можно работать через DMA. Однако, в основном описании 1986ВЕ9х до сих пор об этом ничего не сказано. В связи с этим прошу пояснить:

- актуальна ли до сих пор информация, представленная на форуме 05.07.2011 (номера каналов DMA и условия генерации запроса);
- можно ли в м/сх 1986ВЕ9х использовать режим "ADC через DMA" для ответственных применений, или же это придётся делать на свой страх и риск, без гарантий фирмы "Миландр"?



Контроллер АЦП1 генерирут запрос sreq для 8 канала DMA, АЦП2 генерирует запрос sreq для 9 канала.
Каналы 8 и 9 закреплены за АЦП и могут использоваться.
Проблема в том, что данные запросы не блокируются в самих контроллерах АЦП, но это описано в 0007 ерраты.



Спасибо за ответ.
Означает ли это, что игнорирование режима "ADC через DMA" в основном описании продолжается сознательно и связано только с отсутствием блокировки запроса? Что никаких других проблем с этим режимом нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2016-фев-09 16:35 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1280
Откуда: АО "ПКК Миландр"
IgorrAS писал(а):
Спасибо за ответ.
Означает ли это, что игнорирование режима "ADC через DMA" в основном описании продолжается сознательно и связано только с отсутствием блокировки запроса? Что никаких других проблем с этим режимом нет?


Заявка в багзиле на правку спецификации висит с 2015-11-18 11:32:39 за номером 1185.
Думаю в ближайшее время поправят.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2016-фев-10 10:22 
Не в сети

Зарегистрирован: 2011-сен-05 12:12
Сообщения: 177
Откуда: Саратов
По мере знакомства с DMA (ПДП) возник вопрос: а зачем он такой сложный и запутанный нужен?
Прерывания от ПДП свалены в одну кучу и нет возможности быстро и точно определить причину прерывания, поэтому использовать много каналов одновременно - неудобно.
Для чего можно использовать крутейший режим с изменением конфигурации - никак не могу понять, может кто-нибудь дать хоть какой-то реальный пример.
Но, например, типовая задача: по событию от внешнего устройства считать регистр результата в буфер, записать в конфиг устройства новые значения из другого буфера и запустить его на новое исполнение до следующего события, после обработки N событий вызвать прерывание - у меня никак не получается. Использование костылей в виде событий от таймера, мягко говоря, неудобно и приводит к размножению прерываний от ПДП.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2016-мар-26 12:53 
Не в сети

Зарегистрирован: 2016-мар-26 12:46
Сообщения: 19
Добрый день.
Только осваиваю 1986ВЕ92, так что сильно не пинайте. Написал программу работы с UART1 для работы в режиме отладки (в RAM) и боевой вариант (FLASH). Передачу делаю с использованием DMA. Проект прекрасно работает (принимает и передает) в режиме отладки, а в боевом варианте пакеты принимаю и "отвечаю", но только UART1 молчит. Что я делаю не так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2016-мар-27 13:27 
Не в сети

Зарегистрирован: 2016-мар-26 12:46
Сообщения: 19
Спасибо, данную проблему решил. Появилась новая. Для приема использую FIFO с порогом срабатывания прерывания 1/8. Все прекрасно работает пока приходят пакеты с четным количеством байт. Если нечетное - обрезает последний байт, при этом смотрю в отладчике бит RXFE=1, т.е. FIFO пуст, но в DR, при этом, лежит не принятый байт. Как решить эту проблему?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2016-май-04 17:20 
Не в сети

Зарегистрирован: 2014-дек-19 11:27
Сообщения: 6
Добрый день. Имеется задача, прошу подсказать путь решения.
Задача:
Модуль SSP1 работает в ведомом режиме. Получает от внешнего устройства (АЦП) посылки.
От DMA требуется принять 50 посылок по SSP1, скопировать их в массив, после заполнения массива (50 ячеек) завершить цикл DMA, вызвать прерывание. Задача усложняется тем, что одновременно с копированием данных из SSP1 в массив требуется скопировать из другого массива данные в порт PB (управление аналоговыми ключами).
Был опробован следующий подход:
Канал 5 DMA (SSP1_RX) настроен на запись в регистр MDR_DMA->CHNL_SW_REQUEST слова, содержащие 1 в битах 16 и 17 (для программного запуска каналов 16, 17 DMA). Канал 16 DMA настроен на передачу из SSP1->DR в массив. Канал 17 DMA настроен на передачу из массива в регистр MDR_PORTB->RXTX. В результате получаем заполнение массива в 2 раза быстрее расчетного. При отладке видно, что в массив данных из SSP1->DR записываются корректные значения через 1 ячейку.
Убираем задачу с копированием данных в порт PB. Настраиваем канал 5 DMA на передачу из SSP1->DR в массив. Все работает.
Как я понял, в случае работы канала 5 с регистром MDR_DMA->CHNL_SW_REQUEST получается следующее:
1) DMA обрабатывает канал 5, записывает в MDR_DMA->CHNL_SW_REQUEST, после чего устанавливает dma_active[C] в 0;
2) канал 16 DMA не успевает скопировать данные из SSP1->DR, модуль SSP1 видит что канал 5 закончил работу, но данные в буфере еще есть и вызывает еще одно dma_sreq[C].
На данный момент сигнал с порта SSP1_FSS завел на порт таймера, работающего в режиме захват, по dma_sreq[C] от таймера копирую данные в MDR_PORTB->RXTX. Есть желание избавится от этого костыля (лишняя цепь, да и таймеры все нужны). Рассмотрел режим «Исполнение с изменением конфигурации», если правильно понял то он не совсем подойдет, данный режим будет вызывать прерывание после каждой пересылке данных из SSP1->DR, последующей пересылке данных в MDR_PORTB->RXTX.
Прошу подсказать подходящий режим, настройку контроллера DMA.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2016-дек-15 14:57 
Не в сети

Зарегистрирован: 2016-янв-22 15:45
Сообщения: 21
Здравствуйте.
Я работаю с микроконтроллером 1986ВЕ91Т. Программирую работу SPI ,используя DMA и его режим PingPong.
Я настроил каналы DMA - DMA_Channel_SSP2_RX на приём и DMA_Channel_SSP2_TX на передачу и запустил команду SSP_Cmd(MDR_SSP2, ENABLE) - выполняется цикл DMA на прием и цикл DMA на передачу(1 раз).
Но после этого программа попадает в обработчик прерываний DMA_IRQHandler(). Программа постоянно туда попадает. Не сразу после включения прерывания NVIC_EnableIRQ(DMA_IRQn), а когда включаю SPI2 - SSP_Cmd(MDR_SSP2, ENABLE).
Однако, я не понимаю почему программа постоянно заходит в обработчик прерываний после выполнения первого цикла DMA.
Я пытался в обработчике прерываний запустить следующий цикл DMA, однако ничего не получилось.
Насколько я понял, для того,чтобы это сделать, нужно сначала устранить причину, по которой программа постоянно находится в обработчике прерываний и после этого запустить канал DMA.

Манипуляции с регистрами MDR_DMA->CHNL_REQ_MASK_SET , MDR_DMA->CHNL_ENABLE_CLR,MDR_DMA->CHNL_USEBURST_CLR успеха не принесли. То есть, программа постоянно в обработчике прерываний и следующий цикл DMA не запускается.
Код:
void DMA_IRQHandler()
{
     if ((MDR_DMA->CHNL_ENABLE_SET & DMA_Channel_SSP2_TX) == 0)
     {
       if (MDR_SSP2->DMACR & SSP_DMACR_TXDMAE)
       {
            if (!(DMA_ControlTable[DMA_Channel_SSP2_TX].DMA_Control & 0x3))                                           
            {
                  /* CHNL_PRI_ALT_SET = 1 Используется альтернативная конфигурация (получены значения с основной конфигурации) */
                  /* Обновляются значения в основной конфигурации */
               if (((MDR_DMA->CHNL_PRI_ALT_SET >> DMA_Channel_SSP2_TX) & 1) == 1)
                  DMA_ControlTable[DMA_Channel_SSP2_TX].DMA_Control |= (64 << 4) | DMA_Mode_PingPong;
               MDR_DMA->CHNL_ENABLE_SET = (1 << DMA_Channel_SSP2_TX);
            }
            if (!(DMA_ControlTable[DMA_Channel_SSP2_TX+32].DMA_Control & 0x3))                                           
            {
                 /* CHNL_PRI_ALT_SET = 0 Используется основная конфигурация (получены значения с альтернативной конфигурации) */
                 /* Обновляются значения в альтернативной конфигурации */
               if (((MDR_DMA->CHNL_PRI_ALT_SET >> DMA_Channel_SSP2_TX) & 1) == 0)
                    DMA_ControlTable[DMA_Channel_SSP2_TX+32].DMA_Control |= (64 << 4) |DMA_Mode_PingPong;
               MDR_DMA->CHNL_ENABLE_SET = (1 << DMA_Channel_SSP2_TX);
            }
       }
   }

   if ((MDR_DMA->CHNL_ENABLE_SET & DMA_Channel_SSP2_RX) == 0)
   {
      if (MDR_SSP2->DMACR & SSP_DMACR_RXDMAE)
      {
          if (!(DMA_ControlTable[DMA_Channel_SSP2_RX].DMA_Control & 0x3))                                             
          {
             if (((MDR_DMA->CHNL_PRI_ALT_SET >> DMA_Channel_SSP2_RX) & 1) == 1)
               DMA_ControlTable[DMA_Channel_SSP2_RX].DMA_Control |= (64 << 4) | DMA_Mode_PingPong;
                  MDR_DMA->CHNL_ENABLE_SET = (1 << DMA_Channel_SSP2_RX);
         }
         if (!(DMA_ControlTable[DMA_Channel_SSP2_RX+32].DMA_Control & 0x3))                                           
         {
             if (((MDR_DMA->CHNL_PRI_ALT_SET >> DMA_Channel_SSP2_RX) & 1) == 0)   
               DMA_ControlTable[DMA_Channel_SSP2_RX+32].DMA_Control |= (64 << 4) | DMA_Mode_PingPong;
             MDR_DMA->CHNL_ENABLE_SET = (1 << DMA_Channel_SSP2_RX);
        }
      }
   }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2016-дек-15 15:06 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 393
Почитайте еррату, ошибка №7. Может ваш случай?

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


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

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


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

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


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

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