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

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines