|
CY7C68013A постоянная булочная передача, прога для компа |
|
|
|
Feb 5 2007, 14:54
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Feb 7 2007, 08:20
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
Цитата(torik @ Feb 6 2007, 08:56)  ах да - может это както связано с регистром AUTOPTRSETUP? Не думаю. AUTOPTR - вообще штука удобная, не нужно делать дополнительное приращение указателей адресов массивов. Хотя это и не принципиально... Ты расписал инициализацию, но не показал, как сделана сама передача данных. Может там "собака порылась"?
--------------------
MPEG-4 - в массы!
|
|
|
|
|
Feb 7 2007, 17:05
|
Местный
  
Группа: Свой
Сообщений: 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 - в массы!
|
|
|
|
|
Feb 8 2007, 09:00
|

Гуру
     
Группа: Свой
Сообщений: 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
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Feb 8 2007, 23:14
|
Местный
  
Группа: Свой
Сообщений: 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 - в массы!
|
|
|
|
|
Feb 10 2007, 15:09
|

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

|
Насчет проверки... Сделано, только программное заполнение буфера - пройденный этап. Я сделал так: - с порта D на порт B кинул провода - это типа данные на вход ФИФО  - с порта C даю сигнал SLWR (в асинхронном режиме работаю) - на порт С еще флаги принимаю и отображаю их на светодиоды. Все работает, например, нажимаю кнопку и контроллер выдает на порты (на свои же) сигналы такие какие должны поступать с моей камеры. Смотрю флаги, принимаю пакеты на комп в консоль... и програмульку, сделанную на основе примера идущего в комплекте с CyAPI.... Но когда подключаю камеру все несколько сложнее - скорость порядка 11 Мбайт/с. И програмулька самодельная не справляется с приемом данных...
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Feb 13 2007, 08:12
|
Местный
  
Группа: Свой
Сообщений: 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 - в массы!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|