Shakesbeer 0 23 апреля, 2013 Опубликовано 23 апреля, 2013 · Жалоба Написал простенькую програмку, которая посылает и принимает данные по USB. использую CY7C68013. За образец взял примеры из CyApI, использую поток thread с Bulk (стандартный Bulkloop.hex) передачами: : //--------------------------------------------------------------------------- //--------------------------Write-and-Read----------------------------------- //--------------------------------------------------------------------------- class WriteAndReadThread : public TThread { private: void __fastcall Printing(); //âûâîä protected: void __fastcall Execute(); //îñíîâíàÿ ôóíêöèÿ ïîòîêà public: __fastcall WriteAndReadThread(bool CreateSuspended); //êîíñòðóêòîð ïîòîêà }; //--------------------------------------------------------------------------- WriteAndReadThread *writereader; //--------------------------------------------------------------------------- __fastcall WriteAndReadThread::WriteAndReadThread(bool CreateSuspended) : TThread(CreateSuspended) {} //--------------------------------------------------------------------------- void __fastcall WriteAndReadThread::Execute() { bmap = new Graphics::TBitmap; // ñíà÷àëà ðèñóåì íà bitmap, ïîòîì âûâîäèì íà ôîðìó bmap->Width = Form1->Image1->Width; bmap->Height = Form1->Image1->Height; AnsiString stryng = Form1->Edit1->Text.c_str(); outBuf=new char[stryng.Length()+1];//length âîçâðàùàåò äëèííó áåç íóëü-òåðìèíàòîðà,ïîýòîìó +1 strcpy(outBuf,stryng.c_str()); length = stryng.Length()+1; while(!Terminated) { outOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_OUT"); UCHAR *outContext; outContext = USBDevice->BulkOutEndPt->BeginDataXfer(outBuf, length, &outOvLap); USBDevice->BulkOutEndPt->WaitForXfer(&outOvLap,100); succesOut = USBDevice->BulkOutEndPt->FinishDataXfer(outBuf, length, &outOvLap,outContext); if(!succesOut) //Åñëè ïðèåì èëè ïåðåäà÷à ñ îøèáêîé ïðîèçîøëè { writereader->Terminate(); if(drawer)drawer->Terminate(); Form1->SpeedButton1->Caption = "Begin transfer"; Form1->SpeedButton1->Down = false; Form1->Memo1->Lines->Add("Sending error!"); } CloseHandle(outOvLap.hEvent); inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN"); UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inBuf, length, &inOvLap); USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100); succesIn = USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext); if(!succesIn) //Åñëè ïðèåì èëè ïåðåäà÷à ñ îøèáêîé ïðîèçîøëè { writereader->Terminate(); if(drawer)drawer->Terminate(); Form1->SpeedButton1->Caption = "Begin transfer"; Form1->SpeedButton1->Down = false; Form1->Memo1->Lines->Add("Recieving error!"); } Synchronize(Printing); CloseHandle(inOvLap.hEvent); } } //--------------------------------------------------------------------------- void __fastcall WriteAndReadThread::Printing() { counter+=strlen(inBuf); Form1->Label2->Caption = counter; Form1->Memo2->Lines->Add(AnsiString((char *)inBuf)); for (unsigned int i = 0; i < strlen(inBuf); i++) { xpic++; if (xpic >= Form1->Image1->Picture->Width) { ypic++; xpic = 0; } if (ypic >= Form1->Image1->Picture->Height) { ypic = 0; Form1->Image1->Canvas->Draw(0,0,bmap); tempCol = tempCol - 16; if (tempCol<0) tempCol = 255; } bmap->Canvas->Pixels[xpic][ypic]=TColor(RGB(tempCol,tempCol,tempCol)); } ZeroMemory(inBuf, 512); } //--------------------------------------------------------------------------- Поток запускается и прекращается по нажатию кнопки. Скорость с которой передаются и принимаются данные около 1 Мбит/с. Каким образом можно её увеличить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_Sm 0 24 апреля, 2013 Опубликовано 24 апреля, 2013 · Жалоба Написал простенькую програмку, которая посылает и принимает данные по USB. использую CY7C68013. За образец взял примеры из CyApI, использую поток thread с Bulk (стандартный Bulkloop.hex) передачами: Скорость с которой передаются и принимаются данные около 1 Мбит/с. Каким образом можно её увеличить? Лень разбирать вышеописанный код. Пару стандартных ответов напишу, может пригодятся: 1) В стандартном примере вся обработка BULK запросов выполняется на ядре 51-контроллера. Соответственно первые тормоза оттуда. 2) Если данные передаются по запросу (пакетами сравнимой длины), то тут уже тормоза и на стороне ОС и на стороне контроллера. 3) Для высокоскоростной передачи данных используют периферию сайпресса GPIF - в 51 ядре только производится инициализация, дальше данные уже идут напрямую без задействования 51-го ядра. Там всё организовано аппаратно. Ну и обычно данные гонят в одном направлении + используеься модернизированный драйвер. Данные в контроллер (или из него) гонятся под управлением внешней ПЛИС и с внешним FIFO. Тогда скорость под 50МБайт/с достижима. Если нужен двунаправленный обмен вдобавок с разбором данных - особо контроллер не разгонишь. Всё-таки 51 ядро. FX3 уже побыстрее. PS: А вообще на форуме про высокоскоростную передачу данных на основе CY7C68013 много тем - поищи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shakesbeer 0 25 апреля, 2013 Опубликовано 25 апреля, 2013 · Жалоба Если нужен двунаправленный обмен вдобавок с разбором данных - особо контроллер не разгонишь. Всё-таки 51 ядро. FX3 уже побыстрее. PS: А вообще на форуме про высокоскоростную передачу данных на основе CY7C68013 много тем - поищи. FX3 это на будущее запланировано, а пока надо обойтись тем что есть. У меня основная проблема в том что никогда раньше не работал с микроконтроллерами и не могу найти подробное описание комаyд для cypressa. Если знаете какие-нибудь полезные статьи или aplication notes буду рад помощи) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_Sm 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба FX3 это на будущее запланировано, а пока надо обойтись тем что есть. У меня основная проблема в том что никогда раньше не работал с микроконтроллерами и не могу найти подробное описание комаyд для cypressa. Если знаете какие-нибудь полезные статьи или aplication notes буду рад помощи) Мы обходились примерами из комплекта Cypress (5-летней давности) + datasheet и Keil. По микроконтроллеру почитай любую книжку где описывается 8051 - работа с таймерами, GPIO и прочие мелочи на сайпрессе точно такие же. По тонкостям USB и DMA расписано в FX2 tech ref manual Ну и гугл в помощь - может книжки именно по FX2 есть, примеров по запросу "FX2 examples" тоже вагон. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FalloutMan 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Мы обходились примерами из комплекта Cypress (5-летней давности) + datasheet и Keil. Я даже нашел статью, где описывается как на старых примерах сделать программу. В новом CYUSBSuite нету того, что было в предыдущих версиях и большинство примеров написаны на C.NET. Я сделал программу на bulk передачах, но скорость получилась мала для поставленной задачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shakesbeer 0 26 апреля, 2013 Опубликовано 26 апреля, 2013 · Жалоба Мы обходились примерами из комплекта Cypress (5-летней давности) + datasheet и Keil. Я даже нашел статью, где описывается как на старых примерах сделать программу. В новом CYUSBSuite нету того, что было в предыдущих версиях и большинство примеров написаны на C.NET. Я сделал программу на bulk передачах, но скорость получилась мала для поставленной задачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-Al- 0 14 мая, 2013 Опубликовано 14 мая, 2013 · Жалоба ... Тогда скорость под 50МБайт/с достижима... У меня реально на этом контроллере получилось 42МБайта/сек (в асинхронном режиме для bulk endpointа). 51ый используется только для инициализации и выдачи дескрипторов. Весь обмен в режиме FIFO. Драйвер штатный CyUSB. Порграмма асинхронного обмена сделана на примере streamer из USB dev studio. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться