Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
СообщениеДобавлено: 2019-фев-06 13:10 
Не в сети

Зарегистрирован: 2015-сен-10 10:29
Сообщения: 23
Здравствуйте.
Пытаюсь реализовать работу DMA, а именно пересылку данных по принципу память - память. Вроде учел все нюансы и реализовал структуру и инициализацию DMA согласно спецификации, но результата нет. Флаг статуса обозначает в начале, что происходит чтение указателя источника или приемника, но через некторое воемя указывает, что контроллер находится в состоягии покоя, DMA-обмен не происходит, данные в приемном буфере соответственно нулевые. В чем может быть проблема? Не правильно сконфигурирован контроллер или есть еще неучтенные моменты при инициализации регистров DMA?
Заранее спасибо.


Код:

struct
{
uint32_t srceEndPoint;
uint32_t destEndPoint;
uint32_t ctrl;
uint32_t unuse;
} my_dma[32];

#pragma locate my_dma 0x20100000

char cDestBufm[7];
char cPriBufm[7];

#pragma locate cPriBufm 0x20100380
#pragma locate cDestBufm 0x20100390

void main()
{
// Включаем клоки
MDR_RST_CLK->PER_CLOCK |= 1<<5 | 1<<8 | 1<<20 | 1<< 31;

// Заполняю массив- источк ранд. значениями
cInitRAM(cPriBufm,7);

// Заполняем управляющую структуру
for(i=0; i< 31; i++)
{
my_dma[i].srceEndPoint = (uint32_t)&cPriBufm[7];
my_dma[i].destEndPoint = (uint32_t)&cDestBufm[7];
//Режим работы - основной; кол-во передач DMA 7
//размерность - байт
my_dma[i].ctrl = 0xCC000071;
}

// указатель на базовый адрес первичной структуры
MDR_DMA->CTRL_BASE_PTR = (uint32_t)&my_dma << 10;
// отключаем все каналы DMA
MDR_DMA->CHNL_ENABLE_CLR = 0xFFFFFFFF;
// отключаем обработку запросов
MDR_DMA->CHNL_REQ_MASK_SET = 0xFFFFFFFF;
// используем только первычную управ. структуру
MDR_DMA->CHNL_PRI_ALT_CLR = 0x00008000;
// разрешаем обработку запросов
MDR_DMA->CHNL_USEBURST_CLR = 0x00008000;
// разрешаем установку запросов
MDR_DMA->CHNL_REQ_MASK_CLR = 0x00008000;
// устанавдиваем высокий приоритет каналу
MDR_DMA->CHNL_PRIORITY_SET = 0x00008000;
// разрешаем работу контроллера DMA
MDR_DMA->CFG = 7<< 5 | 1<<0;
// разрешаем работу каналу DMA
MDR_DMA->CHNL_ENABLE_SET = 0x00008000;
// генерируем программный запрос на цикл DMA
MDR_DMA->CHNL_SW_REQUEST = 0x00008000;


while(1)
{
// проверяем состояния контроллера DMA
wrkg = MDR_DMA->CHNL_ENABLE_SET;
status = MDR_DMA->STATUS;
}

}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-06 13:31 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1309
Откуда: Тула
Код:
char cDestBufm[7];
char cPriBufm[7];
...
... = (uint32_t)&cPriBufm[7];
... = (uint32_t)&cDestBufm[7];

уверены, что хотите выйти за границы массива?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-06 13:46 
Не в сети

Зарегистрирован: 2015-сен-10 10:29
Сообщения: 23
prostoRoman писал(а):
Код:
char cDestBufm[7];
char cPriBufm[7];
...
... = (uint32_t)&cPriBufm[7];
... = (uint32_t)&cDestBufm[7];

уверены, что хотите выйти за границы массива?


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-06 16:04 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1309
Откуда: Тула
По делу - могу посоветовать попробовать примеры из SPL или поискать на форуме.
По коду: формально обращение к cPriBufm[7] есть логическая ошибка, допустимый интервал 0..6.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-06 17:40 
Не в сети

Зарегистрирован: 2015-сен-10 10:29
Сообщения: 23
prostoRoman писал(а):
По делу - могу посоветовать попробовать примеры из SPL или поискать на форуме.
По коду: формально обращение к cPriBufm[7] есть логическая ошибка, допустимый интервал 0..6.

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

Примеры с DMA пробовал запустить, но безрезультатно, то же самое и с функциями для работы с DMA из библиотеки mdr32f9qx_dma.h. В связи с этим решил напряму через регистры реализвать простейшую код для обмена память-память. Вроде и сконфигурировал правильно и пдресную область установил, но реакции нет.
На форуме находил подобные темы, но решенья нет. Варианты из за чего dma не работает уже закончились, вроде и код простейший и по спецификации, а результат 0.

В одной из тем нашел такое сообщение:
"оказывается и данные, которые я передаю, и управляющие структуры должны находится в одной секции памяти", еще были фразы, что clk нужно включать и на ssp, но реализация этих вариантов так же результатов не принесла.


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

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1309
Откуда: Тула
Тогда посмотрите в листинге на фактические адреса размещения управляющий структур, и массивов в правильных адресах (0х2010_0000 + 16кБ, т.е. в области доступной для ДМА, см. рисунок 8, Раздел "8 Организация памяти").
Посмотрите фактически генерируемый ассемблерный код.
Тактирование вроде включено нормально... В МК есть баги с ложными весящими запросами от переферии (SSPх, нужно включить и выключить...).
Среда Фитон тут не особо популярна, но можете выложить свой демонстрационный проект, может кто посмотрит (тех.поддержка точно может).

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


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

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 362
Откуда: ПКК "Миландр"
MDR32F9Qx_eth.c - тут есть пример работы с DMA через регистры. Например, функция ETH_DMAFrameRx(), инициализация в ETH_DMAPrepare().

В кейл это располагается в C:\Keil_v5\ARM\PACK\Keil\MDR1986BExx\1.51\Libraries\MDR32F9Qx_StdPeriph_Driver\src , в Фитоне не знаю.

Передача не совсем память-память, но почти тоже самое.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-08 09:48 
Не в сети

Зарегистрирован: 2015-сен-10 10:29
Сообщения: 23
prostoRoman писал(а):
Тогда посмотрите в листинге на фактические адреса размещения управляющий структур, и массивов в правильных адресах (0х2010_0000 + 16кБ, т.е. в области доступной для ДМА, см. рисунок 8, Раздел "8 Организация памяти").
Посмотрите фактически генерируемый ассемблерный код.
Тактирование вроде включено нормально... В МК есть баги с ложными весящими запросами от переферии (SSPх, нужно включить и выключить...).
Среда Фитон тут не особо популярна, но можете выложить свой демонстрационный проект, может кто посмотрит (тех.поддержка точно может).

Спасибо. Посмотрел map-файл, адреса размещения управляющей структуры и массив расположены в правильном секторе (начиная от адреса 0х20100000 и выше). На счет запросов, выключаю все прерывания при старте программы.

Vasiliy писал(а):
MDR32F9Qx_eth.c - тут есть пример работы с DMA через регистры. Например, функция ETH_DMAFrameRx(), инициализация в ETH_DMAPrepare().

В кейл это располагается в C:\Keil_v5\ARM\PACK\Keil\MDR1986BExx\1.51\Libraries\MDR32F9Qx_StdPeriph_Driver\src , в Фитоне не знаю.

Передача не совсем память-память, но почти тоже самое.


Этот пример я пытался запустить изначально, использовал как готовые функции, так и куски кода с инициализацией и заполнением управляющей структуры, безрезультатно, даже регистр статуса после запуска dma не менялся. В результате на основе примера я сделал свой проект, в котором после запуска dma регистр статуса отображает разные состояния (чтение указателя источника, приемика), но обмена нет. Может быть действительно в настройках CodeMaster-а нужно что-то поменять.
Архив проекта во вложении.


Вложения:
DMA_test.rar [414.6 КБ]
Скачиваний: 73
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-13 11:10 
Не в сети

Зарегистрирован: 2015-сен-10 10:29
Сообщения: 23
Господа, неужели больше нет никаких идей?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-13 15:41 
Не в сети

Зарегистрирован: 2015-сен-10 10:29
Сообщения: 23
DMA ожил, товарищи!
В связи с чем возник вопрос. В описании 1986ВЕ1Т в разделе "Описание регистров контроллера DMA" указатель на базовый адрес первичной структуры управляющих данных лежит в диапазоне 31...10;
В CodeMaster-е в описании регистров на этот мк, указан диапазон с 0.
Вот при записи управляющей структуру с 0-го бита, получилось передать побайтово данные из одного массива в другой. Получается ошибка в описании и управляющую структуру действительно нужно записывать в регистр с 0 или случайность?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-фев-13 16:27 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 701
Откуда: г. Санкт-Петербург
AndreyS писал(а):
DMA ожил, товарищи!
В связи с чем возник вопрос. В описании 1986ВЕ1Т в разделе "Описание регистров контроллера DMA" указатель на базовый адрес первичной структуры управляющих данных лежит в диапазоне 31...10;...

Здесь имеется ввиду, что базовый адрес д.б. кратен 1 кБ т.е. разряды 0-9 д.б. = 0.
Поэтому Ваш код
// указатель на базовый адрес первичной структуры
MDR_DMA->CTRL_BASE_PTR = (uint32_t)&my_dma << 10;
неправильный. д.б.
MDR_DMA->CTRL_BASE_PTR = (uint32_t)&my_dma;


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

Зарегистрирован: 2015-сен-10 10:29
Сообщения: 23
vasili писал(а):
AndreyS писал(а):
DMA ожил, товарищи!
В связи с чем возник вопрос. В описании 1986ВЕ1Т в разделе "Описание регистров контроллера DMA" указатель на базовый адрес первичной структуры управляющих данных лежит в диапазоне 31...10;...

Здесь имеется ввиду, что базовый адрес д.б. кратен 1 кБ т.е. разряды 0-9 д.б. = 0.
Поэтому Ваш код
// указатель на базовый адрес первичной структуры
MDR_DMA->CTRL_BASE_PTR = (uint32_t)&my_dma << 10;
неправильный. д.б.
MDR_DMA->CTRL_BASE_PTR = (uint32_t)&my_dma;

Спасибо. При написании кода я ориентировался на описаение регистра и таблицу, а в таблице прямо указано:
31...10 - ctrl_base_ptr - указатель на базовый адрес первичной структуры упрпвляющих данных
9...0 - не определено. Следует записывать 0.

Описание в таблице не совсем точное, думаю все же надо указывпть, что управляющая структура с 0 бита, но сам адрес размещения управляющей структуры д.б. крате 1кб.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

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


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

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


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

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