Перейти к содержанию
    

LPC17xx: использование DMA и SLEEP

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

 

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

 

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

А в Idle процессе есть инструкция __WFI(), чтобы остановить CPU, пока делать особо нечего.

 

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

Пробовал располагать данные в ОЗУ или во флеш - толку нет.

 

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

Поэтому и не может DMA нормально работать.

 

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

В мануале только предупреждение о DEBUG, а о косяках DMA и слова нет :(

 

Может быть, есть способ решить эту проблему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но почему тогда не работает?

Вот такой код:

    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 - нули :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

rezident

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

Именно с ним может работать DMA, а с нижней, обычной, половиной ничего не получится.

 

Спасибо за подсказку :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...