Ну в общем случае имеем параллельную шину данных и три клока: кадровый синхроимпульс, строчный синхроимпульс и пиксельный клок. Для снятия кадра нам нужно выполнить следующую последовательность шагов:
1) Поймать начало кадра по растущему фронту кадрового синхроимпульса (например по прерыванию или ожидая его в коротком цикле). Перед этим или после этого нужно сбросить счётчик строк и пикселов в строке.
2) Поймать начало строки также по растущему фронту.
3) Поймать растущий фронт пиксельного фронта, и положить байт, находящийся в данный момент на шине данных в память. Увеличить счётчик пикселов на единицу (или сдвинуть указатель)
4) Повторять шаг 3 до тех пор пока не закончатся пикселы в строке. (количество пикселов можно захардкодить вручную, зная разрешение матрицы, либо мониторить состояние строчного синхроимпульса. Поймали обратный фронт - строка закончилась)
5) После окончания приёма строки увеличить счётчик строк на единицу, сбросить счётчик пикселов, перейти на шаг 2 и начать приём следующей строки.
6) После приёма последней строки (также можно захардкодить или поймать по кадровому импульсу) мы имеем в памяти полный кадр. После этого нужно переправить полученный дамп в комп по любому доступному интерфейсу (UART, USB, Bluetooth, Wi-Fi etc.)
На каждом из этих шагов есть куча места где может зарыться собака
. В основном это связано с жёсткими временными интервалами между импульсами, и (как в моём случае) ограничениями памяти используемого проца. Если нет желания реализовывать всё это программно, можно переложить эту операцию на плечи хардвары. В качестве иллюстрации такого подхода можно привести в пример камеру CMUCam3. Там проц только ждёт кадровый синхроимпульс (шаг 1) после чего разрешает работу хардварного FIFO буфера, в который матрица складывает картинку полностью в автоматическом режиме без участия проца. Потом проц может забрать готовую картинку из буфера в любое удобное ему время.