Shakesbeer
Постоялец
Offline
|
|
« : 15-02-2013 13:20 » |
|
Хочу начать работу с CY7C68013 Изучил множество материалов, но большинство программ написано либо на асемблере, либо на Visual. Есть где-нибудь материал и примеры, написанные на C++ Builder 6 ?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #1 : 15-02-2013 13:54 » |
|
начать надо конечно с документации))) http://www.cypress.com/?id=193и простите.... вы драйвер на C++ Builder 6 хотите написать? а если просто надо общаться с устройством - смотрите SDK по ссылке, а Builder у вас или MSVC разницы нет. вам нужно CyAPI. документация есть в SDK.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #2 : 15-02-2013 15:02 » |
|
Спасибо. Хоть знаю что в случае простого общения нужен только CyAPI )) Документацию изучил, но без конкретного примера пока не могу сообразить. А все что нахожу как правило в Visual С.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #3 : 15-02-2013 15:08 » |
|
Shakesbeer, если программировать в рамках Win32 API, то разницы между VC и BCB нет.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Ochkarik
|
|
« Ответ #4 : 16-02-2013 03:23 » |
|
Shakesbeer, примеры там тоже были вроде... просто не смотрите как там окошки реализованы) у сайпреса для этой м/с свой драйвер есть, а так же интерфейсная библиотека через которую все работают. CyAPI - как раз от библиотеки.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #5 : 28-02-2013 12:24 » |
|
Shakesbeer, примеры там тоже были вроде... просто не смотрите как там окошки реализованы) у сайпреса для этой м/с свой драйвер есть, а так же интерфейсная библиотека через которую все работают. CyAPI - как раз от библиотеки.
Кстати с CyAPI до какой скорости передачи данных можно дойти?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #6 : 28-02-2013 14:14 » |
|
понятия не имею, кажется народ на их форуме писал что 42мбайт получалось, но это с чужих слов. у меня получилось на своем драйвере 48мбайт. что есть 80% от 480мбит. граница довольно четкая.
|
|
« Последнее редактирование: 28-02-2013 14:17 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
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
|
|
« Ответ #8 : 01-03-2013 15:43 » |
|
а в чем конкретно проблема? вы SDK смотрели?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #9 : 12-03-2013 13:12 » |
|
Привет всем. кто-нибудь может помочь в таком вопросе. в общем необходимо на CY7C68013 в Билдере написать интерфейс usb для обмена данными? может быть у кого нибудь есть какие нибудь уже файлы, для обмена данными. а то сам не знаком с usb в принципе. есть только эта библиотека CyAPI и не очень понятно, что нужно использовать в программе. Жду ответа...
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #10 : 12-03-2013 15:29 » |
|
см. ответы выше)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #11 : 14-03-2013 13:52 » |
|
а как нужно настроить cyusb.inf файл?
Добавлено через 48 минут и 1 секунду: А что делать если я установил драйвер, система видит плату, но пишет что она работает неверно и в диспетчере устройств имеет воскл знак?
Добавлено через 2 часа, 2 минуты и 54 секунды: А что делать если я установил драйвер, система видит плату, но пишет что она работает неверно и в диспетчере устройств имеет воскл знак?
|
|
« Последнее редактирование: 14-03-2013 16:43 от xenetron »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #12 : 14-03-2013 17:02 » |
|
1. поменять в inf - девайс и вендор ID соответственно вашему устройству. (см свойства обнаруженного устройства в дереве устройств) 2. посмотреть код ошибки установки драйвера. там же.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #13 : 18-03-2013 11:51 » |
|
а в чем конкретно проблема?
Просто хочется увидеть рабочий пример и от него отталкиваться) И хочу спросить: верно ли написаны функции, которые я выложил ранее? Потому что собрать из них что-то дельное не получается, появляются ошибки.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #14 : 18-03-2013 13:28 » |
|
увы, примеры только те, которые шли в SDK...
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #15 : 18-03-2013 13:55 » |
|
увы, примеры только те, которые шли в SDK...
Разбирался с CyAPI из Cypress Suite USB 3.4.7. Не смог понять где конкретно описывается считывание данных) Если есть возможность - объясните.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #16 : 18-03-2013 14:20 » |
|
Cypress Suite USB 3.4.4\CyAPI\examples\cybulk\BulkLoopDlg.cpp функция XferLoop() Добавлено через 4 минуты и 21 секунду:в частности, запрос в два ендпоинта, ожидание 2 сек, проверка статуса. 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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
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
|
|
« Ответ #18 : 18-03-2013 14:33 » |
|
где выдает?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #19 : 18-03-2013 14:36 » |
|
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
|
|
« Ответ #20 : 18-03-2013 14:40 » |
|
вроде похоже. я не смотрел доку)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #21 : 18-03-2013 14:43 » |
|
вроде похоже. я не смотрел доку)
Попробую пока в bulkLoopDlg покопаться)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #22 : 18-03-2013 14:46 » |
|
endpoints_count - чему равен?
Добавлено через 40 секунд: проверка на то что s_in_fifo_endpoint вообще какой то существует - где?
|
|
« Последнее редактирование: 18-03-2013 14:46 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #23 : 18-03-2013 14:51 » |
|
endpoints_count - чему равен?
Добавлено через 40 секунд: проверка на то что s_in_fifo_endpoint вообще какой то существует - где?
Задается в ф-ции void* usb_init(void) int endpoints_count = s_usb_device->EndPointCount(); проверка на то что s_in_fifo_endpoint вообще какой то существует - где? То-есть банально сравнить с нулевым значением и отменять дальнейшее выполнение, если < 1?
|
|
« Последнее редактирование: 18-03-2013 14:54 от Shakesbeer »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #24 : 18-03-2013 16:10 » |
|
endpoints_count - чему равен после ЭТОГО присвоения?! s_in_fifo_endpoint - блоки кода где происходит проверка и присвоение - вообще выполняется или нет?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #25 : 19-03-2013 09:13 » |
|
endpoints_count - чему равен после ЭТОГО присвоения?! s_in_fifo_endpoint - блоки кода где происходит проверка и присвоение - вообще выполняется или нет?
Я так понял он запрашивает у Cypressa: // 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
|
|
« Ответ #26 : 19-03-2013 09:46 » |
|
да хоть мессаджбокс! откуда вы знаете, что endpoints_count вообще не вернулся равным нулю, к примеру? и что цикл for (i=1; i<endpoints_count; i++) вообще имел место быть и выполнятся?! что указатели вообще присваивались?!!! вообще у вас принято возвращаемые значения на валидность проверять?! *ругаюсь страшно, и брюзжу*)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #27 : 19-03-2013 10:30 » |
|
да хоть мессаджбокс! откуда вы знаете, что endpoints_count вообще не вернулся равным нулю, к примеру? и что цикл for (i=1; i<endpoints_count; i++) вообще имел место быть и выполнятся?! что указатели вообще присваивались?!!! вообще у вас принято возвращаемые значения на валидность проверять?! *ругаюсь страшно, и брюзжу*)
Вы оказались абсолютно правы, попросту не задан endpoint: 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 ведь? Нашел ещё один вариант интересный, но никак не разберусь что писать дальше: 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
|
|
« Ответ #28 : 19-03-2013 15:43 » |
|
уже почти рыдаю проверяйте почему он не задан в usb_init()
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #29 : 21-03-2013 11:42 » |
|
Просто не понимаю почему в данном случае все параметры EP выводит нормально: 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 »
|
Записан
|
|
|
|
|