Миландр

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

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 10 сообщений ] 
Автор Сообщение
СообщениеДобавлено: 2021-сен-22 16:35 
Не в сети

Зарегистрирован: 2021-сен-21 17:16
Сообщения: 5
Организация: Частное лицо
Есть следующая проблема. Необходимо на данном МК запускать DMA-передачу в канале в режиме PingPong из альтернативной структуры (режим память->периферия) программным способом (Software-запуск DMA-передачи). Собственно, проблема заключается в том, что передача не стартует именно из альтернативной структуры. При запуске из основной структуры - передача происходит нормально.

В документации подразумевается, что такое возможно - "Режим работы для выбранного канала, при котором контроллер получает начальный запрос и затем выполняет цикл DMA, используя первичную или альтернативную структуру данных." Цитата из спецификации на МК на режим PingPong (стр. 336).

Может быть, кто-то сможет подсказать, в чем может заключаться проблема ?


Последний раз редактировалось ripandtear 2021-сен-24 15:25, всего редактировалось 2 раза.

Вернуться к началу
СообщениеДобавлено: 2021-сен-22 18:10 
Не в сети

Зарегистрирован: 2018-мар-18 15:49
Сообщения: 267
Организация: StartMilandr.ru
- Запуск с альтернативной структуры задаете через CHNL_PRI_ALT_SET?
- Зачем стартовать именно с альтернативной? (Не вижу разницы между основной и альтернативной в ping-pong)


Вернуться к началу
СообщениеДобавлено: 2021-сен-23 09:36 
Не в сети

Зарегистрирован: 2021-сен-21 17:16
Сообщения: 5
Организация: Частное лицо
StartMilandr писал(а): *
- Запуск с альтернативной структуры задаете через CHNL_PRI_ALT_SET?
- Зачем стартовать именно с альтернативной? (Не вижу разницы между основной и альтернативной в ping-pong)
Да.

Главная и альтернативная структуры используются как закольцованные DMA-дескрипторы (указатели находятся в 4-м не используемом DMA слове) для стека FreeRTOS+TCP. Если последний пакет будет передан из главной структуры, то первый пакет в последующей инициированной передаче будет передаваться используя дескриптор альтернативной структуры.


Вернуться к началу
СообщениеДобавлено: 2021-сен-23 10:43 
Не в сети

Зарегистрирован: 2018-мар-18 15:49
Сообщения: 267
Организация: StartMilandr.ru
1 - запускаться из альтернативной не пробовал, поэтому больше нет идей.
2 - тут идею не вкурил...

Ping-Pong работает аппартно непрерывно само, пока не считает невалидную структуру, не важно будет это Pri или Alt структура.
При аппаратных переключениях между структурами вам выдается прерывание чтобы вы переинициализировали только что отработавшую структуру, пока DMA отрабатывает соседнюю. Т.е. последовательность работы:

- DMA копирует то, что задано в Pri структуре.
- Когде поле Pri.N_Minus_1 стало равно нулю, DMA понимает что отработал данное ему задание. Тогда:
----DMA само переключается на Alt структуру и если она валидна, то начинает копирование заданное этой структурой.
----DMA Выставляет запрос на прерывание - ядро получив прерывание, должно переинициализировать Pri структуру, если это нужно.

- DMA копирует то, что задано в Alt структуре.
- Когде поле Alt.N_Minus_1 стало равно нулю, DMA понимает что отработал данное ему задание. Тогда:
----DMA само переключается на Pri структуру. Допустим, что Pri структуру при прошлом прерывании мы не переинициализировали, поэтому DMA заканчивает работу в режиме Ping-Pong и сбрасывает бит в регистре ENABLE.
----DMA Выставляет запрос на прерывание

Теперь обе структуры Pri и Alt невалидны, поэтому для следующего старта их надо заново инициализировать и запустить с регистром ENABLE.
И вот тут вопрос - почему же нельзя стартануть с Pri структуры?


Вернуться к началу
СообщениеДобавлено: 2021-сен-23 13:59 
Не в сети

Зарегистрирован: 2021-сен-21 17:16
Сообщения: 5
Организация: Частное лицо
Когда передача N-пакетов заканчивается, то текущий свободный дескриптор может указывать на альтернативную структуру. Следующий запуск соотв. должен осуществляться с него - т.е. с альтернативной структуры. CHNL_PRI_ALT_SET DMA сбрасывает и устанавливает сам, и он остается в нужном переключенном состоянии. Таким образом, можно свести к минимуму кол-во операций для управления передачей пакетов в FIFO. Можно использовать режим Basic (Обычный однократный обмен), но тогда происходит задействование лишнего канала, т.к. контроллер не позволяет устанавливать CHNL_PRI_ALT_SET (и соотв. использовать альтернативную структуру в Basic) в данном режиме.


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

Зарегистрирован: 2018-мар-18 15:49
Сообщения: 267
Организация: StartMilandr.ru
Стартануть с альтернативной структуры может быть и нельзя. Возможно ping-pong, это родственное от scatter-gather, где основная структура конфигурирует альтернативную и старт действительно должен быть именно с основной структуры. Если не получается, то значит так оно и есть.

Тогда Ping-Pong в вашем варианте использования не особо подходит.
Возможно два канала DMA подойдут лучше - вы попрежнему можете запустить передачу следующего пакета, пока текущий выдается. Но необходимо запретить арбитраж 2^R, чтобы каналы работали друг за другом, и не перемешивали свои данные.

Можно использовать несколько каналов DMA и даже реализовать некий QoS, т.к. каналы DMA с меньшим номером имеют больший приоритет. :)


Вернуться к началу
СообщениеДобавлено: 2021-сен-23 16:15 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 448
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
ripandtear писал(а): *
Есть следующая проблема. Необходимо на данном МК запускать DMA-передачу в канале в режиме PingPong из альтернативной структуры (режим память->периферия) программным способом (Software-запуск DMA-передачи). Собственно, проблема заключается в том, что передача не стартует именно из альтернативной структуры. При запуске из основной структуры - передача происходит нормально.

В документации подразумевается, что такое возможно - "Режим работы для выбранного канала, при котором контроллер получает начальный запрос и затем выполняет цикл DMA, используя первичную или альтернативную структуру данных." Цитата из спецификации на МК на режим PingPong (стр. 336).

Может быть, кто-то сможет подсказать, в чем может заключаться проблема ?
Здравствуйте!

Предоставьте, пожалуйста, код инициализации обеих структур DMA, а также обработку прерывания от DMA с переинициализацией структур.

Проверил работоспособность, запуск с альтернативной структуры в режиме Ping-Pong выполняется корректно, обмен по программным запросам идёт правильно, после отработки всех циклов DMA контроллер DMA аппаратно меняет структуру с альтернативной на основную в регистре CHNL_PRI_ALT_SET, при этом возникает прерывание. Обратите, пожалуйста, внимание, что в прерывании важно выполнить правильную переинициализацию структур, на Вашем этапе рассмотрения проблемы проследите, не искажаются ли данные после инициализаций по адресам расположения базовых структур. В прерывании необходимо разделять инициализацию как основной, так и альтернативной структуры по тем предложениям, что сделал пользователь StartMilandr, при этом программно подход может выглядеть следующим образом (как пример собственной реализации):
Открыть
void DMA_IRQHandler(void)
{
	DMA_Cmd (DMA_Channel_SW5, DISABLE);
	if (DMA_InitStructure.DMA_SelectDataStructure == DMA_CTRL_DATA_PRIMARY) {
		
	DMA_Channel_InitStructure.DMA_SourceBaseAddr = (uint32_t)0x20001238; // rand data
	DMA_Channel_InitStructure.DMA_DestBaseAddr = DMA_Channel_InitStructure.DMA_DestBaseAddr + 0x24; // bias for 10 cycles

	DMA_Channel_InitStructure.DMA_CycleSize = Cycle; 
	DMA_Channel_InitStructureAlt.DMA_CycleSize = Cycle;		
	DMA_Channel_InitStructure.DMA_SourceIncSize = DMA_SourceIncNo;   
	DMA_Channel_InitStructure.DMA_DestIncSize = DMA_DestIncWord;  
	DMA_Channel_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;     
	DMA_Channel_InitStructure.DMA_NumContinuous = DMA_Transfers_1;  
	DMA_Channel_InitStructure.DMA_SourceProtCtrl = DMA_SourcePrivileged; 
	DMA_Channel_InitStructure.DMA_DestProtCtrl = DMA_DestPrivileged; 
	DMA_Channel_InitStructure.DMA_Mode = DMA_Mode_PingPong; 
	DMA_InitStructure.DMA_SelectDataStructure = DMA_CTRL_DATA_ALTERNATE;
		
	DMA_Init (DMA_Channel_SW5, &DMA_InitStructure);
	DMA_Cmd (DMA_Channel_SW5, ENABLE);
		
	}

	else if (DMA_InitStructure.DMA_SelectDataStructure == DMA_CTRL_DATA_ALTERNATE)
	{

	DMA_Channel_InitStructure.DMA_SourceBaseAddr = (uint32_t)0x20001238; // rand data
	DMA_Channel_InitStructureAlt.DMA_DestBaseAddr = DMA_Channel_InitStructureAlt.DMA_DestBaseAddr + 0x24; // bias for 10 cycles
	DMA_Channel_InitStructure.DMA_CycleSize = Cycle; 
	DMA_Channel_InitStructureAlt.DMA_CycleSize = Cycle;		
	DMA_Channel_InitStructure.DMA_SourceIncSize = DMA_SourceIncNo;   
	DMA_Channel_InitStructure.DMA_DestIncSize = DMA_DestIncWord;  
	DMA_Channel_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;     
	DMA_Channel_InitStructure.DMA_NumContinuous = DMA_Transfers_1;  
	DMA_Channel_InitStructure.DMA_SourceProtCtrl = DMA_SourcePrivileged; 
	DMA_Channel_InitStructure.DMA_DestProtCtrl = DMA_DestPrivileged; 
	DMA_Channel_InitStructure.DMA_Mode = DMA_Mode_PingPong; 
	DMA_InitStructure.DMA_SelectDataStructure = DMA_CTRL_DATA_PRIMARY;
		
	DMA_Init (DMA_Channel_SW5, &DMA_InitStructure);
	DMA_Cmd (DMA_Channel_SW5, ENABLE);
	
	}
}
Закрыть
Запуск с основной структуры в режиме Ping-Pong также выполняется корректно, работа с аппаратным переводом структур выполняется правильно. Соответственно, просьба проследить за возможным искажением структур пошагово в ходе отладки, постараться применить схожий алгоритм в своей работе с тем, что представлен в этом посте. Спасибо за обращение.

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


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

Зарегистрирован: 2021-сен-21 17:16
Сообщения: 5
Организация: Частное лицо
Здравствуйте. Спасибо за информацию, я еще раз все проверю учитывая ваш комментарий, и если проблема не разрешится - подготовлю короткий простой пример, где можно будет наблюдать данное поведение.


Вернуться к началу
СообщениеДобавлено: 2021-сен-24 15:27 
Не в сети

Зарегистрирован: 2021-сен-21 17:16
Сообщения: 5
Организация: Частное лицо
Проблему решил. Дело было в неправильном вычислении адреса канала, теперь все работает как положено. Спасибо всем за помощь.


Вернуться к началу
СообщениеДобавлено: 2021-сен-24 18:39 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 448
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
ripandtear писал(а): *
Проблему решил. Дело было в неправильном вычислении адреса канала, теперь все работает как положено. Спасибо всем за помощь.
Здравствуйте!

Большое спасибо за информацию. Если возникнут проблемы, можете также обращаться напрямую в отдел технической поддержки компании Миландр по электронной почте support@milandr.ru или по телефону 8(495)221-13-55.

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


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

Часовой пояс: UTC+03:00


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

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


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB