zvs 0 17 марта, 2007 Опубликовано 17 марта, 2007 · Жалоба 2 jur: Спасибо, я уже разобрался. У меня ПЛИС и дескриптор просто хранится в ROM. Так вот глюк был связан с тем, что в дескрипторе было одно "лишнее" значение (в файле инициализации ROM был пропущен один адрес). Теперь все в норме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zvs 0 17 марта, 2007 Опубликовано 17 марта, 2007 · Жалоба Проблемы продолжаются :angry2: Установил ЕР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к :( Но самое жуткое, что период между двумя "приемами" составляет порядка секунды :angry2: [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 передавал быстрее :( Никто с подобным не сталкивался? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zvs 0 19 марта, 2007 Опубликовано 19 марта, 2007 · Жалоба Вернулся обратно к булкам. При увеличении буфера према в программе на ПК до 8192 байт, т.е. грубо говоря USBDevice->EndPoints[3]->XferData(buf[8192],8192) добился скорости в 7,5Мб/сек. Дальнейшее увеличение размера буфера прибавки в скорости не дает. Ну что ж, будем жить так... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jur 0 20 марта, 2007 Опубликовано 20 марта, 2007 · Жалоба Synchronization type: none - вот эта строчка меня тихо смущает... :( По всей видимости, Монитор имеет ввиду, что изохронная передача не использует квитирования. Собственно в чем проблема: Согласно тому же ЮСБ Порт Монитору из 4к данных при каждой попытке принимается только 2к :( Но самое жуткое, что период между двумя "приемами" составляет порядка секунды К сожалению, с изохронами я не работал, ничего толкового подсказать не могу... Вернулся обратно к булкам. При увеличении буфера према в программе на ПК до 8192 байт, т.е. грубо говоря USBDevice->EndPoints[3]->XferData(buf[8192],8192) добился скорости в 7,5Мб/сек. Дальнейшее увеличение размера буфера прибавки в скорости не дает. Ну что ж, будем жить так... Странно... Булка стабильно качает под 40 МБ/сек. Я проверял даже на слабых embedded-материнках. Думаю, что стоило бы попробовать передавать не с помощью синхронной XferData, а с помощью асинхронной связки BeginDataXfer-WaitForXfer-FinishDataXfer. Дело в том, что эта троица позволяет здорово распараллеливать процесс передачи данных, поэтому получается наивысшая возможная скорость передачи (я использую очередь из 4-х запросов, как в сайпрессовском примере Strimmer). А простая XferData - синхронная передача. Пока одну передачу не завершит новую не начнет. Наверное именно в этом проблема. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vhlshik 0 20 марта, 2007 Опубликовано 20 марта, 2007 · Жалоба скиньте плз у кого есть содержание eepromины с дескрипторами (не дефолтовыми). Я по образу и подобию приведенного в датащите написал свой, но винда ругается и говорит, что устройство failed enumeration Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vhlshik 0 20 марта, 2007 Опубликовано 20 марта, 2007 · Жалоба пардон, дефолтовая енумерация тож не проходит, хотя сайпрес пзуху читает - видно на осциллографе, после чтения подтягивает D+ - и все! вот то что я гружу c4 0a 00 c4 06 00 33 33 20 02 10 11 (все ID "от фонаря") что бы это могло быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jur 0 20 марта, 2007 Опубликовано 20 марта, 2007 · Жалоба вот то что я гружу c4 0a 00 c4 06 00 33 33 20 02 10 11 (все ID "от фонаря") что бы это могло быть? Может стоит попробовать реальные ID? Их можно взять из INF файла USB-шного драйвера (VID и PID). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Warlord 0 21 марта, 2007 Опубликовано 21 марта, 2007 · Жалоба Какие грузить VID и PID - это все равно, проблема еще в чем-то. Попробуй микросовтовскую утилиту USBView или USB Monitor, глянь ходит ли там ваще чего-нибудь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vhlshik 0 21 марта, 2007 Опубликовано 21 марта, 2007 · Жалоба докладываю :) USBView - все в нулях, похоже обмена по юсб нет ваще. для чистоты эксперимента подтянул к 3.3 SLRD,SLWR,SLOE,RST так что при енумерации ниче не должно мешать. кварц вроде тож завелся. чудеса какие-то Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Warlord 0 21 марта, 2007 Опубликовано 21 марта, 2007 · Жалоба Если по нулям, то может камню не нравится содержимое пзухи или он не может ее прочитать, хотя делает попытки... А почему первый байт 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vhlshik 0 21 марта, 2007 Опубликовано 21 марта, 2007 · Жалоба странно, у меня в описании написано 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. ща скачаю более новый Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Warlord 0 21 марта, 2007 Опубликовано 21 марта, 2007 · Жалоба прости, я про fx2... но не суть важно, убедись, что камень считывает ПЗУху, т.е. достает информацию. А то может он стучит, а достучаться не может.. В мануале сказано, что если нет памяти внешней никакой, то камень грузит инфу по умолчанию, так вот я проверил, что если выдернуть ПЗУху, то камень молчит как партизан, виндофс говорит, что устройство неправильно пронумеровано, а USBView соотвесно дает нули.. почему камень не энумеруется, вот вопрос.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vhlshik 0 21 марта, 2007 Опубликовано 21 марта, 2007 · Жалоба у меня без пзу D+ висит в воздухе. так что, по крайней мере, первые два байта читаются :). Ладно, буду искать аппаратные глюки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vhlshik 0 22 марта, 2007 Опубликовано 22 марта, 2007 · Жалоба дас, все прозаично :glare: на плате были перептаны местами D+ и D-... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zvs 0 23 марта, 2007 Опубликовано 23 марта, 2007 · Жалоба Странно... Булка стабильно качает под 40 МБ/сек. Я проверял даже на слабых embedded-материнках. Думаю, что стоило бы попробовать передавать не с помощью синхронной XferData, а с помощью асинхронной связки BeginDataXfer-WaitForXfer-FinishDataXfer. Дело в том, что эта троица позволяет здорово распараллеливать процесс передачи данных, поэтому получается наивысшая возможная скорость передачи (я использую очередь из 4-х запросов, как в сайпрессовском примере Strimmer). А простая XferData - синхронная передача. Пока одну передачу не завершит новую не начнет. Наверное именно в этом проблема. Переделал программу под BeginDataXfer-WaitForXfer-FinishDataXfer. Ничего не изменилось. Все те же 7.5 Мбайт/сек. Данные запихиваются в SX2 через каждые три такта 20 мегагерцового клока. Используется асинхронный интерфейс с SX2. То бишь в контроллер я засовываю данные со скоростью 13 Мбайт в секунду, а с другой стороны (в ПК) получаю их в два раза медленнее :(. 2 jur: 1. Вы с SX2 работаете синхронно или асинхронно? 2. Дескриптор тот что по умолчанию или свой? 3. Какие-то настройки в регистрах делаете? 4. Когда принимаете большой массив (например 100 мегабайт) связкой BeginDataXfer-WaitForXfer-FinishDataXfer какой выставляете размер буфера на прием? Заранее спасибо за ответы! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться