Добрый день всем. Такая проблема. Есть СОПЦ, в нем прерывание (не VIC) возникает при приеме пакета (пакет передается по ДМА, не эзернет, ДМА стрим то мемори). Прерывание возникает именно по ДМА, когда дескриптор чейн обработан, т.е. принято заданное количество байт, в конце обработчика этот же дескриптор чейн запускается снова и ожидается прерывание. Пакеты формируются демодулятором сигнала. Собственно беда: если сигнал идет (подан) при запуске ДМА, т.е. если данные валятся при запуске ДМА, то все ОК. Потом сигнал можно остановить, подождать, снова подать - все нормально, прерывание срабатывает. Если сигнал при запуске ДМА не подан, т.е. данные не идут, то потом, после подключения сигнала, когда уже валятся данные, прерывание не срабатывает пока не перезапустишь ДМА.
Вот и не могу понять где проблема: пакеты собственно тоже идут периодически, с паузами в несколько сотен микросекунд, пакеты маленькие, по 300 байт.
Как понять, ждет ДМА сейчас данные или по приходу пакета прерывания уже не будет? Может на ДМА какой таймаут есть, но тогда в работе при отключении сигнала и повторном подключении прерывания бы уже не было... Или может при первом прерывании, когда данные не идут, ошибка какая в ДМА срабатывает? Но почему только при первом, а при прерывании и восстановлении потока уже не срабатывает?
Буду благодарен за любые идеи...
UPD: похоже понял. Остался единственный вопрос: если ДМА запущен, а данные не идут, как его прервать? В доке нашел бит STOP_DMA_ER. Можно ли им прервать транзакцию? И какова последовательность? Нужно ли бит run сбрасывать, ставить?