Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 3 4 [Все]   Вниз
  Печать  
Автор Тема: CY7C68013 и C++ Builder С чего начать?  (Прочитано 117635 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Shakesbeer
Постоялец

ru
Offline Offline

« : 15-02-2013 13:20 » 

Хочу начать работу с CY7C68013
Изучил множество материалов, но большинство программ написано либо на асемблере, либо на Visual.
Есть где-нибудь материал и примеры, написанные на C++ Builder 6 ?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 15-02-2013 13:54 » 

начать надо конечно с документации)))
http://www.cypress.com/?id=193
и простите.... вы драйвер на C++ Builder 6 хотите написать?
а если просто надо общаться с устройством - смотрите SDK по ссылке, а Builder у вас или MSVC разницы нет. вам нужно CyAPI. документация есть в SDK.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #2 : 15-02-2013 15:02 » 

Спасибо. Хоть знаю что в случае простого общения нужен только CyAPI ))
Документацию изучил, но без конкретного примера пока не могу сообразить. А все что нахожу как правило в Visual С.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 15-02-2013 15:08 » 

Shakesbeer, если программировать в рамках Win32 API, то разницы между VC и BCB нет.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 16-02-2013 03:23 » 

Shakesbeer, примеры там тоже были вроде... просто не смотрите как там окошки реализованы)
у сайпреса для этой м/с свой драйвер есть, а так же интерфейсная библиотека через которую все работают. CyAPI - как раз от библиотеки.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #5 : 28-02-2013 12:24 » 

Shakesbeer, примеры там тоже были вроде... просто не смотрите как там окошки реализованы)
у сайпреса для этой м/с свой драйвер есть, а так же интерфейсная библиотека через которую все работают. CyAPI - как раз от библиотеки.
Кстати с CyAPI до какой скорости передачи данных можно дойти?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 28-02-2013 14:14 » 

понятия не имею, кажется народ на их форуме писал что 42мбайт получалось, но это с чужих слов.
у меня получилось на своем драйвере 48мбайт. что есть 80% от 480мбит. граница довольно четкая.
« Последнее редактирование: 28-02-2013 14:17 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #7 : 01-03-2013 10:55 » 

По примеру CyAPI сделал простенький примерчик:
Код:
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 CCyUSBDevice *USBDevice;
 char buf[512];
 string s;
 USB_DEVICE_DESCRIPTOR descr;
 USBDevice = new CCyUSBDevice(NULL);   // Create an instance of CCyUSBDevice
 GroupBox1->Caption = "device count " + AnsiString(USBDevice->DeviceCount());
 if (USBDevice->DeviceCount())
 for (int c=0; c < USBDevice->DeviceCount(); c++)
  {
   if (USBDevice->Open(c))
    {         
     Memo1->Clear();
     int vID = USBDevice->VendorID;
     int pID  = USBDevice->ProductID;
     Label[0]->Caption = "VendorID: " + AnsiString(IntToHex(vID,4));
     Label[1]->Caption = "ProductID: " + AnsiString(IntToHex(pID,4));
     CCyUSBConfig cfg = USBDevice->GetUSBConfig(c);
     USBDevice->GetDeviceDescriptor(&descr);
     Label[2]->Caption = "bLength 0x" + AnsiString(IntToHex(descr.bLength,2));
     Label[3]->Caption = "bDescriptorType 0x" + AnsiString(IntToHex(descr.bDescriptorType,2));
     Label[4]->Caption = "bcdUSB 0x" + AnsiString(IntToHex(descr.bcdUSB,4));
     Label[5]->Caption = "bDeviceClass 0x" + AnsiString(IntToHex(descr.bDeviceClass,2));
     Label[6]->Caption = "bDeviceProtocol 0x" + AnsiString(IntToHex(descr.bDeviceProtocol,2));
     Label[7]->Caption = "bMaxPacketSize0 0x" + AnsiString(IntToHex(descr.bMaxPacketSize0,2));
     Label[8]->Caption = "idVendor 0x" + AnsiString(IntToHex(descr.idVendor,4));
     Label[9]->Caption = "idProduct 0x" + AnsiString(IntToHex(descr.idProduct,4));
     Label[10]->Caption = "bcdDevice 0x" + AnsiString(IntToHex(descr.bcdDevice,4));
     Label[11]->Caption = "iManufacturer 0x" + AnsiString(IntToHex(descr.iManufacturer,2));
     Label[12]->Caption = "iProduct 0x" + AnsiString(IntToHex(descr.iProduct,2));
     Label[13]->Caption = "iSerialNumber 0x" + AnsiString(IntToHex(descr.iSerialNumber,2));
     Label[14]->Caption = "bNumConfigurations 0x" + AnsiString(IntToHex(descr.bNumConfigurations,2));
  //          USBDevice->Close();
     for   (int  i=0; i<cfg.AltInterfaces; i++)
        {
         CCyUSBInterface  *ifc = cfg.Interfaces[i];
         Memo1->Lines->Add("Interface  Descriptor:");
         Memo1->Lines->Add("----------------------");
         Memo1->Lines->Add("bLength  0x" + AnsiString(IntToHex(ifc->bLength,4)));
         Memo1->Lines->Add("bDescriptorType  0x" + AnsiString(IntToHex(ifc->bDescriptorType,4)));
         Memo1->Lines->Add("bInterfaceNumber  0x" + AnsiString(IntToHex(ifc->bInterfaceNumber,4)));
         Memo1->Lines->Add("bAlternateSetting  0x" + AnsiString(IntToHex(ifc->bAlternateSetting,4)));
         Memo1->Lines->Add("bNumEndpoints  0x" + AnsiString(IntToHex(ifc->bNumEndpoints,4)));
         Memo1->Lines->Add("bInterfaceClass  0x" + AnsiString(IntToHex(ifc->bInterfaceClass,4)));
         Memo1->Lines->Add("********************************************************************");

         for   (int  e=0; e<ifc->bNumEndpoints; e++)
           {
            CCyUSBEndPoint  *ept = ifc->EndPoints[e+1];
            Memo1->Lines->Add("EndPoint  Descriptor" + AnsiString(e+1) + ":");
            Memo1->Lines->Add("----------------------");
            Memo1->Lines->Add("bLength  0x" + AnsiString(IntToHex(ept->DscLen, 4)));
            Memo1->Lines->Add("bDescriptorType  0x" + AnsiString(IntToHex(ept->DscType, 4)));
            Memo1->Lines->Add("bEndpointAddress  0x" + AnsiString(IntToHex(ept->Address, 4)));
            Memo1->Lines->Add("bmAttributes  0x" + AnsiString(IntToHex(ept->Attributes, 4)));
            Memo1->Lines->Add("wMaxPacketSize  0x" + AnsiString(IntToHex(ept->MaxPktSize,4)));
            Memo1->Lines->Add("bInterval  0x" + AnsiString(IntToHex(ept->Interval, 4)));
            Memo1->Lines->Add("********************************************************************");
           }
        }
    }
    else
      {
        GroupBox1->Caption = "No device found";
      }
  }
 else
  {
     Label[0]->Caption = "VendorID: ";
     Label[1]->Caption = "ProductID: ";
     Label[2]->Caption = "bLength ";
     Label[3]->Caption = "bDescriptorType ";
     Label[4]->Caption = "bcdUSB ";
     Label[5]->Caption = "bDeviceClass ";
     Label[6]->Caption = "bDeviceProtocol ";
     Label[7]->Caption = "bMaxPacketSize0 ";
     Label[8]->Caption = "idVendor ";
     Label[9]->Caption = "idProduct ";
     Label[10]->Caption = "bcdDevice ";
     Label[11]->Caption = "iManufacturer ";
     Label[12]->Caption = "iProduct ";
     Label[13]->Caption = "iSerialNumber ";
     Label[14]->Caption = "bNumConfigurations ";
     Memo1->Text = "No device";
  }
    //USBDevice->GetDeviceDescriptor(&descr);
 USBDevice->Close();
 //_getch();
}
//---------------------------------------------------------------------------

Все работает, все хорошо.
Но никак не пойму как организовать прием-передачу.  А черт его знает...
Нашел чужой код с разбитыми функциями, но никак не получается все организовать по-человечески:
Код:
static CCyUSBDevice *s_usb_device;
static CCyUSBEndPoint *s_in_fifo_endpoint, *s_out_fifo_endpoint;
static CCyControlEndPoint* s_control_endpoint;
static OVERLAPPED s_out_overlap, s_in_overlap;
static unsigned char *s_in_context, *s_out_context;
int s_has_to_close_out, s_has_to_close_in;
LONG s_buffer_size_out, s_buffer_size_in;
PUCHAR s_buffer_out, s_buffer_in;

// For now it is static, might change it to a dynamic later
//---------------------------------------------------------------------------
void* usb_init(void) {
int i = 0;
 s_usb_device = new CCyUSBDevice();

 // open my device
 if (s_usb_device->DeviceCount())
  {
   // search for all connected devices, and add the one that has the right name
   for (i = 0; i < s_usb_device->DeviceCount(); i++)
     {
      s_usb_device->Open(i);
/*      if(strcmp (USB_DEVICE_NAME, s_usb_device->DeviceName) == 0)  //ñðàâíèâàåì ñ íàøèì èìåíåì
        break;
      s_usb_device->Close();
     }
  } else
     {
      // Cannot find my device
      if (Application->MessageBox("Cannot find my device","Îøèáêà", MB_OK) != IDOK)
        return NULL;    */
     }
  }
 if (!s_usb_device->IsOpen())
   {
     // Could not open my device
    if (Application->MessageBox("Could not open my device","Îøèáêà", MB_OK) != IDOK)
      return NULL;
   }

 // get usb IN and OUT FIFOs endpoints
 int endpoints_count = s_usb_device->EndPointCount();

 for (i=1; i<endpoints_count; i++)
   {
    CCyUSBEndPoint *endpoint;
    endpoint = s_usb_device->EndPoints[i];
    if (endpoint->Attributes == 2)
      {
       // it is a Bulk endpoint
       if(endpoint->Address == 0x86)
         {
          // my IN endpoint
          s_in_fifo_endpoint = endpoint;
         }
       if(endpoint->Address == 0x02)
         {
          // my OUT endpoint
  s_out_fifo_endpoint = endpoint;
}
      }
   }
 // get Control enpoint
 s_control_endpoint = s_usb_device->ControlEndPt;
 // create events for data transfers
 s_out_overlap.hEvent  = CreateEventA(NULL, false, false, "CYUSB_OUT");
 s_in_overlap.hEvent   = CreateEventA(NULL, false, false, "CYUSB_IN");
 return (void*)1;
}
//---------------------------------------------------------------------------
int usb_finish_in_transfer()
{
 if (s_has_to_close_in == 1)
   {
    s_in_fifo_endpoint->FinishDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap,s_in_context);
   }
 s_has_to_close_in = 0;
 return s_buffer_size_in;
}
//---------------------------------------------------------------------------
int usb_finish_out_transfer()
{
 if (s_has_to_close_out == 1)
   {
    s_out_fifo_endpoint->FinishDataXfer(s_buffer_out, s_buffer_size_out, &s_out_overlap,s_out_context);
   }
 s_has_to_close_out = 0;
 return s_buffer_size_out;
}
//---------------------------------------------------------------------------
void usb_close()
{
 usb_finish_in_transfer();
 usb_finish_out_transfer();
 delete s_usb_device;
 CloseHandle(s_out_overlap.hEvent);
 CloseHandle(s_in_overlap.hEvent);
}
//---------------------------------------------------------------------------
void usb_begin_out_transfer(unsigned char* buffer, int size)
{
 if (s_has_to_close_out == 1)
   {
    s_out_fifo_endpoint->FinishDataXfer (s_buffer_out, s_buffer_size_out, &s_out_overlap,s_out_context);
   }
 s_buffer_out = buffer;
 s_buffer_size_out = size;
 s_out_context = s_out_fifo_endpoint->BeginDataXfer(s_buffer_out, s_buffer_size_out, &s_out_overlap);
 s_has_to_close_out = 1;
}
//---------------------------------------------------------------------------
void usb_begin_in_transfer(unsigned char* buffer, int size)
{
 if (s_has_to_close_in == 1)
   {
    s_in_fifo_endpoint->FinishDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap,s_in_context);
   }
 s_buffer_in = buffer;
 s_buffer_size_in = size;
 s_in_context = s_in_fifo_endpoint->BeginDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap);
 s_has_to_close_in = 1;
}
//---------------------------------------------------------------------------
int usb_is_in_transfer_done()
{
 return s_in_fifo_endpoint->WaitForXfer(&s_in_overlap,1);
}
//---------------------------------------------------------------------------
int usb_is_out_transfer_done()
{
 return s_out_fifo_endpoint->WaitForXfer(&s_out_overlap,1);
}
//---------------------------------------------------------------------------
void usb_wait_in_transfer_finish()
{
 while(!s_in_fifo_endpoint->WaitForXfer(&s_in_overlap,1));
}
//---------------------------------------------------------------------------
void usb_wait_out_transfer_finish()
{
 while(!s_out_fifo_endpoint->WaitForXfer(&s_out_overlap,1));
}
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 01-03-2013 15:43 » 

а в чем конкретно проблема?
вы SDK смотрели?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
xenetron
Интересующийся

ru
Offline Offline

« Ответ #9 : 12-03-2013 13:12 » 

Привет всем. кто-нибудь может помочь в таком вопросе. в общем необходимо на  CY7C68013 в Билдере написать интерфейс usb для обмена данными? может быть у кого нибудь есть какие нибудь уже файлы, для обмена данными. а то сам не знаком с usb в принципе. есть только эта библиотека CyAPI и не очень понятно, что нужно использовать в программе. Жду ответа...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 12-03-2013 15:29 » 

см. ответы выше)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
xenetron
Интересующийся

ru
Offline Offline

« Ответ #11 : 14-03-2013 13:52 » 

а как нужно настроить cyusb.inf файл?


Добавлено через 48 минут и 1 секунду:
А что делать если я установил драйвер, система видит плату, но пишет что она работает неверно и в диспетчере устройств имеет воскл знак?


Добавлено через 2 часа, 2 минуты и 54 секунды:
А что делать если я установил драйвер, система видит плату, но пишет что она работает неверно и в диспетчере устройств имеет воскл знак?
« Последнее редактирование: 14-03-2013 16:43 от xenetron » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 14-03-2013 17:02 » 

1. поменять в inf - девайс и вендор ID соответственно вашему устройству. (см свойства обнаруженного устройства в дереве устройств)
2. посмотреть код ошибки установки драйвера. там же.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #13 : 18-03-2013 11:51 » 

а в чем конкретно проблема?
Просто хочется увидеть рабочий пример и от него отталкиваться)
И хочу спросить: верно ли написаны функции, которые я выложил ранее? Потому что собрать из них что-то дельное не получается, появляются ошибки.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 18-03-2013 13:28 » 

увы, примеры только те, которые шли в SDK...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #15 : 18-03-2013 13:55 » 

увы, примеры только те, которые шли в SDK...
Разбирался с CyAPI из Cypress Suite USB 3.4.7. Не смог понять где конкретно описывается считывание данных)
Если есть возможность - объясните.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 18-03-2013 14:20 » 

Cypress Suite USB 3.4.4\CyAPI\examples\cybulk\BulkLoopDlg.cpp
функция XferLoop()


Добавлено через 4 минуты и 21 секунду:
в частности, запрос в два ендпоинта, ожидание 2 сек, проверка статуса.
Код: (C++)
        UCHAR  *outContext = dlg->OutEndpt->BeginDataXfer(data,outlen,&outOvLap);
        UCHAR  *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap);

        dlg->OutEndpt->WaitForXfer(&outOvLap,2000);
        dlg->InEndpt->WaitForXfer(&inOvLap,2000);

        success = dlg->OutEndpt->FinishDataXfer(data, outlen, &outOvLap,outContext);
        success = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext);

PS это грубо на вскидку исключительно по названиям функций. надо доку читать более подробно конечно.
« Последнее редактирование: 18-03-2013 14:26 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #17 : 18-03-2013 14:30 » 

Вот пример моего кода.
Выдает ошибку "Acces violation":

Код:
//---------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop

#include "cyapi.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//#define USB_DEVICE_NAME "MCUCY7C68013x" //èìÿ óñòðîéñòâà (äðàéâåð)
TForm1 *Form1;
TLabel *Label[16];

static CCyUSBDevice *s_usb_device;
static CCyUSBEndPoint *s_in_fifo_endpoint, *s_out_fifo_endpoint;
static CCyControlEndPoint* s_control_endpoint;
static OVERLAPPED s_out_overlap, s_in_overlap;
static unsigned char *s_in_context, *s_out_context;
int s_has_to_close_out, s_has_to_close_in;
LONG s_buffer_size_out, s_buffer_size_in;
PUCHAR s_buffer_out, s_buffer_in;

// For now it is static, might change it to a dynamic later
//---------------------------------------------------------------------------
void* usb_init(void) {
        int i = 0;
 s_usb_device = new CCyUSBDevice();

 // open my device
 if (s_usb_device->DeviceCount())
  {
   // search for all connected devices, and add the one that has the right name
   for (i = 0; i < s_usb_device->DeviceCount(); i++)
     {
      s_usb_device->Open(i);
/*      if(strcmp (USB_DEVICE_NAME, s_usb_device->DeviceName) == 0)  //ñðàâíèâàåì ñ íàøèì èìåíåì
        break;
      s_usb_device->Close();
     }
  } else
     {
      // Cannot find my device
      if (Application->MessageBox("Cannot find my device","Îøèáêà", MB_OK) != IDOK)
        return NULL;    */
     }
  }
 if (!s_usb_device->IsOpen())
   {
     // Could not open my device
    if (Application->MessageBox("Could not open my device","Îøèáêà", MB_OK) != IDOK)
      return NULL;
   }

 // get usb IN and OUT FIFOs endpoints
 int endpoints_count = s_usb_device->EndPointCount();

 for (i=1; i<endpoints_count; i++)
   {
    CCyUSBEndPoint *endpoint;
    endpoint = s_usb_device->EndPoints[i];
    if (endpoint->Attributes == 2)
      {
       // it is a Bulk endpoint
       if(endpoint->Address == 0x86)
         {
          // my IN endpoint
          s_in_fifo_endpoint = endpoint;
         }
       if(endpoint->Address == 0x02)
         {
          // my OUT endpoint
          s_out_fifo_endpoint = endpoint;
         }
      }
   } 
 // get Control enpoint
 s_control_endpoint = s_usb_device->ControlEndPt;
 // create events for data transfers
 s_out_overlap.hEvent  = CreateEventA(NULL, false, false, "CYUSB_OUT");
 s_in_overlap.hEvent   = CreateEventA(NULL, false, false, "CYUSB_IN");
 return (void*)1;
}
//---------------------------------------------------------------------------
int usb_finish_in_transfer()
{
 if (s_has_to_close_in == 1)
   {
    s_in_fifo_endpoint->FinishDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap,s_in_context);
   }
 s_has_to_close_in = 0;
 return s_buffer_size_in;
}
//---------------------------------------------------------------------------
int usb_finish_out_transfer()
{
 if (s_has_to_close_out == 1)
   {
    s_out_fifo_endpoint->FinishDataXfer(s_buffer_out, s_buffer_size_out, &s_out_overlap,s_out_context);
   }
 s_has_to_close_out = 0;
 return s_buffer_size_out;
}
//---------------------------------------------------------------------------
void usb_close()
{
 usb_finish_in_transfer();
 usb_finish_out_transfer();
 delete s_usb_device;
 CloseHandle(s_out_overlap.hEvent);
 CloseHandle(s_in_overlap.hEvent);
}
//---------------------------------------------------------------------------
void usb_begin_out_transfer(unsigned char* buffer, int size)
{
 if (s_has_to_close_out == 1)
   {
    s_out_fifo_endpoint->FinishDataXfer (s_buffer_out, s_buffer_size_out, &s_out_overlap,s_out_context);
   }
 s_buffer_out = buffer;
 s_buffer_size_out = size;
 s_out_context = s_out_fifo_endpoint->BeginDataXfer(s_buffer_out, s_buffer_size_out, &s_out_overlap);
 s_has_to_close_out = 1;
}
//---------------------------------------------------------------------------
void usb_begin_in_transfer(unsigned char* buffer, int size)
{
 if (s_has_to_close_in == 1)
   {
    s_in_fifo_endpoint->FinishDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap,s_in_context);
   }
 s_buffer_in = buffer;
 s_buffer_size_in = size;
 s_in_context = s_in_fifo_endpoint->BeginDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap);
 s_has_to_close_in = 1;
}
//---------------------------------------------------------------------------
int usb_is_in_transfer_done()
{
 return s_in_fifo_endpoint->WaitForXfer(&s_in_overlap,1);
}
//---------------------------------------------------------------------------
int usb_is_out_transfer_done()
{
 return s_out_fifo_endpoint->WaitForXfer(&s_out_overlap,1);
}
//---------------------------------------------------------------------------
void usb_wait_in_transfer_finish()
{
 while(!s_in_fifo_endpoint->WaitForXfer(&s_in_overlap,1));
}
//---------------------------------------------------------------------------
void usb_wait_out_transfer_finish()
{
 while(!s_out_fifo_endpoint->WaitForXfer(&s_out_overlap,1));
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
usb_init();
char buf[8];
usb_begin_in_transfer(buf, 8);
usb_is_in_transfer_done(); 
usb_finish_in_transfer();
usb_wait_in_transfer_finish();
usb_close();
}
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 18-03-2013 14:33 » 

 где выдает?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #19 : 18-03-2013 14:36 » 

Код: (C++)
        UCHAR  *outContext = dlg->OutEndpt->BeginDataXfer(data,outlen,&outOvLap); //начало передачи data, длиной outlen
        UCHAR  *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap); //начало передачи indata, длиной inlen

        dlg->OutEndpt->WaitForXfer(&outOvLap,2000); //ждем передачи 2000 мкс
        dlg->InEndpt->WaitForXfer(&inOvLap,2000); //ждем приема 2000 мкс

        success = dlg->OutEndpt->FinishDataXfer(data, outlen, &outOvLap,outContext);  // это проверка отосланы байты или нет
        success = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext);  // проверка приняты байты или нет
Как-то так?

Добавлено через 58 секунд:
где выдает?
Код:
//---------------------------------------------------------------------------
void usb_begin_in_transfer(unsigned char* buffer, int size)
{
 if (s_has_to_close_in == 1)
   {
    s_in_fifo_endpoint->FinishDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap,s_in_context);
   }
 s_buffer_in = buffer;
 s_buffer_size_in = size;
---> s_in_context = s_in_fifo_endpoint->BeginDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap);  <--- Вот в этом месте
 s_has_to_close_in = 1;
}
//---------------------------------------------------------------------------
« Последнее редактирование: 18-03-2013 14:37 от Shakesbeer » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 18-03-2013 14:40 » 

вроде похоже. я не смотрел доку)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #21 : 18-03-2013 14:43 » 

вроде похоже. я не смотрел доку)
Попробую пока в bulkLoopDlg покопаться)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 18-03-2013 14:46 » 

endpoints_count - чему равен?

Добавлено через 40 секунд:
проверка на то что s_in_fifo_endpoint  вообще какой то существует - где?
« Последнее редактирование: 18-03-2013 14:46 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #23 : 18-03-2013 14:51 » 

endpoints_count - чему равен?

Добавлено через 40 секунд:
проверка на то что s_in_fifo_endpoint  вообще какой то существует - где?
Задается в  ф-ции void* usb_init(void)
Код: (C++)
int endpoints_count = s_usb_device->EndPointCount();


 Здесь была моя ладья...
Цитата
проверка на то что s_in_fifo_endpoint  вообще какой то существует - где?
То-есть банально сравнить с нулевым значением и отменять дальнейшее выполнение, если < 1?
« Последнее редактирование: 18-03-2013 14:54 от Shakesbeer » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 18-03-2013 16:10 » 

endpoints_count  - чему равен после ЭТОГО присвоения?!
s_in_fifo_endpoint  - блоки кода где происходит проверка и присвоение - вообще выполняется или нет?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #25 : 19-03-2013 09:13 » 

endpoints_count  - чему равен после ЭТОГО присвоения?!
s_in_fifo_endpoint  - блоки кода где происходит проверка и присвоение - вообще выполняется или нет?
Я так понял он запрашивает у Cypressa:
Код: (C++)
 // get usb IN and OUT FIFOs endpoints
 int endpoints_count = s_usb_device->EndPointCount();

 for (i=1; i<endpoints_count; i++)
   {
    CCyUSBEndPoint *endpoint;
    endpoint = s_usb_device->EndPoints[i];
    if (endpoint->Attributes == 2)
      {
       // it is a Bulk endpoint
       if(endpoint->Address == 0x86)
         {
          // my IN endpoint
          s_in_fifo_endpoint = endpoint;
         }
       if(endpoint->Address == 0x02)
         {
          // my OUT endpoint
          s_out_fifo_endpoint = endpoint;
         }
      }
   }  
 // get Control enpoint
 s_control_endpoint = s_usb_device->ControlEndPt;

А какую желательно сделать проверку? подскажите плииз) :Улыбаюсь
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #26 : 19-03-2013 09:46 » 

да хоть мессаджбокс!
откуда вы знаете, что endpoints_count вообще не вернулся равным нулю, к примеру? и что цикл
for (i=1; i<endpoints_count; i++)
вообще имел место быть и выполнятся?! что указатели вообще присваивались?!!! вообще у вас принято возвращаемые значения на валидность проверять?!
*ругаюсь страшно, и брюзжу*)
 
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #27 : 19-03-2013 10:30 » 

да хоть мессаджбокс!
откуда вы знаете, что endpoints_count вообще не вернулся равным нулю, к примеру? и что цикл
for (i=1; i<endpoints_count; i++)
вообще имел место быть и выполнятся?! что указатели вообще присваивались?!!! вообще у вас принято возвращаемые значения на валидность проверять?!
*ругаюсь страшно, и брюзжу*)

Вы оказались абсолютно правы, попросту не задан endpoint:
Код: (C++)
usb_init();
char buf[8];
 if (s_usb_device->DeviceCount()>0)
 if (!s_usb_device->IsOpen())
   {
     // Could not open my device
    if (Application->MessageBox("Could not open my device","Ошибка", MB_OK) != IDOK)
      return;
   }
    else
     {
      if (s_in_fifo_endpoint>0)
       {
        usb_begin_in_transfer(buf, 8);
        usb_is_in_transfer_done();
        usb_finish_in_transfer();
        usb_wait_in_transfer_finish();
        usb_close();
       }
       else
        if (Application->MessageBox("не задан s_in_fifo_endpoint","Ошибка", MB_OK) != IDOK)
          return;
     }
  else
   if (Application->MessageBox("Could not open my device","Ошибка", MB_OK) != IDOK)
    return;

Как мне исправиться? Не надо


Endpointы считываю с Cypressa ведь?
Нашел ещё один вариант интересный, но никак не разберусь что писать дальше:
Код: (C++)
CCyBulkEndPoint *BulkInEpt = NULL;
 CCyBulkEndPoint  *BulkOutEpt = NULL;
 CCyUSBDevice  *USBDevice = new  CCyUSBDevice(NULL);
 if (USBDevice->DeviceCount())
  for (int c=0; c < USBDevice->DeviceCount(); c++)
    if (USBDevice->Open(c))
     {
      int  eptCount = USBDevice->EndPointCount();
      for  (int  i=1; i<eptCount;  i++)
       {
        bool  bIn = ((USBDevice->EndPoints[i]->Address  & 0x80)==0x80);
        bool  bBulk =  (USBDevice->EndPoints[i]->Attributes == 2);
        if (bBulk  && bIn) BulkInEpt = (CCyBulkEndPoint *) USBDevice->EndPoints[i];
        if  (bBulk && !bIn) BulkOutEpt = (CCyBulkEndPoint *) USBDevice->EndPoints[i];
       }
      USBDevice->Close();
     }
« Последнее редактирование: 19-03-2013 12:33 от Shakesbeer » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 19-03-2013 15:43 » 

уже почти рыдаю Должен же быть выход!!!
проверяйте почему он не задан в usb_init()
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #29 : 21-03-2013 11:42 » 

Просто не понимаю почему в данном случае все параметры EP выводит нормально:
Код: (C++)
CCyUSBDevice *USBDevice;
 char buf[512];
 string s;
 USB_DEVICE_DESCRIPTOR descr;
 USBDevice = new CCyUSBDevice(NULL);   // Create an instance of CCyUSBDevice
 GroupBox1->Caption = "device count " + AnsiString(USBDevice->DeviceCount());
 if (USBDevice->DeviceCount())
 for (int c=0; c < USBDevice->DeviceCount(); c++)
  {
   if (USBDevice->Open(c))
    {          
     Memo1->Clear();
     int vID = USBDevice->VendorID;
     int pID  = USBDevice->ProductID;
     Label[0]->Caption = "VendorID: " + AnsiString(IntToHex(vID,4));
     Label[1]->Caption = "ProductID: " + AnsiString(IntToHex(pID,4));
     CCyUSBConfig cfg = USBDevice->GetUSBConfig(c);
     USBDevice->GetDeviceDescriptor(&descr);
     for   (int  i=0; i<cfg.AltInterfaces; i++)
        {
         CCyUSBInterface  *ifc = cfg.Interfaces[i];
          for   (int  e=0; e<ifc->bNumEndpoints; e++)
           {
            CCyUSBEndPoint  *ept = ifc->EndPoints[e+1];
            Memo1->Lines->Add("EndPoint  Descriptor" + AnsiString(e+1) + ":");
            Memo1->Lines->Add("----------------------");
            Memo1->Lines->Add("bLength  0x" + AnsiString(IntToHex(ept->DscLen, 4)));
            Memo1->Lines->Add("bDescriptorType  0x" + AnsiString(IntToHex(ept->DscType, 4)));
            Memo1->Lines->Add("bEndpointAddress  0x" + AnsiString(IntToHex(ept->Address, 4)));
            Memo1->Lines->Add("bmAttributes  0x" + AnsiString(IntToHex(ept->Attributes, 4)));
            Memo1->Lines->Add("wMaxPacketSize  0x" + AnsiString(IntToHex(ept->MaxPktSize,4)));
            Memo1->Lines->Add("bInterval  0x" + AnsiString(IntToHex(ept->Interval, 4)));
            Memo1->Lines->Add("********************************************************************");
           }
}
}
 USBDevice->Close();
}

Добавлено через 3 минуты и 1 секунду:
И если нужно задавать вручную, то в каком виде?
« Последнее редактирование: 21-03-2013 11:45 от Shakesbeer » Записан
xenetron
Интересующийся

ru
Offline Offline

« Ответ #30 : 22-03-2013 14:19 » 

Народ, а не подскажите, почему у меня   Bulk Loop не может распознать мою плату ?  хотя CyConsole и ControlCenter нормально видят
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #31 : 22-03-2013 15:28 » 

xenetron, там прошивка соответствующая лежит в папке проекта.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
xenetron
Интересующийся

ru
Offline Offline

« Ответ #32 : 22-03-2013 18:33 » 

файл cyusb.lib ?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #33 : 23-03-2013 09:31 » 

Ochkarik, *наливает ведро валерянки* ))
Записан

Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #34 : 26-03-2013 09:34 » 

В статье http://www.efo.ru/cgi-bin/go?2524 имеется описание некоторых функций и файлов. Но вот где достать эти файлы, которые указаны в статье? В CySuiteUSB_3_4_7_B204.exe не все.
Например где найти PERIPH.C и DSCR.A51?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #35 : 26-03-2013 12:01 » 

Shakesbeer,
Cypress\Cypress Suite USB 3.4.4\Firmware\Endpoint_Interrupts\Firmware\Endpoint_Interrupts\periph.c
Cypress\Cypress Suite USB 3.4.4\Firmware\Endpoint_Interrupts\Firmware\Endpoint_Interrupts\dscr.a51
не думаю что они могли куда то исчезнуть в следующей версии

Добавлено через 1 минуту и 47 секунд:
xenetron, пардон, не увидел последний вопрос.
файл прошивки для данного контроллера имеет расширение hex.

Алексей++, спасибо))) помогло))))
« Последнее редактирование: 26-03-2013 12:02 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
xenetron
Интересующийся

ru
Offline Offline

« Ответ #36 : 26-03-2013 13:35 » 

Shakesbeer, скажи, а где ты в Firmware нашел такую папку Endpoint...? у меня просто такой нету.
Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #37 : 26-03-2013 13:46 » 

В CySuiteUSB_3.4.7 такого нет вообще.  А черт его знает...

Добавлено через 38 секунд:
Shakesbeer, скажи, а где ты в Firmware нашел такую папку Endpoint...? у меня просто такой нету.
Я такого не находил, потому и спрашиваю)
« Последнее редактирование: 26-03-2013 13:46 от Shakesbeer » Записан
xenetron
Интересующийся

ru
Offline Offline

« Ответ #38 : 26-03-2013 13:52 » 

Ochkarik, а можешь скинуть мне эти два файла - periph.c и dscr.a51. у меня просто версия программы 3.4.7, наверно забыли положить эти файлы или залили в какие то.
Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #39 : 26-03-2013 13:59 » 

Аналогично и я попрошу)
Если есть возможность кинь архив с этими файлами
Записан
xenetron
Интересующийся

ru
Offline Offline

« Ответ #40 : 26-03-2013 14:00 » 

Shakesbeer, у тебя есть уже какие то наработке для программы обмена данных между контроллером и компом?
Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #41 : 26-03-2013 14:06 » 

Shakesbeer, у тебя есть уже какие то наработке для программы обмена данных между контроллером и компом?
Да какие там наработки)
Мксимум - определение устройства с его VIDом и PIDом.
С Bulkloop и Streamer не разобрался. У меня ещё проблема в том что пишу на C++ Builder 6
Но всегда буду рад каким-либо примерам)
« Последнее редактирование: 26-03-2013 14:09 от Shakesbeer » Записан
xenetron
Интересующийся

ru
Offline Offline

« Ответ #42 : 26-03-2013 14:11 » 

Shakesbeer, я как бы тоже в той же ситуации нахожусь. В принципе как бы мне нужно как на подобе проги bulk или СyControl - передача данных и чтение их. Начал читать исх код Bulk. но что именно конкретно нужно пока не очень понятно.
Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #43 : 26-03-2013 14:15 » 

А в какой программе пишем в Buildere или в Visuale?
Записан
xenetron
Интересующийся

ru
Offline Offline

« Ответ #44 : 26-03-2013 14:15 » 

Shakesbeer,  билдере
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #45 : 26-03-2013 14:15 » 

а какие примеры у вас вообще есть? там пол любому должны быть примеры и проекты для контроллера.
и вообще забыл а что за железо у вас? демоборда какая то или что?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
xenetron
Интересующийся

ru
Offline Offline

« Ответ #46 : 26-03-2013 14:20 » 

Ochkarik, у нас нет, это мы хотели бы на них посмотреть и уже что нибудь сворганить. в CyApi документации очень много всего , разных функций описано, не совсем понятно что нужно именно мне. нужно организовать именно интерфейс обмена данными и больше ничего...

Добавлено через 25 секунд:
CY7C68013 именно эта микросхема стоит.
« Последнее редактирование: 26-03-2013 14:20 от xenetron » Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #47 : 26-03-2013 14:23 » 

а какие примеры у вас вообще есть? там пол любому должны быть примеры и проекты для контроллера.
и вообще забыл а что за железо у вас? демоборда какая то или что?
Кроме http://www.efo.ru/cgi-bin/go?2524 этой статьи я не нашел подробного описания для работы с Cypressoм.
Отладочная у меня Atlys(CY7C68013). Для неё нашел что-то вроде лабы на Dejazzer.com и Makestuff.eu там лампочками поморгать можно и проверить их статус.
Записан
xenetron
Интересующийся

ru
Offline Offline

« Ответ #48 : 26-03-2013 14:43 » 

что то заглохло всё)))
Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #49 : 26-03-2013 14:47 » 

что то заглохло всё)))
Ждем подсказок)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #50 : 26-03-2013 14:58 » 

Ochkarik, да нивапрос! )
Записан

Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #51 : 26-03-2013 15:00 » 

там на сайте примеров кучка, вы их смотрели?
http://www.cypress.com/?id=193&rtID=76

Добавлено через 14 минут и 48 секунд:
так. посмотрел новую, там проект для прерываний отсутствует. ну и фиг с ним)
смотрите примеры builk передачи или CyStreamer. для начала подойдет

Добавлено через 1 минуту и 17 секунд:
дальше. читаем по ссылкам что такое USB  и с чем его едят.
https://forum.shelek.ru/index.php/topic,14645.msg257887.html#msg257887

потом еще раз смотрим документацию от сайпреса.
« Последнее редактирование: 26-03-2013 15:15 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
xenetron
Интересующийся

ru
Offline Offline

« Ответ #52 : 26-03-2013 15:18 » 

так. посмотрел новую, там проект для прерываний отсутствует. ну и фиг с ним)
смотрите примеры builk передачи или CyStreamer. для начала подойдет
это ты о чем конкретно говорил?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #53 : 26-03-2013 15:29 » 

это ты о чем конкретно говорил?
о чтении документации и о файле periph.c в SDK
а он вам вообще зачем был нужен?))
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
xenetron
Интересующийся

ru
Offline Offline

« Ответ #54 : 26-03-2013 15:33 » 

Ochkarik, да там просто автор статьи на сайте ego... говорит что для проекта нужны 4 файла, в том числе и файл прерываний. я в общем посмотрел доки на сайте cypress-а. вообще ничего не понял что нужно. если где то в названии содержалось что либо о bulk, то после открытия файла - ничего полезного в содержимом не нашел...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #55 : 26-03-2013 20:11 » 

xenetron, сути там все основные функции в примерах по одному шаблону построены.
возьмите пример builk передачи из SDK - думаю вам будет не приципиально, это как раз пример с передачей данных. не знаю как в новой версии SDK но в предыдущих этот проект был для Keil студии, контроллер usb на С51 ядре собран.
далее втыкаете ваше устройство, оно опознается драйвером сайпреса (если в нем прошивки из eeprom по i2c не залито). дальше их утилитой заливаете в контроллер скомпилированный проект, устройство переобноруживается в соответствии с заданными VID-PID. если в inf прописать - тоже встанет драйвер от сайпреса.
дальше той же утилитой можно будет почитать пописать/почитать в контроллер по USB - builk передачи.
проект довольно простенький, но для его понимания надо знать физику работы USB и доку. у них там есть что то типа программинг гайд (не помню как дословно называлась). там все тоже более менее внятно, если знать что такое USB шина и с чем ее едят. да и надо разобраться с их регистрами контроллера - там их довольно много. все учить не надо, но хотя бы общее назначение надо знать.
как-то так)

PS статью глянул. ну собстно там ничего нет... чего нет в документации. просто краткая выжимка. это не избавляет от необходимости читать доку.
« Последнее редактирование: 26-03-2013 20:17 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #56 : 27-03-2013 11:44 » 

У меня основная проблема состоит в том что я работaю на Buildere, а большинство программ написано на Visuale. Есть какие-нибудь примеры на нём?
А то при переходе может возникнуть множество проблем...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #57 : 27-03-2013 13:10 » 

Shakesbeer, честно говоря,  мне не совсем ясны проблемы которые могут возникнуть) это ж просто компилятор с линкером) ну выкиньте визуализацию, делов то)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #58 : 28-03-2013 14:14 » 

Нашел хороший пример, но перевести на Builder пока не смог)
Код: (C++)
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using CyUSB;

namespace BulkLoop
{
    public partial class Form1 : Form
    {
        CyUSBDevice myDevice = null;                                                    // Create a USB device for our application called myDevice
        USBDeviceList usbDevices = null;                                                // Find all USBDevice objects that represent all USB devices
        CyBulkEndPoint BulkInEndPt = null;                                              // We need one Bulk IN endpoint
        CyBulkEndPoint BulkOutEndPt = null;                                             // We need one Bulk OUT endpoint

        Thread tXfers;
       
        bool bRunning = false;

        int value,value1,value2,value3;
        int byteCount = 0;

        long outCount, inCount;

        const int XFERSIZE = 512;
        byte[] outData = new byte[XFERSIZE];
        byte[] inData = new byte[XFERSIZE];
        //bool bres;
        // These 2 needed for TransfersThread to update the UI
        delegate void UpdateUICallback();
        UpdateUICallback updateUI;
        protected override void OnPaint(PaintEventArgs e)
        {
            Bitmap bitmap = new Bitmap(80, 60);// может ещё захочешь куда пиксел сунтуть поэтому 10 на 10;
            for (int i = 0; i < 80; i++)
                for (int j = 0; j < 60; j++)
                    bitmap.SetPixel(i, j, Color.Black);

            e.Graphics.DrawImage(bitmap, new Point(30, 450));

            base.OnPaint(e);
        }
        public Form1()
        {
            InitializeComponent();                                                       // All components of the form are initialized

            // Setup the callback routine for updating the UI
            updateUI = new UpdateUICallback(StatusUpdate);                               // Setup the callback routine for updating the UI
            tXfers = new Thread(new ThreadStart(TransfersThread));
            tXfers.IsBackground = true;
            tXfers.Priority = ThreadPriority.Highest;
             //Create a list of CYUSB devices
            usbDevices = new USBDeviceList(CyConst.DEVICES_CYUSB);                       // All devices served by CyUSB.sys is added to the list usbDevices
            GetDevice();                                                                //This function gets the device with particular VID and PId
                                                                                        //and assign EP2 as BulkoutEP, EP6 as BilkInEP

            //Adding event handlers for device attachment and device removal
            usbDevices.DeviceAttached += new EventHandler(usbDevices_DeviceAttached);   // Eventhandler assigned to DeviceAttached
                                                                                        // to handle the event when a device is attached
            usbDevices.DeviceRemoved += new EventHandler(usbDevices_DeviceRemoved);     // Eventhandler assigned to DeviceRemoved
                                                                                        // to handle the event when a device is removed
        }
        /* Summary
           This is the event handler for Device Attachment event.
       */

        public void usbDevices_DeviceAttached(object sender, EventArgs e)               // Eventhandler assigned to DeviceAttached
        {
             GetDevice();                                                               //This function gets the device with particular VID and PId
                                                                                        //and assign EP2 as BulkoutEP, EP6 as BilkInEP
        }

        /* Summary
            This is the event handler for Device removal event.
        */

        public void usbDevices_DeviceRemoved(object sender, EventArgs e)                 // Eventhandler assigned to DeviceRemoved
        {
            //if (tXfers.IsAlive)
            //{
            //    tXfers.Abort();
            //    tXfers.Join();
            //    tXfers = null;
            //    MessageBox.Show("thread alive");
            //}
            //BulkInEndPt.Abort();
            //BulkOutEndPt.Abort();
            myDevice = usbDevices[0x04b4, 0x1004] as CyUSBDevice;                        // Assign all devices with VID/PID of 0x04B4/0x1004 to myDevice
            if (myDevice == null)                                                        // If myDevice doesnt exist
            {
                bRunning = false;
                StartBtn.Text = "Start";
                StartBtn.BackColor = Color.Aquamarine;

                //if (tXfers.IsAlive)
                //{
                //    tXfers.Abort();
                //    tXfers.Join();
                //    tXfers = null;
                //    if (myDevice != null) myDevice.Dispose();
                //    MessageBox.Show("BulkLoop Device Not connected");
                //}
                 
                label1.Text = "BulkLoop Device Not Connected";
                StartBtn.Enabled = false;
            }
           
           
        }

        /* Summary
            The function gets the device, as the one having VID=04b4 and PID=1004
            This will detect only the devices with the above VID,PID combinations
        */

        public void GetDevice()
        {

            myDevice = usbDevices[0x04b4, 0x1004] as CyUSBDevice;              // Assign all devices with VID/PID of 0x04B4/0x1004 to myDevice
               
                if (myDevice != null)                                          // If myDevice exists
                {
                    BulkOutEndPt = myDevice.EndPointOf(0x02) as CyBulkEndPoint;     //Assign EP2 as BulkOutEP and EP6 as BulkInEP
                    BulkInEndPt = myDevice.EndPointOf(0x86) as CyBulkEndPoint;
                    label1.Text = "Bulkloop Device connected";
                    StartBtn.Enabled = true;
                }
                else
                    label1.Text = "No Bulkloop Device Detected";
        }

        /* Summary
                    Executes on Start button click
        */

        private void StartBtn_Click(object sender, EventArgs e)
        {
            if (!bRunning)
            {
                if (ValBox.Text != "")
                {
                    byte[] byteArray = Encoding.ASCII.GetBytes(ValBox.Text);
                    byteCount = Encoding.ASCII.GetByteCount(ValBox.Text);
                    value = value1 = value2 = value3 = 0;

                    if(byteCount >= 1) value = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 0, 1), 16);
                    if(byteCount >= 2) value = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 0, 2), 16);
                    if(byteCount >= 3) value1 = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 2, 1), 16);
                    if(byteCount >= 4) value1 = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 2, 2), 16);
                    if(byteCount >= 5) value2 = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 4, 1), 16);
                    if(byteCount >= 6) value2 = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 4, 2), 16);
                    if(byteCount >= 7) value3 = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 6, 1), 16);
                    if(byteCount >= 8) value3 = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 6, 2), 16);
                }        
                else
                    //tell user that he need to put correct value. -- open
               
                outCount = 0;
                inCount = 0;

                OutdataBox.Text = "";
                InDataBox.Text = "";
               
                bRunning = true;
                StartBtn.Text = "Stop";
                StartBtn.BackColor = Color.Pink;

                //creates new thread
                tXfers = new Thread(new ThreadStart(TransfersThread));
                tXfers.IsBackground = true;
                tXfers.Priority = ThreadPriority.Highest;
                //Starts the new thread
                tXfers.Start();
            }
            else
            {
                //Makes the thread stop and aborts the thread
                bRunning = false;
                StartBtn.Text = "Start";
                StartBtn.BackColor = Color.Aquamarine;

                if (tXfers == null) return;

                if (tXfers.IsAlive)
                {
                    tXfers.Abort();
                    tXfers.Join();
                    tXfers = null;
                }
            }
        }

        /* Summary
           Called from TransfersThread().When you click on start button, it will create and start a new thread named 'TransfersThread'.
            The function outputs the bytes transfered to outData[] buffer.
        */

        private void SetOutputData()
        {
            for (int i = 0; i < XFERSIZE; i++)
            {
                if((byteCount >= 1) && (i < XFERSIZE)) outData = (byte)value;
                if((byteCount >= 3) && (++i < XFERSIZE)) outData = (byte)value1;
                if((byteCount >= 5) && (++i < XFERSIZE)) outData = (byte)value2;
                if((byteCount >= 7) && (++i < XFERSIZE)) outData = (byte)value3;
            }
                         
        }
       
        /* Summary
           This thread is initiated on start button click.Run the thread and executes the transfer and invokes the StatusUpdate to update the UI
        */


        public void TransfersThread()
        {
            int xferLen = XFERSIZE;

            bool bResult = true;

            // Loop stops if either an IN or OUT transfer fails
            for (; bRunning && bResult; )
            {
                SetOutputData();                                                         //this function sets the bytes in outData to be transferred to OUT EP

                xferLen = XFERSIZE;
                //calls the XferData function for bulk transfer(OUT) in the cyusb.dll
                bResult = BulkOutEndPt.XferData(ref outData, ref xferLen);
                outCount += xferLen;

                if (bResult)
                {
                    //calls the XferData function for bulk transfer(IN) in the cyusb.dll
                    bResult = BulkInEndPt.XferData(ref inData, ref xferLen);
                    inCount += xferLen;
                }

                // Call StatusUpdate() in the main thread
                this.Invoke(updateUI);
                //bres = bResult;
            }

            bRunning = false;

            // Call StatusUpdate() in the main thread
            this.Invoke(updateUI);
        }
        /* Summary
          This is the call back function for updating the UI(user interface) and is called from TransfersThread. This updates the OutdataBox,InDataBox
           with the Bytes transferred; and NumBytesOut,NumBytesIn with the number of Bytes transferred.
         
       */

        public void StatusUpdate()
        {
            StringBuilder dataStrOut = new StringBuilder();
            StringBuilder dataStrIn = new StringBuilder();
           
            if (bRunning)
            {
                for (int i = 0; i < XFERSIZE; i++)
                {
                    if ((i % 16) == 0) dataStrOut.Append(string.Format("\r\n{0:X4}", i));
                    dataStrOut.Append(string.Format(" {0:X2}", outData));
                }
                dataStrOut.Append(string.Format("\r\n"));
                OutdataBox.Text += dataStrOut.ToString();                                   //This updates the OutdataBox with bytes transferred OUT

                for (int i = 0; i < XFERSIZE; i++)
                {
                    if ((i % 16) == 0) dataStrIn.Append(string.Format("\r\n{0:X4}", i));
                    dataStrIn.Append(string.Format(" {0:X2}", inData));
                }
                dataStrIn.Append(string.Format("\r\n"));
                InDataBox.Text += dataStrIn.ToString();                                      //This updates the InDataBox with bytes transferred IN
            }


            NumBytesOut.Text = outCount.ToString();                                          //This updates the NumBytesOut with number of bytes transferred OUT
            NumBytesIn.Text = inCount.ToString();                                           //This updates the NumBytesIn with number of bytes transferred IN
            Refresh();

            StartBtn.Text = bRunning ? "Stop" : "Start";
            StartBtn.BackColor = bRunning ? Color.Pink : Color.Aquamarine;

            //Text = bres.ToString();

           
        }
        /* Summary
            closing the open form
        */

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            // If close was selected while running the loopback, shut it down.
            if (bRunning)
                StartBtn_Click(this, null);

            if (usbDevices != null) usbDevices.Dispose();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}
Тут ещё появляется небольшая разница в библиотеках CyUSB.dll и CyAPI.lib
Поставить вместо USBDevice CyUSBDevice я догадался, но вот USBDeviceList в CyAPI.lib нету, правда сразу нашел описание класса:
Код: (C++)
 #region Сборка CyUSB.dll, v2.0.50727
// D:\Programming\CYPRESS_USB\Cypress\AN70983\Bulkloop\Application\Source\BulkLoop\bin\Debug\CyUSB.dll
#endregion

using System;
using System.Collections;
using System.Reflection;

namespace CyUSB
{
    public class USBDeviceList : IDisposable, IEnumerable
    {
        public USBDeviceList(byte DeviceMask);
        public USBDeviceList(byte DeviceMask, App_PnP_Callback fnCallBack);

        public int Count { get; }

        public USBDevice this[int index] { get; set; }
        public USBDevice this[string infName] { get; }
        public USBDevice this[int VID, int PID] { get; }
        public CyHidDevice this[string sMfg, string sProd] { get; }
        public CyHidDevice this[int VID, int PID, int UsagePg, int Usage] { get; }
        public CyHidDevice this[string sMfg, string sProd, int UsagePg, int Usage] { get; }

        public event EventHandler DeviceAttached;
        public event EventHandler DeviceRemoved;

        public USBDevice Add();
        public byte DeviceIndex(USBDevice dev);
        public void Dispose();
        protected virtual void Dispose(bool isDisposing);
        public IEnumerator GetEnumerator();
        public void Remove(CySafeFileHandle hDev);
        public void Remove(IntPtr hDev, USBEventArgs e);
    }
}
Этого я пока не пробовал, но с другой стороны всегда можно определить устройство банально открывая все USB и сравнивая VID и PID...

Аналогичная проблема с Thread:
Код: (C++)
 #region Сборка mscorlib.dll, v2.0.50727
// C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll
#endregion

using System;
using System.Globalization;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Runtime.Remoting.Contexts;
using System.Security.Principal;

namespace System.Threading
{
    // Сводка:
    //     Создает и контролирует поток, задает приоритет и возвращает статус.
    [ClassInterface(ClassInterfaceType.None)]
    [ComVisible(true)]
    [ComDefaultInterface(typeof(_Thread))]
 public sealed class Thread : CriticalFinalizerObject, _Thread
    {
 public Thread(ParameterizedThreadStart start);
public Thread(ThreadStart start);
public Thread(ParameterizedThreadStart start, int maxStackSize);
public Thread(ThreadStart start, int maxStackSize);
[Obsolete("The ApartmentState property has been deprecated.  Use GetApartmentState, SetApartmentState or TrySetApartmentState instead.", false)]
        public ApartmentState ApartmentState { get; set; }
public static Context CurrentContext { get; }
 public CultureInfo CurrentCulture { get; set; }
public static IPrincipal CurrentPrincipal { get; set; }
public static Thread CurrentThread { get; }
public CultureInfo CurrentUICulture { get; set; }
public ExecutionContext ExecutionContext { get; }
public bool IsAlive { get; }
public bool IsBackground { get; set; }
public bool IsThreadPoolThread { get; }
 public int ManagedThreadId { get; }
public string Name { get; set; }
public ThreadPriority Priority { get; set; }
public ThreadState ThreadState { get; }
public void Abort();
public void Abort(object stateInfo);
public static LocalDataStoreSlot AllocateDataSlot();
public static LocalDataStoreSlot AllocateNamedDataSlot(string name);
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public static void BeginCriticalRegion();
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public static void BeginThreadAffinity();
public static void EndCriticalRegion();
        public static void EndThreadAffinity();
        public static void FreeNamedDataSlot(string name);
        public ApartmentState GetApartmentState();
        [Obsolete("Thread.GetCompressedStack is no longer supported. Please use the System.Threading.CompressedStack class")]
        public CompressedStack GetCompressedStack();
        public static object GetData(LocalDataStoreSlot slot);
        public static AppDomain GetDomain();
        public static int GetDomainID();
        [ComVisible(false)]
        public override int GetHashCode();
        public void Interrupt();
        public void Join();
        public bool Join(int millisecondsTimeout);
        public bool Join(TimeSpan timeout);
        public static void MemoryBarrier();
        public static void ResetAbort();
System.Security.Permissions.SecurityPermission.
        [Obsolete("Thread.Resume has been deprecated.  Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.  http://go.microsoft.com/fwlink/?linkid=14202", false)]
        public void Resume();
        public void SetApartmentState(ApartmentState state);
        [Obsolete("Thread.SetCompressedStack is no longer supported. Please use the System.Threading.CompressedStack class")]
        public void SetCompressedStack(CompressedStack stack);
        public static void SetData(LocalDataStoreSlot slot, object data);
        public static void Sleep(int millisecondsTimeout);
        public static void Sleep(TimeSpan timeout);
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        public static void SpinWait(int iterations);
        public void Start();
        public void Start(object parameter);
System.Security.Permissions.SecurityPermission.
        [Obsolete("Thread.Suspend has been deprecated.  Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.  http://go.microsoft.com/fwlink/?linkid=14202", false)]
        public void Suspend();
        public bool TrySetApartmentState(ApartmentState state);
        public static byte VolatileRead(ref byte address);
        public static double VolatileRead(ref double address);
        public static float VolatileRead(ref float address);
        public static int VolatileRead(ref int address);
        public static IntPtr VolatileRead(ref IntPtr address);
        public static long VolatileRead(ref long address);
        public static object VolatileRead(ref object address);
        [CLSCompliant(false)]
        public static sbyte VolatileRead(ref sbyte address);
        public static short VolatileRead(ref short address);
        [CLSCompliant(false)]
        public static uint VolatileRead(ref uint address);
        [CLSCompliant(false)]
        public static UIntPtr VolatileRead(ref UIntPtr address);
        [CLSCompliant(false)]
        public static ulong VolatileRead(ref ulong address);
        [CLSCompliant(false)]
        public static ushort VolatileRead(ref ushort address);
        public static void VolatileWrite(ref byte address, byte value);
        public static void VolatileWrite(ref double address, double value);
        public static void VolatileWrite(ref float address, float value);
        public static void VolatileWrite(ref int address, int value);
        public static void VolatileWrite(ref IntPtr address, IntPtr value);
        public static void VolatileWrite(ref long address, long value);
        public static void VolatileWrite(ref object address, object value);
        [CLSCompliant(false)]
        public static void VolatileWrite(ref sbyte address, sbyte value);
        public static void VolatileWrite(ref short address, short value);
        [CLSCompliant(false)]
        public static void VolatileWrite(ref uint address, uint value);
        [CLSCompliant(false)]
        public static void VolatileWrite(ref UIntPtr address, UIntPtr value);
        [CLSCompliant(false)]
        public static void VolatileWrite(ref ulong address, ulong value);
        [CLSCompliant(false)]
        public static void VolatileWrite(ref ushort address, ushort value);
    }
}
С этим потоком совсем непонятно, честно говоря. Чем его можно заменить или переправить в Builder?

Столкнулся я с другой проблемой - delegate, я так понял тут можно вызывать какую-нибудь функции взамен.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #59 : 28-03-2013 19:19 » 

Shakesbeer,
Cypress CyAPI Programmer's Reference
Цитата
1 Overview
Library Overview
CyAPI.lib provides a simple, powerful C++ programming interface to USB devices. More specifically, it
is a C++ class library that provides a high-level programming interface to the CyUsb.sys device driver.
The library is only able to communicate with USB devices that are served by (i.e. matched to) this driver.
Rather than communicate with the driver via Windows API calls such as SetupDiXxxx and
DeviceIoControl, applications call simpler CyAPI methods such as Open, Close, and XferData to
communicate with USB devices.
To use the library, you need to include the header file, CyAPI.h, in files that access the CCyUSBDevice
class. In addition, the statically linked CyAPI.lib file must be linked to your project. Versions of the .lib
file are available for use with Microsoft Visual Studio 2008, 2010 and Borland C++ Builder 6.0. Please
refer section How to Link to CyAPI.lib for more detail.

The library employs a Device and EndPoints use model. To use the library you must create an
instance of the CCyUSBDevice class using the new keyword. A CCyUSBDevice object knows how
many USB devices are attached to the CyUsb.sys driver and can be made to abstract any one of those
devices at a time by using the Open method. An instance of CCyUSBDevice exposes several methods
and data members that are device-specific, such as DeviceName, DevClass, VendorID, ProductID, and
SetAltIntfc.
When a CCyUSBDevice object is open to an attached USB device, its endpoint members provide an
interface for peforming data transfers to and from the device's endpoints. Endpoint-specific data
members and methods such as MaxPktSize, TimeOut, bIn, Reset and XferData are only accessible
through endpoint members of a CCyUSBDevice object.
In addition to its simplicity, the class library facilitates creation of sophisticated applications as well.
The CCyUSBDevice constructor automatically registers the application for Windows USB Plug and Play
event notification. This allows your application to support "hot plugging" of devices. Also, the
asynchronous BeginDataXfer/WaitForXfer/FinishDataXfer methods allow queueing of multiple data
transfer requests on a single endpoint, thus enabling data streaming from the application level.
мне продолжить? или все таки сами начнете читать?)
« Последнее редактирование: 28-03-2013 19:23 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
xenetron
Интересующийся

ru
Offline Offline

« Ответ #60 : 28-03-2013 21:31 » 

Я как раз обратил внимание что вначале дока говорится, что типа для простого обмена данными пригодится метод open close и xferdata. щас вот обрабатываю файлы bulkloopdlg, bulkloop, где как бы эти методы используются. но вот проблема. все пилилось на вижуале. и это очень заметно. Потому что вопервых: используется библиотека stdafx.h, вовторых постоянно идет связка с afx* библиотеками, которые идут с MFC. В инете посмотрел, что аналога stdafx в билдере нет. и никак обыграть не получиться. после того, как я комменчу всю инфу, связанную с afx и stdafx, появляется следующая ошибка
Код: (C++)
// BulkLoop.h : main header file for the BULKLOOP application
//

#if !defined(AFX_BULKLOOP_H__94303D2D_6EC6_4505_BE2A_85BDF0C7D94F__INCLUDED_)
#define AFX_BULKLOOP_H__94303D2D_6EC6_4505_BE2A_85BDF0C7D94F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//#ifndef __AFXWIN_H__
//      #error include 'stdafx.h' before including this file for PCH
//#endif

#include "resource.h"           // main symbols

/////////////////////////////////////////////////////////////////////////////
// CBulkLoopApp:
// See BulkLoop.cpp for the implementation of this class
//

class CBulkLoopApp : public CWinApp
{
public:
        CBulkLoopApp();

// Overrides
        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CBulkLoopApp)
        public:
        virtual BOOL InitInstance();
        //}}AFX_VIRTUAL

// Implementation

        //{{AFX_MSG(CBulkLoopApp)
                // NOTE - the ClassWizard will add and remove member functions here.
                //    DO NOT EDIT what you see in these blocks of generated code !
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
};


/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_BULKLOOP_H__94303D2D_6EC6_4505_BE2A_85BDF0C7D94F__INCLUDED_)
[BCC32 Error] BulkLoop.h(23): E2303 Type name expected
[BCC32 Error] BulkLoop.h(23): E2303 Type name expected
[BCC32 Error] BulkLoop.h(31): E2462 'virtual' can only be used with non-template member functions
[BCC32 Error] BulkLoop.h(31): E2303 Type name expected
[BCC32 Error] BulkLoop.h(31): E2139 Declaration missing ;
[BCC32 Error] BulkLoop.h(41): E2040 Declaration terminated incorrectly
[BCC32 Error] BulkLoopDlg.h(17): E2303 Type name expected
[BCC32 Error] BulkLoopDlg.h(20): E2293 ) expected
[BCC32 Error] BulkLoopDlg.h(23): E2303 Type name expected
[BCC32 Error] BulkLoopDlg.h(23): E2139 Declaration missing ;

и в общем теперь билдер просто помоему начал капризничать? или я может немного не понимаю, что именно не так объявлено. с объявлением класса вроде все норм. подскажите если знаете.
« Последнее редактирование: 28-03-2013 21:35 от xenetron » Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #61 : 29-03-2013 10:28 » 

Улыбаюсь
Что касается CyАpi меня вопрос только в объявлении параметров Сypressa, его EP и т.д.

Добавлено через 3 часа, 22 минуты и 8 секунд:
xenetron, у меня та же фигня была. Из-за чего готовые примеры Cypressa рассматривать в Билдере было невозможно.
« Последнее редактирование: 29-03-2013 13:50 от Shakesbeer » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #62 : 29-03-2013 19:46 » 

да погодите.
ну не надо-ж так целиком без разбора драть все подряд! нафига вам визуализация из студии? пишите свою.
и еще раз - посмотрите что, как и главное зачем вызывается перед тем как тупо драть код. примеры нужны для этого а не для тупого копипаста.
а stdafx вам вообще не нужен, и если бы вы сначала  разобрались что вы копируете  - вы бы это поняли.

все. дискуссию закрываю. в дальнейшем, подобного рода вопросы, простите, буду отправлять в помойку.
« Последнее редактирование: 29-03-2013 19:49 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
xenetron
Интересующийся

ru
Offline Offline

« Ответ #63 : 01-04-2013 13:56 » 

Shakesbeer,  можешь попробовать поработать с проектом FxEEPROM. Он как раз под билдер сделан.
Ochkarik,  такая вот проблема, я подгрузил все файлы FxEEPROM в проект билдера, и вылезает такая ошибка

файлы проекта и фото ошибки прилагаются.http://zalil.ru/34401540

* ошибка дебагера.JPG (220.73 Кб - загружено 2796 раз.)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #64 : 01-04-2013 15:48 » 

xenetron    Жизнь хороша, когда пьеш не спешаГлавное - кучность!
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
xenetron
Интересующийся

ru
Offline Offline

« Ответ #65 : 01-04-2013 17:02 » 

что в этот раз не так?
Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #66 : 12-04-2013 11:00 » 

Не могу разобраться какие параметры надо задавать для bulk передачи.
Если кто-нибудь знает ресурс или статьи, где обсуждается это скиньте плииз)

P.S. Пишу на C++ Builder.

Добавлено через 6 дней, 3 часа, 45 минут и 42 секунды:
Использую Bulk передачу и прием.
В случае единичной передачи все проходит хорошо, без ошибок, посылает пакет, принимает:
Код: (C++)
 void __fastcall TForm1::Button4Click(TObject *Sender)
{
 USBDevice = new CCyUSBDevice(NULL);
 OVERLAPPED outOvLap, inOvLap;
 outOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_OUT");
 //unsigned char buffer[128] = "1s";//(unsigned char*)Form1->Edit1->Text.c_str();
 //LONG length = 128;
 AnsiString stryng = Form1->Edit1->Text.c_str();
 char* buffer=new char[stryng.Length()+1];
 strcpy(buffer,stryng.c_str());
 LONG length = stryng.Length()+1;
 UCHAR *outContext = USBDevice->BulkOutEndPt->BeginDataXfer(buffer, length, &outOvLap);
 USBDevice->BulkOutEndPt->WaitForXfer(&outOvLap,100);
 USBDevice->BulkOutEndPt->FinishDataXfer(buffer, length, &outOvLap,outContext);
 CloseHandle(outOvLap.hEvent);
 unsigned char inBuf[128];
 ZeroMemory(inBuf, 128);
 inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
 UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inBuf, length, &inOvLap);
 USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100);
 USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext);
 CloseHandle(inOvLap.hEvent);
 Memo2->Lines->Add(AnsiString((char *)inBuf));
}

Создал поток передачи и приема, при нажатии на SpeedButton начинаются передача и прием, при повторном нажатии прекращаются.
Описание thread приема и передачи:
Код: (C++)
CCyUSBDevice *USBDevice;
OVERLAPPED outOvLap, inOvLap;
char* buffer;
unsigned char inBuf[512];
LONG length;

//---------------------------------------------------------------------------
//----------------------Reading----------------------------------------------
//---------------------------------------------------------------------------
class ReadThread : public TThread
{
private:
         void __fastcall Printing();   
protected:
        void __fastcall Execute();    
public:
        __fastcall ReadThread(bool CreateSuspended);  
};
//---------------------------------------------------------------------------
ReadThread *reader;     //îáúåêò ïîòîêà ReadThread
//---------------------------------------------------------------------------
__fastcall ReadThread::ReadThread(bool CreateSuspended) : TThread(CreateSuspended)
{}
//---------------------------------------------------------------------------
void __fastcall ReadThread::Execute()
{
 inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
 while(!Terminated)
  {
   UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inBuf, length, &inOvLap);
   USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100);
   USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext);
   Synchronize(Printing);
  }
 CloseHandle(inOvLap.hEvent);
}
//---------------------------------------------------------------------------
void __fastcall ReadThread::Printing()
{
 Form1->Label2->Caption = Form1->Label2->Caption.ToInt() + strlen(inBuf);
 Form1->Memo2->Lines->Add(AnsiString((char *)inBuf));
 ZeroMemory(inBuf, 512);
}
//---------------------------------------------------------------------------
//----------------------Writing----------------------------------------------
//---------------------------------------------------------------------------
class WriteThread : public TThread
{
private:
  void __fastcall Printing();
protected:
        void __fastcall Execute();
public:
        __fastcall WriteThread(bool CreateSuspended);
};
//-----------------------------------------------------------------------------
//............................ WriteThead ...............................
//-----------------------------------------------------------------------------

WriteThread *writer;     //îáúåêò ïîòîêà WriteThread

//---------------------------------------------------------------------------
__fastcall WriteThread::WriteThread(bool CreateSuspended) : TThread(CreateSuspended)
{}
//---------------------------------------------------------------------------
void __fastcall WriteThread::Execute()
{
 AnsiString stryng = Form1->Edit1->Text.c_str();
 buffer=new char[stryng.Length()+1]
 strcpy(buffer,stryng.c_str());
 length = stryng.Length()+1;
 //length = strlen(buffer);
 outOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_OUT");
 UCHAR *outContext;
                                     
 while(!Terminated)
  {
   outContext = USBDevice->BulkOutEndPt->BeginDataXfer(buffer, length, &outOvLap);
   USBDevice->BulkOutEndPt->WaitForXfer(&outOvLap,100);
   USBDevice->BulkOutEndPt->FinishDataXfer(buffer, length, &outOvLap,outContext);
  }
 CloseHandle(outOvLap.hEvent);
}
//---------------------------------------------------------------------------
void __fastcall WriteThread::Printing()                               //               Stop sending data
{
}
//---------------------------------------------------------------------------
Сама кнопка SpeedButton:
Код: (C++)
 void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
 USBDevice  = new  CCyUSBDevice(NULL);
 if (SpeedButton1->Down)
  {
   Form1->Label2->Caption = "0";
   SpeedButton1->Caption = "Stop transfer";
   writer = new WriteThread(false);
   writer->FreeOnTerminate = true;
   reader = new ReadThread(false);
   reader->FreeOnTerminate = true;
  }
  else
  {
   SpeedButton1->Caption = "Begin transfer";
   if(writer)writer->Terminate();
   if(reader)reader->Terminate();
   CloseHandle(outOvLap.hEvent);  
   CloseHandle(inOvLap.hEvent);
  }
}
Некорректно завершается передача и прием при остановке потока, периодически возникают ошибка во время передачи.
Что не так сделал, объясните, плииз)

* 18.04.13.rar (513.65 Кб - загружено 817 раз.)
« Последнее редактирование: 18-04-2013 14:46 от Shakesbeer » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #67 : 18-04-2013 15:37 » 

сто раз уже говорил. ну сколько можно то!
где проверки статусов?
ошибка - какая ошибка?
некорректно - в чем это "некорректно"?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #68 : 19-04-2013 09:08 » 

сто раз уже говорил. ну сколько можно то!
где проверки статусов?
ошибка - какая ошибка?
некорректно - в чем это "некорректно"?
Каких статусов? Endpoit задается корректно.
Надо проверять статус каждый раз в потоке?
По поводу ошибки не точно выразился. При вторичном нажатии кнопки прием-передача должна быть остановлена, но процесс не останавливается, либо начинает принимать пустые байты.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #69 : 19-04-2013 09:25 » 

while(!Terminated)
Terminated - это что за переменная? и где оно выставляется
if(writer)writer->Terminate(); -  что эта функция делает? нить убивает? а в какой момент?
сайпрес - засланцы. описание функции у них все таки безобразное... назначение поля OVERLAPPED в этих функциях?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #70 : 19-04-2013 10:36 » 

while(!Terminated)
Terminated - это что за переменная? и где оно выставляется
if(writer)writer->Terminate(); -  что эта функция делает? нить убивает? а в какой момент?
сайпрес - засланцы. описание функции у них все таки безобразное... назначение поля OVERLAPPED в этих функциях?
if(writer)writer->Terminate(); - это как раз прекращение потока, т.е. Terminated присваивается true, соответственно while(!Terminated) прекращает цикл.
Это я взял из своей старой программы работы с COM портом, там было все без проблем и прекрасно работало.

А пример передачи через CCyUSBDevice с OVERLAPPED и т.д. просто скопировал с примера Bulk из CyAPI.

Добавлено через 19 минут и 19 секунд:
Сделал такую защиту в потоке:

Код: (C++)
void __fastcall ReadThread::Execute()
{
 while(!Terminated)
  {  
 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) || (!succesOut))   //Если прием или передача с ошибкой произошли
    {
     reader->Terminate();            //Прекращаем поток приема
     Form1->SpeedButton1->Caption = "Begin transfer";
     Form1->SpeedButton1->Down = false;
    }
   Synchronize(Printing);  
 CloseHandle(inOvLap.hEvent);
  }
}
Но все равно происходят сбои, я так понимаю что это просто потому что одновременно работают два потока: один записывает, а другой считывает. Для такой работы наверное стоит соединить их в один thread)

У меня появился вопрос по поводу другого принципа из CyAPI:
Код: (C++)
 USBDevice  = new  CCyUSBDevice(NULL);
 
 CCyControlEndPoint *eptOut  = USBDevice->ControlEndPt;
 
 AnsiString stryng = Form1->Edit1->Text.c_str();
 //char* bufOut1=new char[stryng.Length()+1];//length возвращает длинну без нуль-терминатора,поэтому +1

 eptOut->Target    = TGT_DEVICE;
 eptOut->ReqType   = REQ_VENDOR;
 eptOut->Direction = DIR_TO_DEVICE;
 eptOut->ReqCode   = 0x05;
 eptOut->Value     = 1;
 eptOut->Index     = 0;
 unsigned char  bufOut[512];
 ZeroMemory(bufOut, 512);
 LONG bufOutlen = 512;
// LONG bufOutlen = stryng.Length()+1;
 strcpy(bufOut,stryng.c_str());
 bool resSent = eptOut->XferData(bufOut, bufOutlen);
 if (resSent) Memo2->Lines->Add("Sending Ok");
   else Memo2->Lines->Add("Sending failed");

 CCyControlEndPoint  *eptIn = USBDevice->ControlEndPt;
 eptIn->Target  = TGT_DEVICE;
 eptIn->ReqType = REQ_VENDOR;
 eptOut->Direction = DIR_FROM_DEVICE;
 eptIn->ReqCode = 0x07;
 eptIn->Value   = 1;
 eptIn->Index   = 0;
 unsigned char  bufIn[512];
 LONG bytesToRead = bufOutlen;
 bool resRes = eptIn->Read(bufIn, bytesToRead);
 if (resRes) Memo2->Lines->Add("Recieving Ok");
   else Memo2->Lines->Add("Recieving failed");
 
 Memo2->Lines->Add(AnsiString((char *)bufIn));
Никак не разберусь какая величина ept указывает на номер Enpointa, на который будут передаваться или с которого будут считываться данные. А черт его знает...
« Последнее редактирование: 19-04-2013 10:56 от Shakesbeer » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #71 : 19-04-2013 12:32 » 

конечная точка типа Control.
номер видимо либо eptIn->Value   = 1 или  eptIn->Index   = 0;

Добавлено через 3 минуты и 50 секунд:
Цитата
Но все равно происходят сбои, я так понимаю что это просто потому что одновременно работают два потока: один записывает, а другой считывает. Для такой работы наверное стоит соединить их в один thread)"
не вижу препятствий для одновременной работы двух нитей... если только интерфейс библиотеки сайпреса не позволяет.
а функция терминации меня все равно смущает. хрень какая то) если в нити не проверять эту переменную - нить никогда не остановится что ли?
« Последнее редактирование: 19-04-2013 12:36 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #72 : 19-04-2013 12:47 » 

не вижу препятствий для одновременной работы двух нитей... если только интерфейс библиотеки сайпреса не позволяет.
а функция терминации меня все равно смущает. хрень какая то) если в нити не проверять эту переменную - нить никогда не остановится что ли?
Смысл terminate в прекращении ReadThread или WriteThread.
Вот только почему-то после прекращения потока, работа системы с микросхемой продолжается до тех пор, пока не отсоединишь устройство.

Добавлено через 4 минуты и 41 секунду:
Я исправил ошибку, объединив два потока в один. Похоже они просто накладывались друг на друга  Какой был слон...
« Последнее редактирование: 19-04-2013 13:12 от Shakesbeer » Записан
xenetron
Интересующийся

ru
Offline Offline

« Ответ #73 : 19-04-2013 13:15 » 

Shakesbeer, твоя прога ж работает только на I/O?

Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #74 : 19-04-2013 13:27 » 

Shakesbeer, твоя прога ж работает только на I/O?
Не понял вопроса.
Вот программа, там сделал три потока: на чтение из USb порта, на запись и на последовательные запись и чтение.
прописываешь Bulkloop.hex с помощью ControlCenter и юзаешь. Надеюсь поможет   Пиво!

* 19.04.13.rar (515.36 Кб - загружено 861 раз.)
Записан
xenetron
Интересующийся

ru
Offline Offline

« Ответ #75 : 19-04-2013 13:36 » 

Shakesbeer, у меня выскачила вот такая ошибка - [BCC32 Error] Unit1.cpp(304): E2285 Could not find a match for 'CCyUSBConfig::CCyUSBConfig(const CCyUSBConfig&)'
Код:
CCyUSBConfig cfg = USBDevice->GetUSBConfig(c);
в 304 строчке и при build-е спрашивает где находится package dss.bpi
Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #76 : 19-04-2013 13:43 » 

Shakesbeer, у меня выскачила вот такая ошибка - [BCC32 Error] Unit1.cpp(304): E2285 Could not find a match for 'CCyUSBConfig::CCyUSBConfig(const CCyUSBConfig&)'
Код:
CCyUSBConfig cfg = USBDevice->GetUSBConfig(c);
в 304 строчке и при build-е спрашивает где находится package dss.bpi
Я использую Borland C++ Builder 6 и соответственно кипресовскую библиотеку CyApi.lib, которую брал из папки USB Suite->lib->BC6. Если используешь другую программу, то может и библиотеку стоит прикрепить другую? При переходе с одной программы на другую возникает множество проблем с библиотеками, попробуй поискать ответы в интернете о несовместимости.
Записан
xenetron
Интересующийся

ru
Offline Offline

« Ответ #77 : 19-04-2013 13:48 » 

Shakesbeer, странно. я тоже пользуюсь 6 билдером. посмотрел в дереве - и CyApi.h  и *.Lib подкл
Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #78 : 19-04-2013 13:52 » 

Shakesbeer, странно. я тоже пользуюсь 6 билдером. посмотрел в дереве - и CyApi.h  и *.Lib подкл
В System кидал библиотеки usb100.h usb200.h и т.д.?
Записан
xenetron
Интересующийся

ru
Offline Offline

« Ответ #79 : 19-04-2013 13:57 » 

Shakesbeer,
Shakesbeer, странно. я тоже пользуюсь 6 билдером. посмотрел в дереве - и CyApi.h  и *.Lib подкл
В System кидал библиотеки usb100.h usb200.h и т.д.?
в систем в смысле в виндовскую папку?

Добавлено через 32 минуты и 34 секунды:
Shakesbeer, c этой ошибкой я разобрался. но теперь он от меня требует dss.bpi

Добавлено через 6 минут и 52 секунды:
Shakesbeer, все, я разобрался)
« Последнее редактирование: 19-04-2013 14:37 от xenetron » Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #80 : 19-04-2013 14:40 » 

Shakesbeer, все, я разобрался)

Класс! Красавчик!
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #81 : 19-04-2013 15:01 » 

после завершения нити, попробуйте на всякий пожарный проверить статус завершения нити.
WaitForXfer(&inOvLap,100); - 100 - это время ожидания? пакеты гарантированно доставляются за это время? можно ли вызывать FinishDataXfer() если ожидание завершилось по таймауту?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #82 : 20-04-2013 13:43 » 

Код:
после завершения нити, попробуйте на всякий пожарный проверить статус завершения нити.
WaitForXfer(&inOvLap,100); - 100 - это время ожидания? пакеты гарантированно доставляются за это время? можно ли вызывать FinishDataXfer() если ожидание завершилось по таймауту?
Специально ввел проверку
Код: (C++)
 succesIn = USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext); //Заканчиваем Bulk прием (прием пакета)
   if(!succesIn)   //Если прием или передача с ошибкой произошли
    {
     writereader->Terminate();            //Прекращаем поток передачи-приема
     Form1->SpeedButton1->Caption = "Begin transfer";
     Form1->SpeedButton1->Down = false;
    }
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #83 : 21-04-2013 00:49 » 

Shakesbeer, пардон,  на предыдущую версию кода видимо посмотрел.
там есть какие нибудь функции статус последней операции EP посмотреть?
при передаче по USB транзакция может быть завершена с ошибкой, в этом случае там надо ресет EndPoint-a делать. правда возможно это драйвер сайпреса автоматом делает - не знаю.
у меня полные затыки были когда аппаратно поток не правильно был сформирован.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
xenetron
Интересующийся

ru
Offline Offline

« Ответ #84 : 23-04-2013 08:47 » 

Shakesbeer, сможешь скинуть конфигурацию твоего builder'a? не могу понять почему твоя и некоторые другие программы нехотят полностью компилироваться
Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #85 : 23-04-2013 09:02 » 

Использую Bulk передачи, получается около 1 Мбит/с. Писали что с CyAPI легко сделать 48, как достичь такой скорости?
Записан
xenetron
Интересующийся

ru
Offline Offline

« Ответ #86 : 23-04-2013 13:30 » 

Shakesbeer, а зачем тебе в проге нужен TImage??
Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #87 : 23-04-2013 13:49 » 

xenetron, потому что принятые байты вывожу на экран в виде изображения, где 1 байт равен цвету одного пиксела.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #88 : 23-04-2013 14:40 » 

Использую Bulk передачи, получается около 1 Мбит/с. Писали что с CyAPI легко сделать 48, как достичь такой скорости?
48 не видел. на форуме на сайпреса пишут, что приложение на основе streamer(или как там его) с соответствующей прошивкой дает если не путаю порядка 40.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #89 : 23-04-2013 14:40 » 

Ochkarik, Похоже надо что-то делать с reset, потому что ошибка периодически выскакивает и поток тормозится.
В CyApI написано что нужно использовать Abort вместо Reset. Я так понимаю что Abort возвращает в начальное состояние Endpoint, после чего поток можно сразу же продолжать?
Записан
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #90 : 23-04-2013 14:42 » 

Ochkarik, а какие методы использует Streamer?)) Я так понял там синхронный ControlEndpoint с XferData просто? Или что-то другое?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #91 : 23-04-2013 15:08 » 

не знаю. по спецификации usb в случае возникновения ошибок передачи пакетов надо отменить все транзакции и выполнить сброс EP. если не помогает сброс устройства. как у сайпреса - не знаю. по идее они сами должны были разруливать ситуации.
да, и такая штука может происходить, если некорректная программа в контроллере или некорректные аппаратные веревки на входе FIFO сайпреса.

Добавлено через 1 минуту и 5 секунд:
Shakesbeer, ну откуда ж я знаю.. я туда не смотрел)))
« Последнее редактирование: 23-04-2013 15:09 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Shakesbeer
Постоялец

ru
Offline Offline

« Ответ #92 : 24-04-2013 16:22 » 

Ochkarik, проблема все в том же) Думаю написать через простой ControlEndpoint Xferdata и сравнить с Bulk передачей, но не могу найти подробное описание:
Код: (C++)
 eptOut->Target    = TGT_DEVICE;
 eptOut->ReqType   = REQ_VENDOR;
 eptOut->Direction = DIR_TO_DEVICE;
 eptOut->ReqCode   = 0x05;
 eptOut->Value     = 1;
 eptOut->Index     = 0;
Записан
Страниц: 1 2 3 4 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines