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

 
 
10 страниц V  « < 6 7 8 9 10 >  
Reply to this topicStart new topic
> Работа с USB2.0 SX2, Ктонибуть использовал SX2
Гяук
сообщение Mar 17 2007, 11:29
Сообщение #106


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 6-12-04
Из: г. Таганрог
Пользователь №: 1 346



2 jur: Спасибо, я уже разобрался.
У меня ПЛИС и дескриптор просто хранится в ROM. Так вот глюк был связан с тем, что в дескрипторе было одно "лишнее" значение (в файле инициализации ROM был пропущен один адрес).
Теперь все в норме.
Go to the top of the page
 
+Quote Post
Гяук
сообщение Mar 17 2007, 17:14
Сообщение #107


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 6-12-04
Из: г. Таганрог
Пользователь №: 1 346



Проблемы продолжаются angry.gif
Установил ЕР6 как изохронную. По этому поводу программа A_d_v_a_n_c_e_d U_S_B P_o_r_t M_o_n_i_t_o_r сообщает следующее: (кстати, болеет программка. Ни у кого микстуры нету?)
Код
    Endpoint descriptor
      Endpoint address:  0x86, Input
      Transfer type:  Isochronous
      Synchronization type:  none - вот эта строчка меня тихо смущает... :(
      Usage type:  data endpoint
      Max packet size:  0x0200 (512)
      Interval:  0x00 (0)


Теперь о главном. Пытаюсь читать из этой ЕР...
Данные в FIFO сыпятся когда только можно (то есть если FIFO заполнилось, то прекращаю сыпаться. Как только оно не пустое - пишем снова).
FIFO забивается целиком (то есть все 1024 байта) за 1,825 мс.
Почитал CyAPI Programmer's Reference. Согласно ему
Цитата
For ISOC transfers, the buffer length and the endpoint's transfers size (see SetXferSize) must be a multiple of 8 times the endpoint's MaxPktSize

То бишь размер буфера на прием должен быть равен восьми размерам пакета. Причем поскольку EP изохронная не обязательно что все пакеты будут приняты. Вот мой кусочек проги, которым осуществляется чтение данных в ПК. Прием данных осуществляется в отдельном потоке. Оставил только все самое ценное...
Код
    CCyIsocEndPoint *IsoIn = USBDevice->IsocInEndPt;
    if(IsoIn)
    {
        long i_count = 4096; //количество принимаемых байт
        UCHAR buf[4096]={0}; //буфер для приема

        long recvdBytes; //реальное количество принятых байт

        CFile f;
        f.Open("ADC_contents.i16",CFile::modeCreate|CFile::modeWrite); //принятые данные пишутся в файл
        
        for(int addr=0; addr<100; addr++) // больше сотни раз не принимать
        {
            i_count = 4096;
            CCyIsoPktInfo *isoPktInfos;
            int pkts;  
            isoPktInfos = IsoIn->CreatePktInfos(i_count, pkts);
            if(!(IsoIn->XferData(buf,i_count,isoPktInfos))
            {
            //обработчик ошибки, когда невозможно принять данные от USB
            }
            else
            {
                recvdBytes = 0;
                for (int i=0; i<pkts; i++)
                {
                    if (isoPktInfos[i].Status == 0)
                    {
                        recvdBytes += isoPktInfos[i].Length;
                    }
                }
                                                f.Write(buf,recvdBytes);
                delete[]isoPktInfos;
            }
        }
        f.Close();
    }
    return(0);

Собственно в чем проблема:
Согласно тому же ЮСБ Порт Монитору из 4к данных при каждой попытке принимается только 2к sad.gif
Но самое жуткое, что период между двумя "приемами" составляет порядка секунды angry.gif
Код
[21] URB_FUNCTION_ISOCH_TRANSFER 20070317163800.578 (+0)
Pipe handle: 0x84C999CC
Transfer flags: 0x00000007 (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK)
[21] URB_FUNCTION_ISOCH_TRANSFER (SUCCESS/0x00000000) 20070317163801.421 (+843)
IRP status: 0x00000000 (STATUS_SUCCESS)


Ну какой он после это Isochronous? У меня Bulk передавал быстрее sad.gif
Никто с подобным не сталкивался?
Go to the top of the page
 
+Quote Post
Гяук
сообщение Mar 19 2007, 14:40
Сообщение #108


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 6-12-04
Из: г. Таганрог
Пользователь №: 1 346



Вернулся обратно к булкам.
При увеличении буфера према в программе на ПК до 8192 байт, т.е. грубо говоря
Код
USBDevice->EndPoints[3]->XferData(buf[8192],8192)

добился скорости в 7,5Мб/сек. Дальнейшее увеличение размера буфера прибавки в скорости не дает.

Ну что ж, будем жить так...
Go to the top of the page
 
+Quote Post
jur
сообщение Mar 20 2007, 08:26
Сообщение #109


Местный
***

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



Цитата(Гяук @ Mar 17 2007, 16:14) *
Код
      Synchronization type:  none - вот эта строчка меня тихо смущает... :(
По всей видимости, Монитор имеет ввиду, что изохронная передача не использует квитирования.

Цитата(Гяук @ Mar 17 2007, 16:14) *
Собственно в чем проблема:
Согласно тому же ЮСБ Порт Монитору из 4к данных при каждой попытке принимается только 2к sad.gif
Но самое жуткое, что период между двумя "приемами" составляет порядка секунды
К сожалению, с изохронами я не работал, ничего толкового подсказать не могу...

Цитата(Гяук @ Mar 19 2007, 13:40) *
Вернулся обратно к булкам.
При увеличении буфера према в программе на ПК до 8192 байт, т.е. грубо говоря
Код
USBDevice->EndPoints[3]->XferData(buf[8192],8192)
добился скорости в 7,5Мб/сек. Дальнейшее увеличение размера буфера прибавки в скорости не дает.
Ну что ж, будем жить так...
Странно... Булка стабильно качает под 40 МБ/сек. Я проверял даже на слабых embedded-материнках. Думаю, что стоило бы попробовать передавать не с помощью синхронной XferData, а с помощью асинхронной связки BeginDataXfer-WaitForXfer-FinishDataXfer. Дело в том, что эта троица позволяет здорово распараллеливать процесс передачи данных, поэтому получается наивысшая возможная скорость передачи (я использую очередь из 4-х запросов, как в сайпрессовском примере Strimmer). А простая XferData - синхронная передача. Пока одну передачу не завершит новую не начнет. Наверное именно в этом проблема.


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
vhlshik
сообщение Mar 20 2007, 18:11
Сообщение #110


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

Группа: Свой
Сообщений: 178
Регистрация: 24-12-04
Из: kharkov
Пользователь №: 1 663



скиньте плз у кого есть содержание eepromины с дескрипторами (не дефолтовыми). Я по образу и подобию приведенного в датащите написал свой, но винда ругается и говорит, что устройство failed enumeration
Go to the top of the page
 
+Quote Post
vhlshik
сообщение Mar 20 2007, 19:12
Сообщение #111


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

Группа: Свой
Сообщений: 178
Регистрация: 24-12-04
Из: kharkov
Пользователь №: 1 663



пардон, дефолтовая енумерация тож не проходит, хотя сайпрес пзуху читает - видно на осциллографе, после чтения подтягивает D+ - и все!
вот то что я гружу
c4 0a 00 c4 06 00 33 33 20 02 10 11 (все ID "от фонаря")
что бы это могло быть?
Go to the top of the page
 
+Quote Post
jur
сообщение Mar 20 2007, 19:37
Сообщение #112


Местный
***

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



Цитата(vhlshik @ Mar 20 2007, 18:12) *
вот то что я гружу
c4 0a 00 c4 06 00 33 33 20 02 10 11 (все ID "от фонаря")
что бы это могло быть?
Может стоит попробовать реальные ID? Их можно взять из INF файла USB-шного драйвера (VID и PID).


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
Warlord
сообщение Mar 21 2007, 10:42
Сообщение #113


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

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



Какие грузить VID и PID - это все равно, проблема еще в чем-то. Попробуй микросовтовскую утилиту USBView или USB Monitor, глянь ходит ли там ваще чего-нибудь.
Go to the top of the page
 
+Quote Post
vhlshik
сообщение Mar 21 2007, 11:53
Сообщение #114


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

Группа: Свой
Сообщений: 178
Регистрация: 24-12-04
Из: kharkov
Пользователь №: 1 663



докладываю smile.gif
USBView - все в нулях, похоже обмена по юсб нет ваще. для чистоты эксперимента подтянул к 3.3 SLRD,SLWR,SLOE,RST так что при енумерации ниче не должно мешать. кварц вроде тож завелся. чудеса какие-то
Go to the top of the page
 
+Quote Post
Warlord
сообщение Mar 21 2007, 12:23
Сообщение #115


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

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



Если по нулям, то может камню не нравится содержимое пзухи или он не может ее прочитать, хотя делает попытки... А почему первый байт 0xC4??
Цитата
During the power-up sequence, internal logic checks the I2C
port for the connection of an EEPROM whose first byte is
either 0xC0 or 0xC2.
Go to the top of the page
 
+Quote Post
vhlshik
сообщение Mar 21 2007, 15:23
Сообщение #116


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

Группа: Свой
Сообщений: 178
Регистрация: 24-12-04
Из: kharkov
Пользователь №: 1 663



странно, у меня в описании написано
During the power-up sequence, internal logic of the SX2 checks for the presence of an I2C EEPROM.[1,2] If it finds an EEPROM,
it will boot off the EEPROM. When the presence of an EEPROM is detected, the SX2 checks the value of first byte. If the first
byte is found to be a 0xC4, the SX2 loads the next two bytes into the IFCONFIG and POLAR registers, respectively. и т.д.
у меня cy7c68001.pdf revision D. ща скачаю более новый
Go to the top of the page
 
+Quote Post
Warlord
сообщение Mar 21 2007, 15:54
Сообщение #117


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

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



прости, я про fx2... но не суть важно, убедись, что камень считывает ПЗУху, т.е. достает информацию. А то может он стучит, а достучаться не может.. В мануале сказано, что если нет памяти внешней никакой, то камень грузит инфу по умолчанию, так вот я проверил, что если выдернуть ПЗУху, то камень молчит как партизан, виндофс говорит, что устройство неправильно пронумеровано, а USBView соотвесно дает нули.. почему камень не энумеруется, вот вопрос..
Go to the top of the page
 
+Quote Post
vhlshik
сообщение Mar 21 2007, 16:35
Сообщение #118


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

Группа: Свой
Сообщений: 178
Регистрация: 24-12-04
Из: kharkov
Пользователь №: 1 663



у меня без пзу D+ висит в воздухе. так что, по крайней мере, первые два байта читаются smile.gif. Ладно, буду искать аппаратные глюки
Go to the top of the page
 
+Quote Post
vhlshik
сообщение Mar 22 2007, 16:51
Сообщение #119


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

Группа: Свой
Сообщений: 178
Регистрация: 24-12-04
Из: kharkov
Пользователь №: 1 663



дас, все прозаично glare.gif
на плате были перептаны местами D+ и D-...
Go to the top of the page
 
+Quote Post
Гяук
сообщение Mar 23 2007, 12:50
Сообщение #120


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 6-12-04
Из: г. Таганрог
Пользователь №: 1 346



Цитата(jur @ Mar 20 2007, 08:26) *
Странно... Булка стабильно качает под 40 МБ/сек. Я проверял даже на слабых embedded-материнках. Думаю, что стоило бы попробовать передавать не с помощью синхронной XferData, а с помощью асинхронной связки BeginDataXfer-WaitForXfer-FinishDataXfer. Дело в том, что эта троица позволяет здорово распараллеливать процесс передачи данных, поэтому получается наивысшая возможная скорость передачи (я использую очередь из 4-х запросов, как в сайпрессовском примере Strimmer). А простая XferData - синхронная передача. Пока одну передачу не завершит новую не начнет. Наверное именно в этом проблема.


Переделал программу под BeginDataXfer-WaitForXfer-FinishDataXfer. Ничего не изменилось. Все те же 7.5 Мбайт/сек.
Данные запихиваются в SX2 через каждые три такта 20 мегагерцового клока. Используется асинхронный интерфейс с SX2.
То бишь в контроллер я засовываю данные со скоростью 13 Мбайт в секунду, а с другой стороны (в ПК) получаю их в два раза медленнее sad.gif.

2 jur:
1. Вы с SX2 работаете синхронно или асинхронно?
2. Дескриптор тот что по умолчанию или свой?
3. Какие-то настройки в регистрах делаете?
4. Когда принимаете большой массив (например 100 мегабайт) связкой BeginDataXfer-WaitForXfer-FinishDataXfer какой выставляете размер буфера на прием?
Заранее спасибо за ответы!
Go to the top of the page
 
+Quote Post

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

 


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


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