Доброго всем времени.
Бьюсь с получением данных от камеры в формате JPEG с помощью DCMI.
Проблема такая. Байты от камеры принимаются иногда по два одинаковых подряд.

Расстояние между "неправильными" байтами примерно 16-18 "правильных" байт. Приём данных от DCMI ведётся с использованием DMA2. Приоритет DMA2 максимальный. Настройки FIFO DMA2 использовал разные: выключено, и заполненность по всем 4 уровням. Частота сигнала камеры PCLK 13 мГц. Данные размещаются в RAM контроллера с адреса 0x20000000.
Шины AHB APB1,2 настроил по максимуму: AHB=120мГц, APB1=30мГц APB2=60мГц.
Что в работе контроллера может мешать приёму по DMA? Может ли DMA2 конфликтовать с какими-то шинами, участками памяти, или процессами контроллера? Или может не DMA а модуль DCMI может чем-то прерываться, или получать ложный сигнал срабатывания - ну и принимать иногда по два байта сразу? Или может частота 13 мГц слишком высокая? Может надо процессор на время приёма кадра как-то останавливать, чтоб он совсем никак не вмешивался в процесс приёма (при активизации DMA2 и DCMI процессор опрашивает регистр контроля DCMI_CR и регистр статуса DCMI_SR на предмет окончания приёма кадра, или возникновения ошибки).
Дело ещё и в том, что камера работает и в режиме видоискателя, и тогда выдаёт несжатые данные в формате YCbCr. И в этом режиме данные принимаются чётко, без всяких повторов. Я не могу найти повторы ни визуально, ни по выводимому на LCD изображению. Всё очень чётко. Вот пример.

Различия между двумя режимами такие:
1. Камера в режиме видоискателя выдаёт сигнал PCLK с частотой примерно 2,5 мГц, а в режиме JPEG 13 мГц.
2. Модуль DCMI в контроллере соответственно настраивается на режим несжатых данных (бит 3 DCMI_CR=0) и на режим JPEG (бит 3 DCMI_CR=1).
Собсно я пробовал принимать данные JPEG и в обычном режиме - разницы никакой, точно так-же принимаются двойные байты, с примерно такой-же дистанцией между ними.
3. В режиме видоискателя данные идут ровным потоком и распределены равномерно между двумя строчными импульсами, а в режиме JPEG камера выдаёт данные некоторыми порциями, между которыми сигнал PCLK остаётся неактивным.
Вот две картинки с логического анализатора Saleae Logic. Верхняя - это режим видоискателя. Нижняя - формат JPEG, в котором возникают проблемы. К сожалению, анализатор Saleae Logic не поддерживает сигналы выше 12 мГц и потому я не стал приводить сигналы под большим увеличением - всё равно они недействительны. Но для общей оценки вполне годится.
Сообщение отредактировал controller_m30 - Oct 10 2013, 03:23