реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Увеличить скорость передачи/приема FX2, Как увеличить скорость для CyAPI метода Bulk?
Shakesbeer
сообщение Apr 23 2013, 14:11
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 8-02-13
Пользователь №: 75 540



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


--------------------
There are only 10 types of people in the world: those who understand binary, and those who don't.
Go to the top of the page
 
+Quote Post
Serg_Sm
сообщение Apr 24 2013, 10:46
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167



Цитата(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 много тем - поищи.
Go to the top of the page
 
+Quote Post
Shakesbeer
сообщение Apr 25 2013, 12:49
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 8-02-13
Пользователь №: 75 540



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

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


--------------------
There are only 10 types of people in the world: those who understand binary, and those who don't.
Go to the top of the page
 
+Quote Post
Serg_Sm
сообщение Apr 26 2013, 09:58
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 183
Регистрация: 10-10-06
Из: Смоленск
Пользователь №: 21 167



Цитата(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" тоже вагон.
Go to the top of the page
 
+Quote Post
FalloutMan
сообщение Apr 26 2013, 11:31
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 19-04-10
Из: Москва
Пользователь №: 56 743



Цитата(Serg_Sm @ Apr 26 2013, 12:58) *
Мы обходились примерами из комплекта Cypress (5-летней давности) + datasheet и Keil.

Я даже нашел статью, где описывается как на старых примерах сделать программу.
В новом CYUSBSuite нету того, что было в предыдущих версиях и большинство примеров написаны на C.NET.
Я сделал программу на bulk передачах, но скорость получилась мала для поставленной задачи.
Go to the top of the page
 
+Quote Post
Shakesbeer
сообщение Apr 26 2013, 11:32
Сообщение #6





Группа: Новичок
Сообщений: 5
Регистрация: 8-02-13
Пользователь №: 75 540



Цитата(Serg_Sm @ Apr 26 2013, 12:58) *
Мы обходились примерами из комплекта Cypress (5-летней давности) + datasheet и Keil.

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


--------------------
There are only 10 types of people in the world: those who understand binary, and those who don't.
Go to the top of the page
 
+Quote Post
-Al-
сообщение May 14 2013, 06:03
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 330
Регистрация: 10-06-05
Из: Россия, Москва
Пользователь №: 5 894



Цитата(Serg_Sm @ Apr 24 2013, 14:46) *
... Тогда скорость под 50МБайт/с достижима...

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

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 04:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016