реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> CY7C68013A постоянная булочная передача, прога для компа
torik
сообщение Feb 1 2007, 18:07
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Снова привет!

Ковыряюсь с этой платой CY3681, драйвер CyUSB....

Состряпал девайс - точка 1 IN интераптовая а также точки 2 OUT и 6 IN по 512 байт.
Пока зациклена точка 2 на точку 6, т.е. чо передаем с компа то обратно отсылаем...
Все это проверяется с помощью CyConsole... и вот какая проблема: в этой программе нельзя непрерывно принимать данные и записывать их в файл.

Может знает кто какую прогу чтобы это делать или другой выход? а то я с програмированием под комп на твою мать...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
Warlord
сообщение Feb 2 2007, 11:02
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 23-09-05
Из: Москва
Пользователь №: 8 874



Выход один, учиться программировать на ПК. Это тебе еще не раз пригодится. Такую прогу сделать - десяток строк набросать smile.gif
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 2 2007, 15:39
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Аха - все получилось. Принимаю данные.
Следующий шаг - настроить автоточку. Данные в нее гнать с фифо (видео) и на компе принимать


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 5 2007, 14:54
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Ну вот и снова я...

Первый вопрос (не принципиальный, т.к. могу обойтись), спрашиваю из интереса:
- почему когда 6 IN точку настраиваем как интерапт или булочную в дескрипторах, а после вручную заполняем, то передача идет нормально без ошибок. Но когда делаем точку изохронной - все время получаем "Isoc IN Transfer. Isoc IN failed"? Как-то по-другому надо изохронной точкой пользоваться? (просто запись счетчика EP6BCH(L) не катит)...


А второй вопрос заключается в следующем:
В моем девайсе сделана точка 86 - IN, Bulk, 512 байт, 4-ёх кратная буферизация. На входы FD0-FD7 (PORTB) контроллера подается параллельный код с цифровой ч/б камеры (каждый байт - пиксель, разрешение 640*480), строб с этой камеры идет на вход SLWR контроллера (передний фронт), FIFOADR1:0 соответственно заданы как 10. Задача - качать этот поток байтов в комп.

Настраиваю ФИФО и точку следущим образом:

Код
    CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1);
    SYNCDELAY;
    IFCONFIG |= 0x4B;                                        //SLAVE FIFO, àñèíõð.
    SYNCDELAY;

    REVCTL = 0x03; // must set REVCTL.0 and REVCTL.1 to 1
    SYNCDELAY;
    SYNCDELAY;

    EP1OUTCFG = 0x00;                                        //see TRM section 15.14
    EP1INCFG = 0xb0;
    SYNCDELAY;                                                //in
    EP2CFG = 0xA0;                                            //out 4
    SYNCDELAY;                    
    EP4CFG = 0x00;
    SYNCDELAY;                    
    EP6CFG = 0xE0;                                            //in 4
    SYNCDELAY;                    
    EP8CFG = 0x00;

    FIFORESET = 0x80; // reset all FIFOs
    SYNCDELAY;
    FIFORESET = 0x02; // reset EP2
    SYNCDELAY;
    FIFORESET = 0x04; // reset EP4
    SYNCDELAY;
    FIFORESET = 0x06; // reset EP6
    SYNCDELAY;
    FIFORESET = 0x08; // reset EP8
    SYNCDELAY;
    FIFORESET = 0x00;
    SYNCDELAY;

    EP2FIFOCFG = 0x0;                                        //ýòè òî÷êè áåç ôèôû
    SYNCDELAY;
    EP4FIFOCFG = 0x0;
    SYNCDELAY;
    EP8FIFOCFG = 0x0;
    SYNCDELAY;

    EP6FIFOCFG = 0x08;                                        //8, àôòàèí,
    SYNCDELAY;
    EP6AUTOINLENH = 0x02;                                    //512
    SYNCDELAY;
    EP6AUTOINLENL = 0x00;
    SYNCDELAY;

    SYNCDELAY;                    
    EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.
    SYNCDELAY;                    
    EP2BCL = 0x80;
    SYNCDELAY;                    
    EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.
    SYNCDELAY;                    
    EP2BCL = 0x80;
    SYNCDELAY;                    
    EP4BCL = 0x80;                // arm EP4OUT by writing byte count w/skip.
    SYNCDELAY;                    
    EP4BCL = 0x80;    
    SYNCDELAY;                    
    EP4BCL = 0x80;                // arm EP4OUT by writing byte count w/skip.
    SYNCDELAY;                    
    EP4BCL = 0x80;    

    // enable dual autopointer feature
    AUTOPTRSETUP |= 0x01;



Чо не так настраиваю? Все время сплошные 0xB5 передаются.
На компе накалякана прога (с примера bulkloop содрана и доделана) и все передачи в ней неправильные. Когда вручную заполняю точку - все работает.
Вообще настроил вроде по мануалу, подозреваю - может прога на компе не справляется с приемом данных?

Но даже если не справляется и перегруз буферов ФИФО идет, разве я не должен через CyConsole хотя бы первае 4 512-ибайтных пакета получить?


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 6 2007, 09:56
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



ах да - может это както связано с регистром AUTOPTRSETUP?


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
jur
сообщение Feb 7 2007, 08:20
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(torik @ Feb 6 2007, 08:56) *
ах да - может это както связано с регистром AUTOPTRSETUP?
Не думаю. AUTOPTR - вообще штука удобная, не нужно делать дополнительное приращение указателей адресов массивов. Хотя это и не принципиально...

Ты расписал инициализацию, но не показал, как сделана сама передача данных. Может там "собака порылась"?


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 7 2007, 14:55
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Дык а чего еще нужно? К ФИФО подключены данные, асинхронный режим - передним фронтом запись.
Разве контроллер по заполнении буфера не должен передавать автоматически?


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
jur
сообщение Feb 7 2007, 17:05
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(torik @ Feb 7 2007, 13:55) *
Дык а чего еще нужно? К ФИФО подключены данные, асинхронный режим - передним фронтом запись.
Запись данных в микросхему происходит по заднему фронту, а не по переднему. Данные должны быть стабильны минимум за 10 ns перед ним и после него (документ "EZ-USB FX2LP USB Microcontroller", файл "cy7c68013a_8.pdf", стр. 46). Может в этом дело?

Еще полезно было бы сделать тестовый режим, когда данные приходят не от камеры, а генерятся самим микроконтроллером. Для проверки всего тракта от CY7C68013A до компьютерной программы.


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 8 2007, 09:00
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Цитата(jur @ Feb 7 2007, 17:05) *
Запись данных в микросхему происходит по заднему фронту, а не по переднему.
Данные должны быть стабильны минимум за 10 ns перед ним и после него (документ "EZ-USB FX2LP USB Microcontroller", файл "cy7c68013a_8.pdf", стр. 46). Может в этом дело?


EZ-USB FX2 CY7C68013 technical reference manual, страница 9-3, рис. 9-3. В асинхронном режиме запись/чтение происходит при переходе из активного в неактивный, по-умолчанию это 0 -> 1, т.е. передний фронт... Кроме того можно сделать и задний фронт... Учтено.

Цитата(jur @ Feb 7 2007, 17:05) *
Еще полезно было бы сделать тестовый режим, когда данные приходят не от камеры, а генерятся самим микроконтроллером. Для проверки всего тракта от CY7C68013A до компьютерной программы.


А ведь верно - это было бы удобно. Данные можно выдавать по PORTD (я использую 8 разрядов ФИФЫ), а куды лучше девать сигнал SLWR и флаги?

На фсякий случай выкладываю сам свой проект (там усе делается в файле bulkext.c
Прикрепленные файлы
Прикрепленный файл  bulkext.rar ( 110.8 килобайт ) Кол-во скачиваний: 102
 


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
jur
сообщение Feb 8 2007, 23:14
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(torik @ Feb 8 2007, 08:00) *
EZ-USB FX2 CY7C68013 technical reference manual, страница 9-3, рис. 9-3. В асинхронном режиме запись/чтение происходит при переходе из активного в неактивный, по-умолчанию это 0 -> 1, т.е. передний фронт... Кроме того можно сделать и задний фронт... Учтено.
Вот в чем дело! Я просто не понял, т.к. привык называть "передним фронтом" тот фронт, который приходит первым (вне зависимости от его полярности). В этом случае все правильно.

Цитата(torik @ Feb 8 2007, 08:00) *
А ведь верно - это было бы удобно. Данные можно выдавать по PORTD (я использую 8 разрядов ФИФЫ), а куды лучше девать сигнал SLWR и флаги?
Проще всего, IMHO, сделать так: заполняешь чем-нибудь буфер соответствующей ендпойнты и посылаешь его компьютеру. Т.е. вот такой код:

if(!(EP2468STAT & bmEP6FULL))
{ // check EP6 FULL(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is full
// Заполняешь буфер чем хочешь, например просто байтом счетчика пакетов
EP6FIFOBUF[0] = packet_counter++;
EP6BCH = 2; // send 512 bytes
SYNCDELAY;
EP6BCL = 0; // arm EP6IN
}

Цитата(torik @ Feb 8 2007, 08:00) *
На фсякий случай выкладываю сам свой проект (там усе делается в файле bulkext.c
Интересно будет ознакомиться. Завтра на работе посмотрю.


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 10 2007, 15:09
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Насчет проверки... Сделано, только программное заполнение буфера - пройденный этап.
Я сделал так:
- с порта D на порт B кинул провода - это типа данные на вход ФИФО smile.gif
- с порта C даю сигнал SLWR (в асинхронном режиме работаю)
- на порт С еще флаги принимаю и отображаю их на светодиоды.

Все работает, например, нажимаю кнопку и контроллер выдает на порты (на свои же) сигналы такие какие должны поступать с моей камеры. Смотрю флаги, принимаю пакеты на комп в консоль... и програмульку, сделанную на основе примера идущего в комплекте с CyAPI....
Но когда подключаю камеру все несколько сложнее - скорость порядка 11 Мбайт/с. И програмулька самодельная не справляется с приемом данных...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 10 2007, 17:19
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Получилось - сигнал с камеры пошел... Только пришлось делать в синхронном режиме, чтобы всякий мусор не принимать...
Хм... теперь как бы все это забабахать на комп...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
torik
сообщение Feb 12 2007, 09:44
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Ладно, с железом разобрались... теперь с программой на компе:

если делаю запись принимаемых данных в файл - скорость 1 Мбайт/с
если запись в файл убрать - скорость 2 Мбайт/с

Как увеличить скорость? Она должна быть в районе 11 МБайт/с


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
jur
сообщение Feb 13 2007, 08:12
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(torik @ Feb 12 2007, 08:44) *
Ладно, с железом разобрались... теперь с программой на компе:
если делаю запись принимаемых данных в файл - скорость 1 Мбайт/с
если запись в файл убрать - скорость 2 Мбайт/с
Как увеличить скорость? Она должна быть в районе 11 МБайт/с
Тут без вариантов. (Речь ведь идет о Винде, не так ли?) Нужно сделать отдельный поток, принимающий данные в ряд буферов. По мере их заполнения нужно в другом потоке производить блочную запись в файл. Причем, следует помнить о возможной ошибке: ни в коем случае не опрашивать готовность! Нужно пользоваться исключительно семафорами! Т.е. применить например такую пару (в потоке приема и потоке записи в файл соответственно):

SetEvent(DataBufferReadyEvent); -> WaitForMultipleObjects(2, m_hEventArray, FALSE, INFINITE);

Ну и, конечно, поиграться размерами и числом буферов, найти оптимум.


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
-Al-
сообщение Feb 13 2007, 11:58
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 330
Регистрация: 10-06-05
Из: Россия, Москва
Пользователь №: 5 894



Цитата(torik @ Feb 12 2007, 09:44) *
Ладно, с железом разобрались... теперь с программой на компе:

если делаю запись принимаемых данных в файл - скорость 1 Мбайт/с
если запись в файл убрать - скорость 2 Мбайт/с

Как увеличить скорость? Она должна быть в районе 11 МБайт/с

Странно вообще... даже в одном потоке можно добится 11МБ/сек, у Вас буфер передачи какой??
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01533 секунд с 7
ELECTRONIX ©2004-2016