Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Увеличить скорость передачи/приема FX2
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Shakesbeer
Написал простенькую програмку, которая посылает и принимает данные по 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
Цитата(Shakesbeer @ Apr 23 2013, 17:11) *
Написал простенькую програмку, которая посылает и принимает данные по USB. использую CY7C68013.
За образец взял примеры из CyApI, использую поток thread с Bulk (стандартный Bulkloop.hex) передачами:
Скорость с которой передаются и принимаются данные около 1 Мбит/с.
Каким образом можно её увеличить?

Лень разбирать вышеописанный код. Пару стандартных ответов напишу, может пригодятся:
1) В стандартном примере вся обработка BULK запросов выполняется на ядре 51-контроллера. Соответственно первые тормоза оттуда.
2) Если данные передаются по запросу (пакетами сравнимой длины), то тут уже тормоза и на стороне ОС и на стороне контроллера.
3) Для высокоскоростной передачи данных используют периферию сайпресса GPIF - в 51 ядре только производится инициализация, дальше данные уже идут напрямую без задействования 51-го ядра. Там всё организовано аппаратно. Ну и обычно данные гонят в одном направлении + используеься модернизированный драйвер. Данные в контроллер (или из него) гонятся под управлением внешней ПЛИС и с внешним FIFO. Тогда скорость под 50МБайт/с достижима.

Если нужен двунаправленный обмен вдобавок с разбором данных - особо контроллер не разгонишь. Всё-таки 51 ядро. FX3 уже побыстрее.

PS: А вообще на форуме про высокоскоростную передачу данных на основе CY7C68013 много тем - поищи.
Shakesbeer
Цитата(Serg_Sm @ Apr 24 2013, 13:46) *
Если нужен двунаправленный обмен вдобавок с разбором данных - особо контроллер не разгонишь. Всё-таки 51 ядро. FX3 уже побыстрее.
PS: А вообще на форуме про высокоскоростную передачу данных на основе CY7C68013 много тем - поищи.

FX3 это на будущее запланировано, а пока надо обойтись тем что есть.
У меня основная проблема в том что никогда раньше не работал с микроконтроллерами и не могу найти подробное описание комаyд для cypressa. Если знаете какие-нибудь полезные статьи или aplication notes буду рад помощи)
Serg_Sm
Цитата(Shakesbeer @ Apr 25 2013, 15:49) *
FX3 это на будущее запланировано, а пока надо обойтись тем что есть.
У меня основная проблема в том что никогда раньше не работал с микроконтроллерами и не могу найти подробное описание комаyд для cypressa. Если знаете какие-нибудь полезные статьи или aplication notes буду рад помощи)

Мы обходились примерами из комплекта Cypress (5-летней давности) + datasheet и Keil.
По микроконтроллеру почитай любую книжку где описывается 8051 - работа с таймерами, GPIO и прочие мелочи на сайпрессе точно такие же. По тонкостям USB и DMA расписано в FX2 tech ref manual
Ну и гугл в помощь - может книжки именно по FX2 есть, примеров по запросу "FX2 examples" тоже вагон.
FalloutMan
Цитата(Serg_Sm @ Apr 26 2013, 12:58) *
Мы обходились примерами из комплекта Cypress (5-летней давности) + datasheet и Keil.

Я даже нашел статью, где описывается как на старых примерах сделать программу.
В новом CYUSBSuite нету того, что было в предыдущих версиях и большинство примеров написаны на C.NET.
Я сделал программу на bulk передачах, но скорость получилась мала для поставленной задачи.
Shakesbeer
Цитата(Serg_Sm @ Apr 26 2013, 12:58) *
Мы обходились примерами из комплекта Cypress (5-летней давности) + datasheet и Keil.

Я даже нашел статью, где описывается как на старых примерах сделать программу.
В новом CYUSBSuite нету того, что было в предыдущих версиях и большинство примеров написаны на C.NET.
Я сделал программу на bulk передачах, но скорость получилась мала для поставленной задачи.
-Al-
Цитата(Serg_Sm @ Apr 24 2013, 14:46) *
... Тогда скорость под 50МБайт/с достижима...

У меня реально на этом контроллере получилось 42МБайта/сек (в асинхронном режиме для bulk endpointа). 51ый используется только для инициализации и выдачи дескрипторов. Весь обмен в режиме FIFO. Драйвер штатный CyUSB. Порграмма асинхронного обмена сделана на примере streamer из USB dev studio.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.