sonycman 0 25 августа, 2010 Опубликовано 25 августа, 2010 · Жалоба Доброго времени суток. Сегодня весь вечер убил на то, чтобы понять, почему стала глючить передача по SSP с помощью DMA на LPC1768. Под scmRTOS выполняются несколько процессов, и в определённый момент один из них использует DMA для работы с картой памяти. А в Idle процессе есть инструкция __WFI(), чтобы остановить CPU, пока делать особо нечего. Но после того, как выполняется WFI(), перестаёт нормально работать DMA - передача идёт и завершается нормально, только передаются нули вместо нужных данных. Пробовал располагать данные в ОЗУ или во флеш - толку нет. В принципе, правильно - DMA вроде тактируется от одного с CPU клока, который в SLEEP режиме останавливается. Поэтому и не может DMA нормально работать. Но это ведь облом получается - что-же, если пользуешься DMA, то режимы энергосбережения не получится включать? В мануале только предупреждение о DEBUG, а о косяках DMA и слова нет :( Может быть, есть способ решить эту проблему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 25 августа, 2010 Опубликовано 25 августа, 2010 · Жалоба Поэтому и не может DMA нормально работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 25 августа, 2010 Опубликовано 25 августа, 2010 · Жалоба Но почему тогда не работает? Вот такой код: 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 - нули :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 25 августа, 2010 Опубликовано 25 августа, 2010 · Жалоба rezident Решил проблему - в режиме сна работает только "верхний" 32к регион памяти 1768 - так называемый AHB_RAM_MEMORY. Именно с ним может работать DMA, а с нижней, обычной, половиной ничего не получится. Спасибо за подсказку :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться