Добрый день всем. Ситуация такая. Периодически приходят данные, которые отсылаю по dma на выход (мемори то стрим). Данные приходят регулярно, раз в 100 мс. Пока данные копятся в одном буфере, из второго в это время dma качает наружу. Когда проверяю с брейкпоинтами на процедурах старта dma - все стабильно работает. Т.е. нажимаю РАН - останавливается на брейкпоинте старта первого буфера, снова нажимаю РАН - останавливается на брейкпоинте второго буфера и т.д., в таком режиме все ок. Если убираешь брейк хотя бы с одного буфера, т.е. дма запускается два раза без брейка, - все, конец. Больше от ДМА данных не дождешься пока софт не перезапустишь. Признаки такие:
-дескрипторы не портятся, в обоих случаях одинаковые.
Регистры на брейкпоинте:
Статус регистр дма - 0x0000000C ( когда в норме, означает Chain complete + Descriptor complete) 0x00000014 ( когда НЕ в норме, означает Busy + Descriptor complete) Control регистр дма - 0x00020060 ( когда в норме, означает PARK+RUN+DMAERR) ??? Почему run и dmaerr, ведь транзакция закончена, а dmaerr вообще написано только для stream to memory, а у меня наоборот. 0x00020000 ( когда НЕ в норме, означает PARK)
Порылся в штатных алтеровских процедурах запуска тразакции - поскольку бит busy в 1 - они и не запускают дма. А чем он занят, не понятно. Сигнал дма Ready находится в 1, данные на выход не идут.
UPD: попробовал сделать простую программку, которая по очереди запускает дма сначала первого, потом второго буфера. По шагам все ок, как только запускаешь подряд сначала первый буфер, потом сразу второй - говорит busy и больше не стартует. Как то сбросить бы его...
|