Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 104 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 7  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: 2011-июн-03 15:37 
Не в сети

Зарегистрирован: 2011-июн-03 12:24
Сообщения: 5
Имеется вопрос, суть такова: как только разрешаю в NVIC прерывание от DMA, контроллер сразу влетает в его обработчик. Причем независимо от того, включен ли собственно DMA контроллер (в RST_CLK), настроен ли он и т.д. Сбросить источник прерывания я так и не смог.

Уточню: будучи разрешено, прерывание срабатывает постоянно, будто линия запроса на него жестко притянута к активному уровню.

Подскажите, пожалуйста, в чем может быть проблема?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-июн-27 07:48 
Не в сети

Зарегистрирован: 2010-янв-13 14:39
Сообщения: 16
Откуда: АО "ПКК Миландр"
А проблема заключается в том, что изначально несколько каналов DMA подтянуты в 1(т.е. находятся в активном состоянии), в результате и возникает запрос прерывания от DMA, все это снимается подачей частоты на блок DMA, и соответственно, чтобы контроллер прерываний не обрабатывал этих ложных прерываний необходимо сбросить NVIC с использование регистров ICPR0, ICER0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-июн-27 08:51 
Не в сети

Зарегистрирован: 2010-янв-13 14:39
Сообщения: 16
Откуда: АО "ПКК Миландр"
Небольшое дополнение к выше сказанному, еще необходимо подать частоту на блоки инициирующие ложные запросы, это блоки SSP1,2.


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

Зарегистрирован: 2011-июн-03 12:24
Сообщения: 5
Цитата:
Небольшое дополнение


Дополнение как раз ключевое, ибо без этого пункта ничего не получилось.

Спасибо за помощь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-июл-01 12:47 
Не в сети

Зарегистрирован: 2011-июн-03 12:24
Сообщения: 5
Вопрос вдогонку.

Речь идет о контроллере 3й ревизии.

Разрешаю в NVIC прерывание от DMA.
Инициализирую контроллер АЦП.
Взвожу бит ADC1_CFG_Cfg_REG_GO.
Получаю ситуацию, аналогичную описанной выше, т.е. контроллер сразу после этого влетает в обработчик DMA и циклически его выполняет.
И это несмотря на то, что, судя по документации, от АЦП вообще нет аппаратного запроса на DMA!
(я знаю, что в этой же теме написано, что запросы добавлены, но в документации не отражено ни этого факта, ни информации о том, что и куда надо писать, чтобы управлять ими).

С контроллером 2й ревизии данной проблемы не наблюдаю.

Что посоветуете?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-июл-05 10:58 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1282
Откуда: АО "ПКК Миландр"
SilGe писал(а):
Вопрос вдогонку.

Речь идет о контроллере 3й ревизии.

Разрешаю в NVIC прерывание от DMA.
Инициализирую контроллер АЦП.
Взвожу бит ADC1_CFG_Cfg_REG_GO.
Получаю ситуацию, аналогичную описанной выше, т.е. контроллер сразу после этого влетает в обработчик DMA и циклически его выполняет.
И это несмотря на то, что, судя по документации, от АЦП вообще нет аппаратного запроса на DMA!
(я знаю, что в этой же теме написано, что запросы добавлены, но в документации не отражено ни этого факта, ни информации о том, что и куда надо писать, чтобы управлять ими).


С контроллером 2й ревизии данной проблемы не наблюдаю.

Что посоветуете?


8 канал - аппаратный запрос от ADC1
9 канал - аппаратный запрос от ADC2

При взводе флага завершения преобразования генерируется запрос, который снимается считыванием результата. В документации пока не внесли эту информацию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-июл-05 13:00 
Не в сети

Зарегистрирован: 2011-июн-03 12:24
Сообщения: 5
Спасибо.
Хотелось бы еще узнать, каким образом эти запросы маскировать/отключить. Ибо манипуляции с регистрами
DMA->CHNL_ENABLE_CLR,
DMA->CHNL_REQ_MASK_SET,
как ни странно, эффекта не возымели (как, впрочем, и в случае с SSP). Тактовая частота на АЦП, естественно, подана.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-июл-08 11:32 
Не в сети

Зарегистрирован: 2010-янв-13 14:39
Сообщения: 16
Откуда: АО "ПКК Миландр"
Здесь получается следующая ситуация, вы взводите бит ADC1_CFG_Cfg_REG_GO, который запускает преобразование, когда результат готов, формируется запрос DMA sreq. В описании блока DMA в спецификации написано:
"Если dma_sreq[C] установлен в 1, то контроллер устанавливает dma_done[C] в 1 при условии что dma_waitonreq[C] в 1 и chnl_useburst_set[C] в состоянии 0. Это позволяет контроллеру показать центральному процессору запрос готовности, даже если канал выключен (запрещен)." Т.е. в результате запроса sreq, несмотря на то, что канал запрещен, формируется 1 на dma_done, следовательно возникает прерывание от блока DMA. В этой ситуации интерфейсы отрабатывают честно. Манипуляции с регистрами DMA->CHNL_ENABLE_CLR, DMA->CHNL_REQ_MASK_SET не замаскируют формирование dma_done. Именно в случае с блоком АЦП это можно обойти запретив обработку запросов одиночных передач (sreq) установкой соответствующего бита в регистре CHNL_USEBURST_SET. В остальных периферийных блоках это делается проще, путем запрещения формирования DMA запросов в самих блоках, например в SSP это регистр SSP_DMACR.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-июл-08 12:55 
Не в сети

Зарегистрирован: 2011-июн-03 12:24
Сообщения: 5
Спасибо, помогло.

Однако, хотелось бы отметить пару моментов.

Во-первых, в документации, доступной на сайте, фраза

Цитата:
Если dma_sreq[C] установлен в 1, то контроллер устанавливает dma_done[C] в 1 при условии что dma_waitonreq[C] в 1 и chnl_useburst_set[C] в состоянии 0.


звучит как

"Если dma_sreq[C] установлен в 1, то контроллер устанавливает dma_done[C] в 1 одновременно удерживая dma_waitonreq[C] в 1 и chnl_useburst_set[C] в состоянии 0."

что, на мой взгляд, имеет несколько иной смысл.

Во-вторых, в той же документации присутствует фраза

"Когда chnl_req_mask_set[C] установлен в 1, контроллер игнорирует запросы по dma_sreq[C] и dma_req[C]."

в связи с чем "честность" отработки ситуации интерфейсами для меня не очевидна. Маскировать я пытался не dma_done, а dma_sreq[C] и dma_req[C].

В любом случае, большое спасибо за помощь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-июл-08 13:17 
Не в сети

Зарегистрирован: 2010-янв-13 14:39
Сообщения: 16
Откуда: АО "ПКК Миландр"
Относительно момента с фразой, спецификация будет подправлена, просто не правильно выполнен перевод, на это я уже обратила внимание.
По поводу второго момента, контроллер игнорирует запросы в плане выполнения необходимых передач, но реагирует на их появление, изменяя сигнал dma_done (он же должен как то сообщить центральному процессору об этом), а именно dma_done и заводится (вместе с dma_error) на 5 IRQ контроллера прерываний.


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

Зарегистрирован: 2010-июн-09 19:35
Сообщения: 38
Вопрос:

Настроил DMA от таймера работающего в режиме захвата. При исчерпании числа пересылок DMA останавливается, но запрос продолжает висеть. Далее останавливаю таймер и переинициализирую DMA, при этом происходит ненужная мне пересылка. Собственно вопрос: какой самый простой способ снять запрос DMA от таймера после того как канал остановился выполнив все пересылки?


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

Зарегистрирован: 2011-дек-27 08:33
Сообщения: 108
Откуда: АО "ПКК Миландр"
Денис писал(а):
Вопрос:

Настроил DMA от таймера работающего в режиме захвата. При исчерпании числа пересылок DMA останавливается, но запрос продолжает висеть. Далее останавливаю таймер и переинициализирую DMA, при этом происходит ненужная мне пересылка. Собственно вопрос: какой самый простой способ снять запрос DMA от таймера после того как канал остановился выполнив все пересылки?


Запрос DMA от таймера сбрасывается активизацией канала DMA привязанного к таймеру, т.е. вручную его сбрасывать не надо. В Вашей ситуации не ясно, по какой причине запрос остается не сброшенным. Если есть возможность выложите пример на форуме или пришлите мне hamizov.r@ic-design.ru.


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

Зарегистрирован: 2010-июн-09 19:35
Сообщения: 38
ruslan.h писал(а):
Денис писал(а):

Запрос DMA от таймера сбрасывается активизацией канала DMA привязанного к таймеру, т.е. вручную его сбрасывать не надо. В Вашей ситуации не ясно, по какой причине запрос остается не сброшенным. Если есть возможность выложите пример на форуме или пришлите мне hamizov.r@ic-design.ru.


Таймер №1 настроен на захват по каналу №1. Все прекрасно захватывается и в массив пересылаются значения CCR1. Периодически (раз в 25 мс) выполняется примерно такой код:

timer->TIM_CNTRL&=0xFFFFFFFE;
DMA_Cmd(10, DISABLE);
DMA_Init(10 &DMA_InitStr);
timer->TIM_CNT=0;
DMA_Init(10, &DMA_InitStr);
timer->TIM_CNTRL|=1;


Функция DMA_Init вызывается дважды, так как иначе (в случае исчерпания пересылок) в нулевой элемент массива попадет ненужная пересылка и там и останется. Если исчерпания пересылок не происходит, то второй вызов можно не делать, все работает и так. Функция DMA_Init - из вашей библиотеки, правда файл косметически модифицирован для компиляции гнушным компилятором под uos. Позже, могу выслать и весь исходник, но там ничего интересного - просто инициализация таймера и ДМА.


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

Зарегистрирован: 2011-дек-27 08:33
Сообщения: 108
Откуда: АО "ПКК Миландр"
Денис писал(а):
Таймер №1 настроен на захват по каналу №1. Все прекрасно захватывается и в массив пересылаются значения CCR1. Периодически (раз в 25 мс) выполняется примерно такой код:

timer->TIM_CNTRL&=0xFFFFFFFE;
DMA_Cmd(10, DISABLE);
DMA_Init(10 &DMA_InitStr);
timer->TIM_CNT=0;
DMA_Init(10, &DMA_InitStr);
timer->TIM_CNTRL|=1;


Функция DMA_Init вызывается дважды, так как иначе (в случае исчерпания пересылок) в нулевой элемент массива попадет ненужная пересылка и там и останется. Если исчерпания пересылок не происходит, то второй вызов можно не делать, все работает и так. Функция DMA_Init - из вашей библиотеки, правда файл косметически модифицирован для компиляции гнушным компилятором под uos. Позже, могу выслать и весь исходник, но там ничего интересного - просто инициализация таймера и ДМА.


Повторил Вашу ситуацию. Действительно лишний запрос DMA от таймера возможен.
Для пользователей, которые не сталкивались с данной проблемой, поясню механизм появления ситуации. Если при не активном DMA (счетчик передач n_minus_1 = 0) от таймера продолжают поступать запросы на передачу, то флаг запроса остается всегда установленным. Как только происходит инициализация управляющей структуры, DMA захватывает данные лежащие в регистре CCR2 (точнее данные по адресу Source_end_pointer управляющей структуры), которые остались с предыдущего цикла работы. При чем эта передача может произойти даже при сброшенном бите CNT_EN.
Программно сбросить флаг запроса DMA к сожалению не возможно.
Механизмов обхода пока два:
- запрещать выдачу запроса DMA в случае если управляющая структура не подготовлена к работе;
- как делает Денис т.е. дважды инициализировать управляющую структуру, чтоб пропустить левую передачу.


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

Зарегистрирован: 2012-июл-19 07:20
Сообщения: 14
Добрый день!

Подскажите пожалуйста возможно ли реализовать пересылку данных например из памяти в порт при этом добавив какое либо значение?
Или из порта в порт?


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

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


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

Сейчас этот форум просматривают: Google [Bot] и гости: 8


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

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