Может кто сталкивался.
SPI передает и принимает с использованием DMA.
Очевидно, что для приема надо передавать хоть что-то (суть SPI), что я делаю с помощью двух каналов DMA:
- каналы приема (RX) и передачи (TX) взводятся, при этом в оба загружаются, естественно, одинаковые счетчики.
- толкается DMA TX.
- ожидается завершение DMA RX.
Так вот, иногда (не воспроизводимо и спорадически) из цикла ожидания можно и не выйти, а если прервать, то наблюдается следующее состояние:
- канал TX выплюнул всё (его счетчик 0).
- канал RX еще ждет, т.к. его счетчик равен 1,
- в SPI установлен бит переполнения по приему.
Из этого я делаю вывод, что приемный DMA в какой-то момент не успел выбрать байт из RX, а очередная передача успела напихать ему следующий байт. Я предполагал такую ситуацию, почему и повысил приоритет приемного канала (в экспериментах - даже до максимально возможного) относительно передающего, но спорадически зависание-таки имеет место.
Частота процессора: от 24 до 48MHz (переключаю выше, когда подсоединяется USB), частота SPI1 12MHz или 24MHz соответственно. SPI работает с SPI flash, которая может от 25MHz и выше.
Есть идеи?