Jump to content

    

Увеличить скорость передачи/приема FX2

Написал простенькую програмку, которая посылает и принимает данные по 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 Мбит/с.

Каким образом можно её увеличить?

Share this post


Link to post
Share on other sites
Написал простенькую програмку, которая посылает и принимает данные по USB. использую CY7C68013.

За образец взял примеры из CyApI, использую поток thread с Bulk (стандартный Bulkloop.hex) передачами:

Скорость с которой передаются и принимаются данные около 1 Мбит/с.

Каким образом можно её увеличить?

Лень разбирать вышеописанный код. Пару стандартных ответов напишу, может пригодятся:

1) В стандартном примере вся обработка BULK запросов выполняется на ядре 51-контроллера. Соответственно первые тормоза оттуда.

2) Если данные передаются по запросу (пакетами сравнимой длины), то тут уже тормоза и на стороне ОС и на стороне контроллера.

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

 

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

 

PS: А вообще на форуме про высокоскоростную передачу данных на основе CY7C68013 много тем - поищи.

Share this post


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

PS: А вообще на форуме про высокоскоростную передачу данных на основе CY7C68013 много тем - поищи.

FX3 это на будущее запланировано, а пока надо обойтись тем что есть.

У меня основная проблема в том что никогда раньше не работал с микроконтроллерами и не могу найти подробное описание комаyд для cypressa. Если знаете какие-нибудь полезные статьи или aplication notes буду рад помощи)

Share this post


Link to post
Share on other sites
FX3 это на будущее запланировано, а пока надо обойтись тем что есть.

У меня основная проблема в том что никогда раньше не работал с микроконтроллерами и не могу найти подробное описание комаyд для cypressa. Если знаете какие-нибудь полезные статьи или aplication notes буду рад помощи)

Мы обходились примерами из комплекта Cypress (5-летней давности) + datasheet и Keil.

По микроконтроллеру почитай любую книжку где описывается 8051 - работа с таймерами, GPIO и прочие мелочи на сайпрессе точно такие же. По тонкостям USB и DMA расписано в FX2 tech ref manual

Ну и гугл в помощь - может книжки именно по FX2 есть, примеров по запросу "FX2 examples" тоже вагон.

Share this post


Link to post
Share on other sites
Мы обходились примерами из комплекта Cypress (5-летней давности) + datasheet и Keil.

Я даже нашел статью, где описывается как на старых примерах сделать программу.

В новом CYUSBSuite нету того, что было в предыдущих версиях и большинство примеров написаны на C.NET.

Я сделал программу на bulk передачах, но скорость получилась мала для поставленной задачи.

Share this post


Link to post
Share on other sites
Мы обходились примерами из комплекта Cypress (5-летней давности) + datasheet и Keil.

Я даже нашел статью, где описывается как на старых примерах сделать программу.

В новом CYUSBSuite нету того, что было в предыдущих версиях и большинство примеров написаны на C.NET.

Я сделал программу на bulk передачах, но скорость получилась мала для поставленной задачи.

Share this post


Link to post
Share on other sites
... Тогда скорость под 50МБайт/с достижима...

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this