реклама на сайте
подробности

 
 
> NXP LPC1778 GPDMA. Проблемы при паралеллельных DMA-транзакциях
jcxz
сообщение Aug 24 2012, 04:13
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Кто-нить работал на LPC1778 с GPDMA параллельно по нескольким каналам (т.е. - одновременно с наложением по времени на разных каналах с разной периферией)?
Такая проблема:
Имеем перекрывающуюся по времени работу по двум SSP-каналам через GPDMA (4 канала - 2TX, 2RX).
Если транзакции по времени не перекрываются - всё работает нормально.
Если происходит наложение (любого типа - или при работающем первом SSP-канале происходит запуск 2-го или при работающем втором - запуск первого, ожидаемое завершение 1го раньше чем 2-го или наоборот - позже), то работа SSP для, которого используются DMA-каналы с меньшим номером завершается нормально (приходит end-interrupt), работа SSP который использует большие номера DMA-каналов останавливается (в битовом поле работающих DMA-каналов, тот канал (RX-канал), по которому ожидается приход события завершения, застревает навечно в состоянии "active"). Соответственно не приходит прерывание о завершении и в регистре DMA.IntTCStat == 0).
Если обменять используемые SSP-каналами DMA-каналы местами, то проблема начинается на другом SSP-канале - всегда отваливается тот, у которого номера используемых DMA-каналов меньше.
Т.е. - как будто любая активность по DMA-каналу с меньшим номером останавливает или целиком работу более старших каналов DMA или останавливает приход end-interrupt по старшим каналам.

Просмотрел еррату - там пусто на этот счёт.
Или может кто сталкивался с подобным на предыдущих LPC17xx?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Aug 24 2012, 07:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Просто уникальный здесь форум! Почти два дня бился над проблемой, но как только написал здесь - сразу нашёл решение! biggrin.gif
В каждой паре RX/TX DMA-каналов поменял местами каналы для RX <-> TX - и всё заработало.
Т.е. раньше у меня было такое распределение каналов DMA:
enum {DMA_CH_fram_TX, DMA_CH_fram_RX, DMA_CH_dflash_TX, DMA_CH_dflash_RX};
поменял на:
enum {DMA_CH_fram_RX, DMA_CH_fram_TX, DMA_CH_dflash_RX, DMA_CH_dflash_TX};
Прерывание завершения транзакции по соотв. SSP у меня приходит для DMA_channel.RX. Получается, что когда DMA_channel.RX имеет больший номер (меньший приоритет?) чем DMA_channel.TX, то если параллельно запускается другая DMA-транзакция на другом SSP, происходит потеря завершения на 1-м SSP.
Обмен каналами между DMA_CH_fram и DMA_CH_dflash ни к чему не приводил - только вис другой канал. Как и просто смещение каналов на разные номера - всегда вис тот, у кого больше номера DMA-каналов.
Помогло только это - сделать RX-канал меньше номером, чем TX.....

PS: Может это кому-то поможет если кто столкнётся с аналогичной траблой.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 00:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01292 секунд с 7
ELECTRONIX ©2004-2016