Перейти к содержанию
    

Увеличить скорость передачи/приема 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 Мбит/с.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написал простенькую програмку, которая посылает и принимает данные по USB. использую CY7C68013.

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

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

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

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

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

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

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... Тогда скорость под 50МБайт/с достижима...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...