Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: вопрос по DMA
СообщениеДобавлено: 2014-ноя-17 08:56 
Не в сети

Зарегистрирован: 2014-ноя-17 08:47
Сообщения: 103
Здравствуйте уважаемые разработчики
интересует вопрос по нормальной работе DMA
у вас в описании на МК 1986ВЕ1Т даны 3 пункта при которых DMA должна нормально функционировать
1)chnl_enable_set[c] и master_enable[c]
2)chnl_req_mask_set[c]
3)int_test_en_bit
первые 2 пункта я в описании нашел, а вот 3 никак не могу найти и контроллер находится все время в тестовом режиме
хотелось бы узнать как сбросить этот бит по уже имеющимся регистрам или может у этого бита в регистре есть адрес?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-ноя-17 21:04 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
rubygoblin писал(а):
а вот 3 никак не могу найти и контроллер находится все время в тестовом режиме

а как вы поняли (критерии), что контроллер находится в тестовом режиме?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-ноя-18 09:58 
Не в сети

Зарегистрирован: 2014-ноя-17 08:47
Сообщения: 103
в статусном регистре DMA статусное поле [31..28] TEST_STATUS равно 0x1 а должно равняться 0x0
это так в описании регистров сказано + все остальные состояния не определены
также разбирался с таймерами и наткнулся на на регистры DMA_REx сказано в описании что это "регистры разрешения запросов DMA оп прерываний каналов таймера",
но что конкретно с ними можно делать не сказано хотелось бы получить более развернутое описание этих регистров, если оно конечно есть...
адреса смещения регистров по отношения к базовому адресу таймера : 0х80, 0х84, 0х88, 0х8С

также критерием может служить значения в статусном регистре CHNLS_MINUS1 = 0x1F и никак не меняющееся при задании с оперативной памяти в виртуальный регистр channel_cfg


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-ноя-18 10:57 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
Цитата:
в статусном регистре DMA статусное поле [31..28] TEST_STATUS равно 0x1 а должно равняться 0x0
В описании регистра DMA STATUS в спецификации сказано: "test_status Значение при чтении: 4’b0000 = контроллер не имеет интегрированной схемы тестирования; 4’b0001 = контроллер имеет интегрированную схему тестирования; 4’b0010 – 4’b1111 = не определено", соответственно, установленная 1 в поле test_status свидетельствует о том, что DMA контроллер ИМЕЕТ интегрированную схему тестирования, но никак не говорит о том, что DMA контроллер находится в тестовом режиме.
Цитата:
также разбирался с таймерами и наткнулся на на регистры DMA_REx...
С регистрами DMA_REx в блоках таймеров следующая ситуация, при возникновении события в соответствующем таймере происходит запрос на выполнение цикла DMA соответствующего канала. Например, такая настройка MDR_TIMER1->DMA_RE1 = 1; приведет к тому, что как только таймер досчитал до 0, возникает запрос на DMA цикл по каналу 10 (TIM1_DMA_REQ). Если в программе необходимо через какой-то интервал времени переносить данные из одной области памяти в другую, то использование таймера и DMA хорошо подойдут для реализации данной задачи без отвлечения ядра контроллера от более приоритетных задач.
Цитата:
также критерием может служить значения в статусном регистре CHNLS_MINUS1 = 0x1F и никак не меняющееся при задании с оперативной памяти в виртуальный регистр channel_cfg
В описании регистра DMA STATUS в спецификации сказано: "chnls_minus1 Количество доступных каналов DMA минус 1. Например: 5’b00000 = контроллер имеет 1 канал DMA;
5’b00001 = контроллер имеет 2 канала DMA; 5’b00010 = контроллер имеет 3 канала DMA; … 5’b11111 = контроллер имеет 32 канала DMA", это просто информационное поле, которое к работе DMA контроллера не имеет отношения, оно только сообщает программисту, что у данного конкретного DMA контроллера имеется 32 канала DMA. По значению в этом поле никак нельзя сделать вывод, что DMA контроллер находится в тестовом режиме.
Предлагаю почитать тему "Контроллер DMA в 1986ВЕ1Т" (смотрите здесь).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-ноя-18 11:25 
Не в сети

Зарегистрирован: 2014-ноя-17 08:47
Сообщения: 103
ну хорошо ...
вот мой проект в нем я пытаюсь настроить прерывание DMA по таймеру в качестве основы я читал Ваш проект test_DMA
при разрешении прерывания от DMA возникает прерывание из которого МК не выходит
работа программы следующая включаем таймер, ждем прерывание от таймера вызываем прерывание от DMA, после прерывания от DMA сбрасываем таймер и крутимся в бесконечном цикле main --- это краткое описание как должна работать программа,
а вот как она работает --- после разрешения NVIC бесконечное прерывание
также Вы так и не ответили на вопрос, что за int_test_en_bit в описании и где его искать и настраивать или он вообще не нужен?

ах да забыл написать ревизия МК 3 так сказал UART


Вложения:
project_3.rar [282.79 КБ]
Скачиваний: 102
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-ноя-18 14:02 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
Посмотрел проект. Есть замечания и предложения.
В настройке тактовых сигналов предлагаю сначала выбирать в качестве источника тактового сигнала для блока PLL генератор HSE, а затем запускать PLL (от этого источника). В исходной версии программы выбирается генератор HSI, запускается PLL от этого источника, а затем следует переключение источника тактового сигнала блока PLL на HSE генератор, а также выбор в качестве источника тактового сигнала для ядра контроллера PLL.
Переменная port_A_11_RXTX расположена в адресном пространстве 0x20000000 - 0x20007FFF, куда DMA доступа не имеет, необходимо расположить эту переменную в области 0x20100000 - 0x20103FFF. В управляющей структуре поменял режим работы на основной (думаю, это не принципиально).
Перенастроил DMA. Базовый адрес структур DMA указан 0x20100000, тогда управляющая структура для 12 канала, который используется в программе, необходимо располагать по адресу 0x201000C0.
В обработчике прерываний от DMA ввел счетчик числа входов в обработчик, который далее выводится на светодиоды VD6 - VD9 (на демоплате).

В результате в обработчик программа заходит 1 раз. Вы этого добивались?
int_test_en_bit - не нужен.


Вложения:
project_3_edit.rar [307.98 КБ]
Скачиваний: 172
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-ноя-18 15:12 
Не в сети

Зарегистрирован: 2014-ноя-17 08:47
Сообщения: 103
да точно... удивительно все работает ... но вопросов меньше не стало...
1)по тактовым частотам не знаю, спорить не буду, если правильно настраивать PLL по конечному тактовому сигналу надо сразу пусть так и будет, но вопрос все-таки задам --- почему так правильно?
2)инициализация DMA файл init_all.c строка 102 тут я использовал Ваш код из проекта test_DMA Вы заменили присвоение в регистры SSP_DMA_CR на ассемблерную команду NOP потом неиспользуемые SSP запретили, вопросы следующие
A)так всегда нужно делать когда инициализируешь DMA в различных режимах и нужно ли так делать при реинициализации
Б)если используются все SSP и не надо ничего запрещать достаточно ли ассемблерного NOP для последующей нормальной работы DMA
3)тот же файл строка 110 Вы закоментировали запрещение всех каналов DMA и разрешили все хотя в test_DMA у Вас запрещено не понятна это изменение(регистр CHNL_ENABLE_SET)...
регистр CHNL_REQ_MASK_SET/CLR согласен у меня тут ошибка
4)с адресами переменных не сталкивался видимо что-то про DMA адресацию пропустил --- вообщем мой косяк не знал...
5)с адресами каналов не понятно почему именно в 0xC0 хотя в описании адрес начала именно 0xC0 или получается так:
адрес_базовый + номер_канала * 4 = место_нахождения_настроек канала_в_оперативной_памяти?
6)int_test_en_bit - не нужен, он есть в документации поэтому вопрос и появился ...

и так сказать последний вопрос: если я настрою ДМА по автозапросу(это получается все равно что по фронту, а не по уровню) то счетчик ДМА будет работать только на количество посылок от события до последней передачи цикла, а чтобы например ДМА считало количество событий, а при событии выдавало бы 1 передачу в цикле, а по достижению определенного числа событий выдавало прерывание так не получится? мне кажется , что все равно без ядра тут не обойтись, только ДМА это сделать не сможет... верно мне кажется?

все работает хорошо я пишу эту программу для освоения, поэтому ее сначала хоть как-нибудь нужно запустить, от этого она не несет никакого смысла за настройку светодиодов спасибо, но я отлаживаюсь не на демо плате, а индикацию уже сделала ДМА выполнив цикл

тут поигрался немного с DMA и заметил, что без отладчика программа работает почти как надо, а с отладчиком всегда висит в прерывании даже в Вашем варианте программы, пользуюсь J-link если что... а нет не как надо, в общем даже в вашей программе ведется счет t1, программа не выходит из прерывания... может его нужно в регистрах ДМА сбрасывать как-то...

также замечено что при маскировании всех запросов ДМА в режиме без отладки все работает, как только подключается отладчик контроллер постоянно сидит в обработчике ДМА прерывания, тут возникает вопрос получается даже если программа написана правильно при подключении отладчика придется все решать в голове или догадываться что хочет контроллер...или отключать прерывание от ДМА отлаживаться без него а потом надеясь на чудо и правописание надеяться что программа заработает(кстати в описании сказано что при маскировании всех запросов контроллер не должен входить в прерывание правило18, значит что-то еще вызывает прерывание ДМА...)
идем дальше я замаскировал все запросы, отключил все каналы и не включал контроллер ДМА, тут надо пояснить тактирование на ДМА есть и прерывание в NVIC разрешено, при работе без отладчика работает как надо как только подключаем отладчик все время DMA_Handler... не понимаю...
при отключении тактирования блока ДМА программа перестает работать без отладчика, а с отладчиком говорит что мы в прерывании, прерывание соответственно разрешено по ДМА
следует вывод что что-то еще влияет на вызов этого прерывания... или может где то установлен бит вызывающий постоянно прерывание который нужно сбросить...

вот кстати сбросил бит вызова прерывания от таймера и программа без отладчика снова стала работать, а с отладчиком прерывание ДМА(тактирование запрещено, запрос от всех каналов запрещен, все канала запрещены, прерывание NVIC разрешено)чудеса...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-ноя-20 13:04 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
1). Так как частота HSI и HSE разные, то в случае включения PLL от одного источника, а затем переход на другой источник будет некоторый интервал времени, когда PLL будет перестраиваться, соответственно, частота тактового сигнала будет не точной, что теоретически может вызвать сбой при обмене данными по каким-либо работающим интерфейсам.
2). А). Особенность контроллера, в том что изначально после включения питания в блоках SSP установлен сигнал запроса DMA, после включения тактового сигнала на SSP этот сигнал сбрасывается, поэтому, если не нужны SSP-блоки, их тактовый сигнал можно выключить. Достаточно сделать 1 раз во время первоначальной настройки DMA.
Б). Если используются все SSP, то нет необходимости в дополнительных манипуляциях.
3). В старых ревизиях кристалла была ошибка "Немаскируемый запрос передачи DMA от контроллера АЦП" (см. errata), согласно которой будет устанавливаться сигнал dma_done, приводящий к прерыванию от DMA. Также в описании DMA сказано: "При отключении канала контролер осуществляет DMA передачи согласно правилам, представленным в таблице ниже", - (речь о таблице 395), по правилу 19 (Если dma_req[C] установлен в 1, то контроллер устанавливает dma_done[C] в 1. Это позволяет контроллеру показать центральному процессору запрос готовности, даже если канал выключен (запрещен)) возникнет событие прерывания от DMA. Я не знаю какая ревизия кристалла у вас, поэтому разрешил все каналы, но замаскировал запросы на DMA цикл от ненужных для устранения "ложного" события DMA.
5). Управляющие структуры расположены в ОЗУ, у каждой свой адрес, расположены линейно одна за другой. Каждому каналу соответствует своя управляющая структура (состоящая из 4-х 32-битных слов). Адрес начала структур записывается в регистр CTRL_BASE_PTR, значит, каналу 12 соответствует адрес структуры, расположенный по адресу CTRL_BASE_PTR + (4 * 4) * 12, где 4 * 4 --- 4 слова по 4 байта, 12 --- номер канала (также это можно уточнить в разделе "Структура управляющих данных канала" в разделе описания DMA в спецификации, рисунок 132).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-ноя-20 14:58 
Не в сети

Зарегистрирован: 2014-ноя-17 08:47
Сообщения: 103
Спасибо за ответ
ревизию я писал выше (№3)
попробую с решениями из errata для АЦП... может получится ...
в любом случае еще напишу...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-дек-01 12:26 
Не в сети

Зарегистрирован: 2014-ноя-17 08:47
Сообщения: 103
Здравствуйте уважаемые разработчики
прерывания ДМА от АЦП действительно теперь маскируются
хочу спросить никак не могу понять...
вот есть каналы req и sreq, как я понял req запрос от периферии, а sreq работает если мы программно пишем в регистр sw_request? правильно я размышляю?
и вопрос по userburst, он применяется только когда мы пишем хоть какое-нибудь значение в R_power?
и еще R_power (по документации: задает количество передач DMA до выполнения контроллером процедуры арбитража)
т.е. получается если я запишу в n_minus_1 2 выполнится 3 передачи по событию, а в R_power 1, то должно будет произойти 2 события по 3 передачи до возникновения прерывания ДМА...
я правильно понимаю ?

вот мой переделанный проект не могу понять почему не работает вроде адреса все правильные значения в адресах тоже верные + у меня стоит разрешение на прерывание от переполнения таймера, а я вхожу в прерывание постоянно(я так понял что флаг переполнения является событием для ДМА)
хотя наверное я просто не выхожу из прерывания... в любом случае получается мне нужно сбросить флаг в статусном регистре таймера и например запретить прерывание от таймера , а потом снова разрешить; или выключить таймер, а потом снова включить или выключить ДМА , а потом снова включит...
хотелось бы узнать какой вариант правильный и есть ли более простые варианты сброса прерывания ДМА


Вложения:
project_4.rar [243.18 КБ]
Скачиваний: 105
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-дек-02 11:59 
Не в сети

Зарегистрирован: 2014-ноя-17 08:47
Сообщения: 103
с программой я разобрался нашел ошибку в адресе структуры канала
но все равно событие ДМА возникает если есть флаг переполнения или его нет... непонятно... не могли бы разработчики пояснить почему возникает такая вещь...
я смотрю через регистр статуса таймера и с точкой остановки в прерывании и получается, что в прерывании я достаточно часто по непонятной причине....
хотя может прерывание ДМА само сбрасывает флаг а отладчик не успевает отследить ... я правильно думаю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-дек-02 12:34 
Не в сети

Зарегистрирован: 2014-ноя-17 08:47
Сообщения: 103
вот готовый проект по работе DMA(может кому-нибудь пригодится в освоении)
смысл какой если мы на А11 повесим светодиод то он должен мигать с частотой 2 Гц (тактовая частота ядра 40МГц)
я все еще жду ответов от разработчиков... по вышеизложенным вопросам... хотя я наверное на некоторые сам ответил....
+ такой вопрос могу ли я увеличивать счетчик ДМА по событию выполняя всего 1 передачу аппаратно т.е. например я отслеживаю 8 событий таймера, но мне их не надо выдавать сразу мне нужно в каждое событие выдать только 1 уникальное для этого номера события слово?


Вложения:
project_4.rar [238.1 КБ]
Скачиваний: 159
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-дек-03 13:59 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
rubygoblin писал(а):
вот есть каналы req и sreq, как я понял req запрос от периферии, а sreq работает если мы программно пишем в регистр sw_request? правильно я размышляю?

Нет, не правильно. req - запрос пакетного обмена, а sreq - одиночного. Регистр sw_request тут ни при чем.

rubygoblin писал(а):
и вопрос по userburst, он применяется только когда мы пишем хоть какое-нибудь значение в R_power?

нет. Есть таблица в спецификации "Распределение каналов DMA", где указаны источники req и sreq, соответственно, если у данного канала есть источник req (запрос пакетного обмена), то можно использовать регистр userburst для маскирования запросов sreq. Например, случай, когда периферийный блок накопил в своем буфере определенное количество данных, и DMA по одному запросу от периферии их все вычитывает.

rubygoblin писал(а):
и еще R_power (по документации: задает количество передач DMA до выполнения контроллером процедуры арбитража)
т.е. получается если я запишу в n_minus_1 2 выполнится 3 передачи по событию, а в R_power 1, то должно будет произойти 2 события по 3 передачи до возникновения прерывания ДМА...
я правильно понимаю ?

Нет, не правильно. Как вы верно написали, R_power задает количество передач DMA до выполнения контроллером процедуры арбитража. То есть контроллер DMA, получив запрос на DMA-цикл, выполняет несколько передач (согласно полю R_power), далее происходит арбитраж, если есть DMA запрос от канала с большим приоритетом, DMA станет обрабатывать тот канал, затем вернется к обработке первоначального. Но в результате общее количество DMA передач будет такое, какое установлено в поле n_minus_1.
Если вернуться к примеру: n_minus_1 = 2, R_power = 1, то произойдет всего 3 передачи DMA, далее формируется событие прерывания от DMA, при этом после второй передачи произойдет арбитраж с целью выявления DMA запроса от более приоритетного канала.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-дек-03 14:22 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
rubygoblin писал(а):
+ такой вопрос могу ли я увеличивать счетчик ДМА по событию выполняя всего 1 передачу аппаратно т.е. например я отслеживаю 8 событий таймера, но мне их не надо выдавать сразу мне нужно в каждое событие выдать только 1 уникальное для этого номера события слово?

Вопрос сформулирован, мягко говоря, сумбурно...

Какой счетчик ДМА вы имеете ввиду?
Куда вы выводите для каждого события уникальное для этого номера события слово?

Если бы в контроллере на каждое событие таймера был выделен свой канал DMA, тогда вашу задумку (если я правильно ее понял) можно было бы реализовать. Но у DMA есть 4 канала для всех событий каждого из таймеров (с 10 по 13), а также ещё по 4 DMA канала для всех каналов каждого из Таймеров (с 14 по 29).
А точно необходимо использовать DMA в вашем случае?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по DMA
СообщениеДобавлено: 2014-дек-03 14:50 
Не в сети

Зарегистрирован: 2014-ноя-17 08:47
Сообщения: 103
да... с формулировкой вопросов у меня плохо...
попробую еще раз...
вот смотрите пришел у нас запрос от таймера (один пока) у нас в дма стоит например 2 передачи (в виртуальном control)
по этому событию произойдет 2 передачи в место назначения, а нужно чтобы произошло два события и в каждое событие ДМА сделало по 1 передаче на 1 событие, но уже с разными значениями в регистре-источнике, поясню например в порт А по первому событию 11 нога перешла в состояние 1, а при втором в состояние 0 и только после этого мы получили прерывание ДМА; ведь количество передач в ДМА, видимо, счетчик считает, в первом случае он считает передачи, а во втором считает события ... (что то я наворотил кажется, что это разные вещи...)
в общем получается я программно ничего не делаю я пишу в оперативку 2 32битных слова и аппаратно (через ДМА выдаю в переферию), а потом получаю прерывание о том что цикл ДМА завершен... так вообще можно сделать? с помощью программного вмешательства я уже это сделал, а вот через аппаратный ДМА не получается

да и потом я ведь использую 1 канал ДМА по событию переполнения почти тоже самое, что 1 канал = 1 событие
ну я пробовал через прерывание по таймеру ... не то... медленно и возможны сдвиги во времени при подключении остальной периферии и каналов ДМА(это если прерывание по таймеру),
а с ДМА получается небольшое распараллеливание, которое должно решить проблему.


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

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


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

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


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

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