Atmel SAMD21 DMA C сбой обратной записи? - PullRequest
0 голосов
/ 10 июля 2020

Я использую несколько каналов DMA в Atmel SAMD21G18A (в Arduino MKR1000), и я вижу явно некорректное поведение.

Каналы 2 и 3 DMA обслуживают канал SERCOM SPI, используя одноблочные передачи с прерыванием завершения. Канал 0 DMA непрерывно записывает последовательность значений в DA C, запускаемую каналом T CC. Он использует один дескриптор для блока, который соединяется с самим собой, чтобы работать непрерывно со скоростью, определяемой T CC (10 мкс на такт, но изменение этого не предотвращает проблемы).

Проблема, которую я вижу, заключается в том, что после работы в течение переменного количества времени, обычно от 5 секунд до пары минут, канал 0 останавливается - это означает отсутствие ошибки, просто TCMPL (передача завершена). Если я включаю прерывание TCMPL, прерывание выдается при остановке канала, но не раньше, пока оно успешно повторяется. Покачивание GP IOs в DMA C ISR показывает, что сбой всегда происходит сразу после того, как канал 2 или 3 завершил передачу блока.

Когда я исследую массив обратной записи дескриптора, я обнаруживаю, что данные канала для канала 0 были записаны с точными данными канала для канала 2 или канала 3 , что, представляя завершенную передачу, вызывает деактивацию канала 0. Никакая окружающая память не затронута, и та же проблема возникает, если я назначаю разные каналы DMA.

Мне известно об элементе 1.7.2 в Silicon Errata , но я применяя указанный обходной путь, убедившись, что номер канала для нового включенного канала (т.е. канал 2 или 3) больше номеров других каналов (канал 0).

Я предполагаю, что я делаю что-то еще не так - Я подозреваю, что самоцепление как-то связано с этим - но пока я работаю над минимальным примером, которым хочу поделиться, мне интересно, сталкивался ли кто-нибудь с подобной проблемой?

...