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

 
 
> LPC17xx: использование DMA и SLEEP, несовместимо?
sonycman
сообщение Aug 25 2010, 18:40
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Доброго времени суток.

Сегодня весь вечер убил на то, чтобы понять, почему стала глючить передача по SSP с помощью DMA на LPC1768.

Под scmRTOS выполняются несколько процессов, и в определённый момент один из них использует DMA для работы с картой памяти.
А в Idle процессе есть инструкция __WFI(), чтобы остановить CPU, пока делать особо нечего.

Но после того, как выполняется WFI(), перестаёт нормально работать DMA - передача идёт и завершается нормально, только передаются нули вместо нужных данных.
Пробовал располагать данные в ОЗУ или во флеш - толку нет.

В принципе, правильно - DMA вроде тактируется от одного с CPU клока, который в SLEEP режиме останавливается.
Поэтому и не может DMA нормально работать.

Но это ведь облом получается - что-же, если пользуешься DMA, то режимы энергосбережения не получится включать?
В мануале только предупреждение о DEBUG, а о косяках DMA и слова нет sad.gif

Может быть, есть способ решить эту проблему?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
rezident
сообщение Aug 25 2010, 19:02
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(sonycman @ Aug 26 2010, 00:40) *
Поэтому и не может DMA нормально работать.



Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 25 2010, 19:11
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Но почему тогда не работает?
Вот такой код:
Код
    dword    dummy    =    0xff;

    //channel 3, from mem8 to per8, 512 bytes
    LPC_GPDMACH3->DMACCSrcAddr = (dword)&dummy;
    LPC_GPDMACH3->DMACCDestAddr = (dword)&(LPC_SSP0->DR);
    LPC_GPDMACH3->DMACCLLI = 0;
    LPC_GPDMACH3->DMACCControl = DMA_CHxCNTR_TR_SIZE(512) | DMA_CHxCNTR_INT_COMPL_ENABLE;
    LPC_GPDMACH3->DMACCConfig = DMA_CHxCONF_MEM_TO_PER | DMA_CHxCONF_DST_SSP0_TX |
                                DMA_CHxCONF_INT_ERROR_MSK | DMA_CHxCONF_INT_COMPL_MSK | DMA_CHxCONF_ENABLE;

как только убираю __WFI() из IDLE процесса - всё пучком.
Иначе - с определённого момента вместо передачи 0xff - нули sad.gif
Go to the top of the page
 
+Quote Post
sonycman
сообщение Aug 25 2010, 20:22
Сообщение #4


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



rezident
Решил проблему - в режиме сна работает только "верхний" 32к регион памяти 1768 - так называемый AHB_RAM_MEMORY.
Именно с ним может работать DMA, а с нижней, обычной, половиной ничего не получится.

Спасибо за подсказку smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 11:34
Рейтинг@Mail.ru


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