Миландр

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

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




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

Зарегистрирован: 2013-фев-14 08:40
Сообщения: 20
точно, для этого нужно в обработчике сделать еще пару действий:
Код:
   if (!(DMA_ControlTable[DMA_Channel_SSP1_RX].DMA_Control & 0x3FFF))                              // DMA_Channel_SSP1_RX
   {
      SSP_DMACmd(MDR_SSP1, SSP_DMA_RXE, DISABLE);                                             // SSP DMA req. disable
      DMA_Cmd(DMA_Channel_SSP1_RX, DISABLE);                                                // DMA SPI chan. disable
      DMA_ControlTable[DMA_Channel_SSP1_RX].DMA_Control |= ((SPI_SIZE - 1) << 4) | DMA_Mode_Basic;      // DMA SPI counter init.
   }

Тоесть нужно поставить DMA_Mode_Basic, а чтобы он сам не слетел нужно еще счетчик проинициализировать хотя бы единичкой.
Ну и запросы к ДМА нужно отключить обязательно.


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

Зарегистрирован: 2013-дек-02 10:05
Сообщения: 1
Здравствуйте, возникла проблема работы DMA с внешней памятью 1645РУ3У, при выполнении данного кода
Открыть
Код:
unsigned int buf[1050];

void testDMAread(void)
{
  unsigned int i,f,e;
  DMA_ChannelInitTypeDef DMA_InitStr;
  DMA_CtrlDataInitTypeDef DMA_PriCtrlStr;
  e = 0;
  f = 1;
  for(i=0x30000000;i<0x30040000;i+=4)
  {
   *((unsigned int *)i) = i;
  }

  DMA_StructInit(&DMA_InitStr); 

  DMA_PriCtrlStr.DMA_SourceBaseAddr = 0x30000000;
  DMA_PriCtrlStr.DMA_DestBaseAddr = (unsigned int)&buf[0];
  DMA_PriCtrlStr.DMA_SourceIncSize = DMA_SourceIncWord;
  DMA_PriCtrlStr.DMA_DestIncSize = DMA_DestIncWord;
  DMA_PriCtrlStr.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_PriCtrlStr.DMA_Mode = DMA_Mode_AutoRequest;
  DMA_PriCtrlStr.DMA_CycleSize = 1024;
  DMA_PriCtrlStr.DMA_NumContinuous = DMA_Transfers_1024;
  DMA_PriCtrlStr.DMA_SourceProtCtrl = DMA_SourcePrivileged;
  DMA_PriCtrlStr.DMA_DestProtCtrl = DMA_DestPrivileged;

  DMA_InitStr.DMA_PriCtrlData = &DMA_PriCtrlStr;
  DMA_InitStr.DMA_Priority = DMA_Priority_Default;
  DMA_InitStr.DMA_UseBurst = DMA_BurstClear;
  DMA_InitStr.DMA_SelectDataStructure = DMA_CTRL_DATA_PRIMARY;

  DMA_Init(8, &DMA_InitStr);
  DMA_Cmd(8, ENABLE);
  DMA_Request(8);

  while (DMA_GetFlagStatus(8, DMA_FLAG_CHNL_ENA));

  for(i=0;i<1024;++i)
  {
   if((buf[i]!=(i*4+0x30000000)))
   {
     if(f)xprintf("Error DMA. Address:0x%X  readdata: 0x%X",(i*4+0x30000000),buf[i]);
       f = 0;++e;
   }
  }
  if(!f)xprintf("  count error = %d from 1024\n",e);
}
Закрыть

в консоли пишет "Error DMA. Address:0x300000060 readdata: 0x0 count error = 1 from 1024", при тестах памяти процессором без участия DMA ошибок не возникает. При многократных тестах определили, что на адрес появления ошибки влияет параметр DMA_PriCtrlStr.DMA_NumContinuous. Подскажите может быть делаем что-то не так?


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

Зарегистрирован: 2013-июн-30 10:26
Сообщения: 117
Запускаю в режиме отладки.
Keil 4. МК: 1986ВЕ9

С DMA не работаю ( даже не тактирую его )
Почему в NVIC DMA стоит в состоянии Pending ?


Вложения:
keil.png
keil.png [ 58.57 КБ | Просмотров: 8070 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA и все что с ним связано
СообщениеДобавлено: 2014-мар-12 10:20 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1141
Откуда: Тула
ksluk писал(а):
Запускаю в режиме отладки.
Keil 4. МК: 1986ВЕ9

С DMA не работаю ( даже не тактирую его )
Почему в NVIC DMA стоит в состоянии Pending ?

Кажется в errata есть ответ.

_________________
сочувствующий…


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

Зарегистрирован: 2013-июн-30 10:26
Сообщения: 117
prostoRoman писал(а):
ksluk писал(а):
Запускаю в режиме отладки.
Keil 4. МК: 1986ВЕ9

С DMA не работаю ( даже не тактирую его )
Почему в NVIC DMA стоит в состоянии Pending ?

Кажется в errata есть ответ.


Спасибо.


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

Зарегистрирован: 2014-фев-12 12:31
Сообщения: 31
Откуда: Москва
Ошибка в драйвере DMA?

В файле MDR32F9Qx_config.h задаю 16 каналов DMA
Код:
#define DMA_Channels_Number   16         

В отладчике вижу в регистрах DMA:
CTRL_BASE_PTR - 0x20000000
ALT_CTRL_BASE_PTR - 0x20000200
При этом массив DMA_ControlTable, объявленный в MDR32F9Qx_dma.c указывает на адрес 0x20000200, а IMHO должен указывать на CTRL_BASE_PTR. При числе каналов 32 такой ошибки нет (см. скриншоты).

Версия библиотеки 1.3 от 2013-11-27. Использую пример
\Examples\MDR1986VE9x\MDR32F9Q1_EVAL\ADC

Вложение:
DMA32_OK.jpg
DMA32_OK.jpg [ 142.23 КБ | Просмотров: 7915 ]

Вложение:
DMA16_Bad.jpg
DMA16_Bad.jpg [ 113.07 КБ | Просмотров: 7915 ]


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

Зарегистрирован: 2014-фев-12 12:31
Сообщения: 31
Откуда: Москва
В режиме "Пинг-понг" контроллер не дает прерывание после цикла по альтернативной структуре. По данным видно, что оба цикла DMA выполняются (как по основной, так и по альтернативной структурам), но прерывание дается только один раз. Из описания 1986ВЕ91 с.429 следует, что прерывание должно выдаваться после каждого цикла DMA.

Использую пример
\Keil_v5\ARM\Pack\Keil\MDR1986BExx\1.3.0\Examples\MDR1986VE9x\MDR32F9Q1_EVAL\ADC\ADC1_DMA
Версия библиотеки: 1.3 от 2013-11-27.
Версия кристалла: 1333

Очень надеюсь на помощь. Без этого прерывания режим пинг-понг для нас совершенно бесполезен.

PS. Если в отладчике поставить точку останова в прерывании по DMA в обоих ветках (Alt и Pri), то прерывание выдается, наоборот, после цикла по основной структуре.


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

Зарегистрирован: 2013-июн-30 10:26
Сообщения: 117
Здравствуйте,
хочу настроить DMA используя не библиотеку, а записывая на прямую в регистры DMA.
И ни как не могу из описания понять в какой регистр допустим надо записать:
- формат ширины передаваемых/получаемых данных ( 8,16,32);
- величину инкремента приемника/передатчика
- количество посылок.

Из описания выложенного на сайте:
начиная с раздела Описание регистров контроллера DMA стр 452
я такойт информации не нашел.

Может кто-нибудь объяснить?

Заранее Спасибо.
P.S.
например в stm32 там в описании четко сказано что и в какой регистр записывать.


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

Зарегистрирован: 2014-дек-16 09:31
Сообщения: 3
Откуда: ОАО "Красногорский завод имени С.А. Зверева"
ksluk писал(а):
И ни как не могу из описания понять в какой регистр допустим надо записать:
- формат ширины передаваемых/получаемых данных ( 8,16,32);
- величину инкремента приемника/передатчика
- количество посылок.

На странице 445 описание разрядов области памяти channel_cfg. Она соответствует полю Control в структуре упраляющих данных канала


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

Зарегистрирован: 2013-июн-30 10:26
Сообщения: 117
nalale писал(а):
ksluk писал(а):
И ни как не могу из описания понять в какой регистр допустим надо записать:
- формат ширины передаваемых/получаемых данных ( 8,16,32);
- величину инкремента приемника/передатчика
- количество посылок.

На странице 445 описание разрядов области памяти channel_cfg. Она соответствует полю Control в структуре упраляющих данных канала


Простите, если глупый вопрос:
Но я не очень понял как мне записать данные в channel_cfg.... ведь в настроечных регистрах на которые я ссылался. Такого регистра ( channel_cfg ) нет.
Правильно ли я понял: что я указываю базовый адрес структуры в регистр MDR_DMA->CTRL_BASE_PTR
и уже через структуру настраиваю регистр CONTROL, который идет 3-им по счету.
Все верно?


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

Зарегистрирован: 2014-дек-16 09:31
Сообщения: 3
Откуда: ОАО "Красногорский завод имени С.А. Зверева"
ksluk писал(а):
nalale писал(а):
ksluk писал(а):
Простите, если глупый вопрос:
Но я не очень понял как мне записать данные в channel_cfg.... ведь в настроечных регистрах на которые я ссылался. Такого регистра ( channel_cfg ) нет.
Правильно ли я понял: что я указываю базовый адрес структуры в регистр MDR_DMA->CTRL_BASE_PTR
и уже через структуру настраиваю регистр CONTROL, который идет 3-им по счету.
Все верно?


Такого регистра нет, верно. Это просто область памяти. Нужно просто создать структуру памяти, соответсвующую приведенной на рис.131 из описания контроллера. и заполнить в ней ту область, которая соответствует нужному вам каналу. например для UART это будет канал 3, и область памяти со смещением 0х030. остальные остаются заполненные нулями.
например: 00800340 4а0с0020 718с060с. Здесь первый блок соответствует Source End Pointer, второй Dest EndPointer, третий Control.
в регистре MDR_DMA->CTRL_BASE_PTR вы указываете адрес этой большой структуры, полем которой является структура нужного канала. Т.е если я выделил под управляющую структуру адрес 0x20000400, то под третий канал у меня будет адрес 0х20000430, и в регистр CTRL_BASE_PTR я указываю 0x20000400.
Возвращаясь к Control, можно сопоставить значение 0x718с060с с channel_cfg из таблицы 394.
00, 00, 11, 00, 000, 001, 1010, 0011000111, 0, 001 = dst_inc, dst_size, src_inc, src_size, dst_prot, src_prot, R_pow, n_minus_1, next_useburst, cycle_ctrl.


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

Зарегистрирован: 2010-дек-23 23:33
Сообщения: 9
Оставлю здесь, всё что выяснил за своё первое знакомство с DMA. Может кому-то поможет побыстрее соориентироваться.

Общее.
Для управления каналами используются так называемые управляющие структуры.
Каждая структура представляет из себя блок из четырёх 32-разрядных слов,
расположенный в ОЗУ по определённому адресу, и содержит некоторые параметры
канала (конечные адреса приёмника и источника передачи, режим работы, инкремент
адреса и т.д.). Для одного канала можно задать две управляющие структуры - первичную и
альтернативную. Это позволяет в определённых режимах работы контроллера DMA
автоматически (без занятия процессорного ядра) изменять параметры данного канала
от передачи к передаче. В простейшем случае для канала задаётся только один
набор параметров (первичная структура).
Все управляющие структуры должны быть расположены упорядочено в соответствие с
номерами каналов DMA в двух таблицах - таблица с первичными управляющими структурами и
таблица с альтернативными управляющими структурами,если используется, расположенных
в ОЗУ. Начальный адрес таблицы c первичными управляющими данными необходимо
занести в регистр DMA->CTRL_BASE_PTR. В регистре DMA->ALT_CTRL_BASE_PTR после
этого появляется адрес, который будет использован контроллером в качестве начального
адреса таблицы с альтернативными управляющими структурами, причём формируется он
из базового адреса таблицы c первичными данными(CTRL_BASE_PTR) установкой в 1 девятого бита.
Т.о. таблицу с альтернативными управляющими структурами необходимо размещать по
адресу на 512 большему, чем базовый адрес таблицы c первичными данными.
В описании регистра DMA->CTRL_BASE_PTR указано, что младшие 10 бит адреса
должны быть нулями и следовательно адрес таблицы с первичными управляющими
структурами ВСЕГДА ДОЛЖЕН БЫТЬ ВЫРОВНЕН ПО 1024 БАЙТАМ.

Замечания.
1. Спецификация на 1986ВЕ9х, стр. 441, последняя строка:
"контроллер использует 0x10 разрядов адреса..."
Нужно: "контроллер использует 10 разрядов адреса..."

2. Раздел "Структура управляющих данных" требует редактирования (таблица 390,
рисунок 132 неверны, ориентироваться стоит на рисунок 131).

3. В библиотеке, поставляемой Миландром, есть возможность задания параметров DMA
в файле 1986BE9x_config.h путём задания КОЛИЧЕСТВА используемых каналов DMA и
флага использования/неиспользования альтернативных структур. Вместо количества
необходимо задать МАКСИМАЛЬНЫЙ НОМЕР используемого канала DMA (от 1 до 32).
В файле 1986BE9x_dma.c необходимо жёстко выставить DATA_ALIGN = 1024, убрать
проверку DMA_Channels_Number и определение в соответствии с ним DATA_ALIGN.

4. Для оптимизации расхода памяти, особенно при использовании альтернативных
управляющих структур, стоит вручную (не используя библиотеку Миландра)задавать
таблицы управляющих данных, иначе неизбежен оверхед(только если вы не используете
все 32 канала да ещё и с альтернитивным управлением).

5. Если не хотите сильно "загоняться", у вас достаточно памяти, и отсутствует
перфекционизм, то просто оставьте DMA_Channels_Number = 32, DMA_AlternateData =1
(как и есть по умолчанию). В этом случае, если вы пользуетесь только каналом UART1
без использования альт. структур, то оверхед составит 1024 - 2*16 = 992 байта ОЗУ.

6. Режим работы контроллера "Основной" требует ручного перезапуска после каждой
остановки цикла (процедуры арбитража). Если канал настроен на 8 передач,
а количество непрерывных передач до арбитража на 4 передачи, то после четырёх
передач цикл остановится. Если использовать режим "Авто-запрос" - продолжится.


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

Зарегистрирован: 2014-сен-17 12:19
Сообщения: 37
Откуда: СПб
Читаю документацию и не вижу описания механизма работы прерываний по событиям DMA. Как оно устроено? Как этим управлять? Какие события приводят к прерываниям, как их фильтровать (и можно ли), вобщем не хватает отдельного параграфа :)


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

Зарегистрирован: 2014-сен-17 12:19
Сообщения: 37
Откуда: СПб
Экспериментирую с DMA. А какие еще события, кроме DMA_done приводят к прерыванию?


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

Зарегистрирован: 2012-июл-25 11:15
Сообщения: 73
Откуда: ОАО "Красногорский завод имени С.А. Зверева"
YURIY писал(а):
Экспериментирую с DMA. А какие еще события, кроме DMA_done приводят к прерыванию?

От DMA больше никаких.


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

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


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

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


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

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