ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
3 июля
565654
BaRaGoZ (12.12.2014 20:14, просмотров: 8932)
Используя STM32F407, через USB, хочу записать видео с камеры ov7660(тему по проблемам с камерой я уже создавал, но теперь проблема в другом, решил еще один топик создать). Запись будет идти либо на SD либо на FLASH USB. Видеокартинку получаю в прерывании от DMA, можно весь буфер, можно 1/2,1/4 и тд пикселей, дальше для контроля вывожу на LCD, и затем должен записать на носитель. Немного покрутив МК и камеру, понял, что "мощей" МК не хватит "хватать" 30 кадров в секунду и сжимать в JPEG для дальнейшей передачи, поэтому в конечной версии в разрыв МК и камеры поставлю аппаратный кодер, а пока его нету, эксперемент провожу на разрешении 160*120 по 2 байта на пиксель.Представил ситуацию, что писать буду на флешку по USB, но решил для наглядности сначала по USB просто скидывать на компьютер, отображая в реальном времени. Казалось бы, если использовать USB, то скорости 12Мбит хватит, дабы если даже идет 30 кадров в секунду , то размер кадра 160*120*2 = 38400, затем на 30 кадров ~ 9,2Мбита в секунду, и это максимум...Хотя до этого и имел опыт работы с USB Flash и виртуального ком порта, но проблемы посыпались одна за другой, видимо из-за недостаточного понимания каких то моментов. 1) Сначала решил просто сделать USB как VCP,(проект брал из примера). Причем организовал DMA канал между DCMI и буфером USB напрямую, буфер задал размеров в 38403 байта, а в обработчике прерывания от DMA просто сдвигал переменную - указатель на буфер отправки по USB (APP_Rx_Buffer ,APP_Rx_ptr_in соответсчтвено). Кадров явно не хватает, максимум около 3 в секунду программка из винды ловит. Начал искать в инете, какую скорость можно получить по VCP, ничего толком не нашел, в книжках тоже, хотя передача вроде как ведется BULK... Решил, что может просто драйвер СТМ порта под винду "не тянет", дабы не предназначен для такого. Пошел дальше. 2) Решил попробовать сделать изохронную передачу, причем не читая спецификации HID устройств взял для "переделки" пример HID custom, пример с аудио не захотел. Там добавил еще одну конечную точку с изохронной(хотя потом проборвал и булк ее сделать и вообще с прерываниями) передачей, через 1ую(которая в примере) пакеты передаются, через 2ю нет, кстати пробовал переименовать 1ую точку с 0x81 на 0x82, тоже передача прекратилась.Потом прочитав в книге , что HID тянет толко 64Кбит/сек оставил эту затею. Куда двигаться дальше не знаю ..., дабы примеры есть только на HID, Audio, MSC, и CDC... Может быть и булк потянул бы, если правильно класс устройства подобрать что ли, но сразу втягиваться опасаусь в написание, дабы USB мне лишь знакомо, и возиться с ним долго, лучше сразу выбрать правильный вариант! Более того под самой виндой использую библиотеку libusb, она почему то видит все устройства, а открывает только HID! Отсюда вопросы: 1)Какой класс устройства надо описывать, для этой задачи, какую концепцию передачи вложить в проект? 2)Откуда взять пример какой ть похожий(просто класс то описать структурами можно, а как организовывать посылку для данного класса не ясно, тем более в изохронном режиме...)? 3)Как лучше написать ответную часть под виндой для данного устройства? Заранее спасибо.