uranium13 0 11 сентября, 2010 Опубликовано 11 сентября, 2010 · Жалоба Видел похожая тема была для BORLAND'a Я использую MS VS 2008 (MFC) и хотелось бы подключить CyAPI библиотеку CCyUSBDevice *USBDevice; USBDevice = new CCyUSBDevice(); и на этом возникает ошибка компоновки "ссылка на неразрешенный внешний символ "public: __thiscall CCyUSBDevice::CCyUSBDevice(void *,struct _GUID,int)" Как эту проблему можно для MSVS решить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium13 0 11 сентября, 2010 Опубликовано 11 сентября, 2010 (изменено) · Жалоба Проблема решена скачал более новую библиотеку ps кому-то приходилось работать с этим устройством на vc++ ? Изменено 11 сентября, 2010 пользователем uranium13 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jur 0 16 сентября, 2010 Опубликовано 16 сентября, 2010 · Жалоба ps кому-то приходилось работать с этим устройством на vc++ ? Я с ним уже довольно давно работаю (чип CY7C68013). Если вопрос не очень сложный - могу попробовать помочь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
leva87 0 16 сентября, 2010 Опубликовано 16 сентября, 2010 · Жалоба Я работаю с этим чипом могу помочь) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sh@dow 0 18 сентября, 2010 Опубликовано 18 сентября, 2010 · Жалоба Возникла необходимость использовать драйвер в visual studio 6.0. От CyAPI отказался так как она собрана так что под VS6.0 не линкуется.Пришлось работать с драйвером через DeviceIoControl. Есть один ньюанс который мне не ясен он кстате и для CyAPI актуален.После загрузки хекса надо делать реинициализацию драйвера.Тоесть заново получать новый хэндл.Я заметил что это занимает время.Тоесть в программе необходима задержка.Не совсем понятно какое врремя устанавливать. Кто сталкивался? Время я установил 5000ms.Все работает.Только в доках про это не слово это и напрягает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium13 0 18 сентября, 2010 Опубликовано 18 сентября, 2010 · Жалоба Как вы реализуете ф-цию чтения? я хотел бы вынести её в отдельный поток bool CSomeDlg::Read(UCHAR *buf, LONG buflen) { InEndpt->TimeOut = 2000; return InEndpt->XferData(buf,buflen); } но InEndpt - это указатель и в потоке компилятор выдаёт ошибку ps "После загрузки хекса надо делать реинициализацию драйвера.Тоесть заново получать новый хэндл." простите меня, новичка, но какой хэндл всё время приходится получать? Я всё делал по примеру и после открытия IsOpen() возвращает true пока не отключишь железо от ПК даже после закрытия\открытия программы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sh@dow 0 18 сентября, 2010 Опубликовано 18 сентября, 2010 · Жалоба >>Как вы реализуете ф-цию чтения? Функция чтения и записи выполняются в отдельном потоке. >>но InEndpt - это указатель и в потоке компилятор выдаёт ошибку В вашем примере ошибка. Вы не определяете InEndpt переменную. Если она у вас определяется в основном потоке то дочерний поток к ней обратиться не сможет однако можно ее передать дочернему потоку как параметр при запуске дочернего потока. >>простите меня, новичка, но какой хэндл всё время приходится получать? Хэндл драйвера.В вашем случае это HANDLE CCyUSBDevice::DeviceHandle(void) >>Я всё делал по примеру и после открытия IsOpen() возвращает true пока не отключишь железо от ПК даже после закрытия\открытия программы Все верно. Попробуйте загрузить прошивку в чип и прочитать новые параметры.Например новое количество эндпоинтов. У меня после загрузки прошивки оно не меняется,только после реинициализации я получаю обновленное значение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jur 0 20 сентября, 2010 Опубликовано 20 сентября, 2010 · Жалоба Возникла необходимость использовать драйвер в visual studio 6.0. От CyAPI отказался так как она собрана так что под VS6.0 не линкуется.Пришлось работать с драйвером через DeviceIoControl. Хм... Весьма странно... Ведь их родной пример "BulkLoop" содержит незабвенные BulkLoop.dsp и BulkLoop.dsw. А чего линкер пишет? Может ему просто какого-то флага не хватает? Насколько помнится, я просто взял их пример "Streamer", скомпилировал, запустил, убедился, что все работает. А потом на его основе написал свою DLL-ку считывания данных (и вообще всей необходимой работы с USB). Думается, что на первом этапе стоило бы скомпилировать их собственный пример ("BulkLoop" или "Streamer"). Если это сработает, то можно пробовать локализовать проблему. А CyAPI штука очень удобная и весьма надежная. Как вы реализуете ф-цию чтения? я хотел бы вынести её в отдельный поток Правильно, именно в отдельном потоке ее и следует реализовывать. Тут я поступил просто - завел глобальные переменные, которые инициализируются при старте моей DLL-ки (точнее, при вызове основной программой ее функции "Init"): CCyUSBDevice* pUSBDevice = NULL; CCyUSBEndPoint* pControlOutEndpt = NULL; CCyUSBEndPoint* pControlInEndpt = NULL; CCyUSBEndPoint* pUsDataInEndpt = NULL; CCyUSBEndPoint* pCfmDataInEndpt = NULL; CCyUSBEndPoint* pEp1OutEndpt = NULL; CCyUSBEndPoint* pEp1InEndpt = NULL; А в потоке просто обращаюсь по этим указателям, например: // Queue-up the first batch of transfer requests for (int i = 0; i < QUEUE_SIZE; i++) contexts[i] = pUsDataInEndpt->BeginDataXfer(buffers[i], len, &inOvLap[i]); Что касается закрытия драйвера. Я сначала попробовал сделать его закрытие (путем SAFE_DELETE(pUSBDevice);) в DllMain по приходу DLL_PROCESS_DETACH. А ни фига! Не работает. Тогда я экспортировал функцию "Close", которую вызывает моя программа при завершении работы. А USB-шный драйвер - "Штука конисская!" © :-) Не закроешь его - и привет, процесс останется висеть в системе, "без окон, без дверей ...". И убить его можно только отключением железа. Как решить эту проблему - я пока не знаю. Еще вот тут "CY7C680013A Киньте ссылкой на софт и лит-ру" мы обсуждали вопросы работы с CyAPI, прием данных и т.п. Думается, эту ветку было бы тоже полезно почитать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sh@dow 0 20 сентября, 2010 Опубликовано 20 сентября, 2010 · Жалоба >>Ведь их родной пример "BulkLoop" содержит незабвенные BulkLoop.dsp и BulkLoop.dsw Спасибо за наводку.Проверю. >>А CyAPI штука очень удобная и весьма надежная Что меня смутило так это то что коннект к девайсу происходит в конструкторе. USBDevice* dev = new USBDEvice() делать в конструкторе такие вещи нельзя.Конструктор возвращать значения не может поэтому если коннект обломится то как программа это узнает? >>Что касается закрытия драйвера Собственно закрыть драйвер не проблема. В случае CyAPI это delete USBDevice,деструктор класса сам вызывает функцию Close. В случае управления через DeviceIoControl это CloseHandle(); jur, Вы загружали прошивку в контроллер? Дело в том что после загрузки и сброса контроллер в системе идентифицируется по новым PID/VID и поэтому должен быть переинициализирован. Мне надо программно определить проинициализировался ли драйвер или нет если нет то программа ждет когда проинициализируется и дальше работает с новым устройством. >>Еще вот тут "CY7C680013A Киньте ссылкой на софт и лит-ру" мы обсуждали вопросы работы с CyAPI, прием данных и т.п. Думается, эту ветку было бы тоже полезно почитать. Спасибо.Актуально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jur 0 21 сентября, 2010 Опубликовано 21 сентября, 2010 · Жалоба >>А CyAPI штука очень удобная и весьма надежная Что меня смутило так это то что коннект к девайсу происходит в конструкторе. USBDevice* dev = new USBDEvice() делать в конструкторе такие вещи нельзя.Конструктор возвращать значения не может поэтому если коннект обломится то как программа это узнает? Это не совсем так. (Прошу прощения, я проиллюстрирую свои слова кодом, может немножко обширным.) Вот фрагмент моей функции инициализации. Параметр "hWnd" можно не использовать (я использую только для того, чтобы смотреть присоединение/отсоединение девайсов, по большому счету мне это нафик не нужно :-) Сделал просто так, для общего развития). pUSBDevice = new CCyUSBDevice(hWnd); // Create an instance of CCyUSBDevice if(pUSBDevice == NULL) { ERR_MSG(" Can't create USBDevice "); return SLE901ERR_USB_DEVICE_NOT_EXIST; } else { Scusb_VID = scusb_VID; Scusb_PID = scusb_PID; scan_devices(); { if(pEp1OutEndpt && pEp1InEndpt) { sprintf_s(s,"%s: EP1 present, EP1 OUT = 0x%02X EP1 IN = 0x%02X\r\n",module, SCUSB_ENDPOINT_EP1_OUT, SCUSB_ENDPOINT_EP1_IN); } else { sprintf_s(s,"%s: EP1 not present\r\n",module); } UtilsR1_force_protocol_str(s); } if(!pUSBDevice->IsOpen()) { return SLE901ERR_USB_DEVICE_NOT_OPENED; } if(!pControlOutEndpt) { return SLE901ERR_CONTROL_OUT_ENDPOINT_NOT_EXIST; } if(!pControlInEndpt) { return SLE901ERR_CONTROL_IN_ENDPOINT_NOT_EXIST; } ... и т.д. по всем моим ендпойнтам Здесь после создания объекта устройства USB вызывается функция "scan_devices();", которая как раз и опрашивает все девайсы, пока не найдет мой. Вот ее код: void scan_devices() { if(pUSBDevice == NULL) { ERR_MSG("scan_devices: USBDevice not exist"); return; // We don't have USB device object! } int devices = pUSBDevice->DeviceCount(); int vID = 0, pID = 0; int d = 0; while (d < devices ) { pUSBDevice->Open(d); // Open automatically calls Close( ) if necessary vID = pUSBDevice->VendorID; pID = pUSBDevice->ProductID; if ((vID == Scusb_VID) && (pID == Scusb_PID)) break; d++; } if ((vID == Scusb_VID) && (pID == Scusb_PID)) { int epts = pUSBDevice->EndPointCount(); CCyUSBEndPoint *endpt; for (int i = 1; i < epts; i++) { // Skip endpoint 0, which we know is the Control Endpoint endpt = pUSBDevice->EndPoints[i]; if (endpt->Attributes == 2) { // Bulk switch(endpt->Address) { case SCUSB_ENDPOINT_CONTROL_OUT: pControlOutEndpt = endpt; break; case SCUSB_ENDPOINT_CONTROL_IN: pControlInEndpt = endpt; break; case SCUSB_ENDPOINT_US_DATA_IN: pUsDataInEndpt = endpt; break; case SCUSB_ENDPOINT_CFM_DATA_IN: pCfmDataInEndpt = endpt; break; case SCUSB_ENDPOINT_EP1_OUT: pEp1OutEndpt = endpt; break; case SCUSB_ENDPOINT_EP1_IN: pEp1InEndpt = endpt; break; } } } } else { pUSBDevice->Close(); } } Здесь Scusb_VID/Scusb_PID - коды моего устройства, а SCUSB_ENDPOINT_xxx - адреса моих эндпойнтов. Таким образом я точно знаю, что мое устройство присоединено (или нет в случае ошибки). >>Что касается закрытия драйвера Собственно закрыть драйвер не проблема. В случае CyAPI это delete USBDevice,деструктор класса сам вызывает функцию Close. В случае управления через DeviceIoControl это CloseHandle(); Там все гораздо хуже. К примеру, сначала я попробовал закрывать устройство в DllMain по приходу DLL_PROCESS_DETACH. Не закрывается ни фига. Тогда я вынужден был в основной программе по WM_DESTROY вызывать экспортированную функцию "Close". В общем-то не смертельно, но неудобно, если отлаживаешь программу. Ты ее остановил - а она, соответственно, не вызвала "Close" и привет, программа и не жива, и не мертва :-) jur, Вы загружали прошивку в контроллер? Дело в том что после загрузки и сброса контроллер в системе идентифицируется по новым PID/VID и поэтому должен быть переинициализирован. Мне надо программно определить проинициализировался ли драйвер или нет если нет то программа ждет когда проинициализируется и дальше работает с новым устройством. Тут у меня опыта нет. Хотелось бы, конечно, разобраться с этим вопросом, но все как-то руки не доходят... Я пробовал в "CyConsole.exe" рестартовать устройство, или его ресетить, но у меня не получилось, чтобы оно снова ренумерировалось и нормально работало. Плюнул и записал фирмваре в EEPROM-ку :-) Коллега, если получится - пожалуйста дайте знать! (Давай на "ты"?) Думаю, что многим участникам этот вопрос будет интересным. Или, может быть, кто-то из участников обсуждения освоил этот прием? Поделитесь опытом, пожалуйста! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium13 0 21 сентября, 2010 Опубликовано 21 сентября, 2010 · Жалоба спасибо за ответы, я накидал простенькую програмку чтения АЦП, подключил батарейку (4.5В через 10к резистор) и наблюдаю небольшой величины пульсации (см рис). Может знаете с чем это связанно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jur 0 21 сентября, 2010 Опубликовано 21 сентября, 2010 · Жалоба спасибо за ответы, я накидал простенькую програмку чтения АЦП, подключил батарейку (4.5В через 10к резистор) и наблюдаю небольшой величины пульсации (см рис). Может знаете с чем это связанно? Это те, что с 8.5 секунды и по 21-ю? Полагаю, что наводки. Тут может быть столько причин, что и не объять :-) И вообще, АЦП рядом с цифрой - сложная смесь, я в этом деле слабый помошник... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sh@dow 0 21 сентября, 2010 Опубликовано 21 сентября, 2010 · Жалоба >>Я пробовал в "CyConsole.exe" рестартовать устройство, или его ресетить, но у меня не получилось, чтобы оно снова ренумерировалось и нормально работало Как ты загружал? Я в консоли делал Select Monitor->выбрал хекс файл->Load Monitor. Все загрузилось. Я увидел новые PID/VID в USBView (это прога у микрософта есть бесплатна). Ты прогой этой после загрузки посмотри там все параметры девайса выдаются. Программно хекс гружу так void USBIO32::LoadHexFile(wchar_t* filename) { //reset and hold Reset(true); HANDLE hex = CreateFile(filename,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if(hex == 0) { MessageBox(0,L"Failed to open file",L"Error",MB_OK); return; } int len = 0; int offset = 0; int type = 0; char code[9]; char data[2]; UCHAR decoded[40]; DWORD nbr = 0; while(true) { ReadFile(hex,&code,9,&nbr,0); if((nbr!=9)||(code[0]!=':')) { MessageBox(0,L"Invalid hex file",L"Error",MB_OK); return; } len = GetCode(code+1,2); offset = GetCode(code+3,4); type = GetCode(code+7,2); if(len<=0) break; if(len>40) { MessageBox(0,L"Hex data record is too long",L"Error",MB_OK); return; } for(int i=0;i<len;++i) { ReadFile(hex,data,2,&nbr,0); if(nbr!=2) { MessageBox(0,L"Error reading hex data",L"Error",MB_OK); return; } decoded[i] = GetCode(data,2); } //sending data to device cendp->ReqCode = 0xA0; cendp->Index = 0; cendp->Value = offset; LONG length = len; cendp->Write(decoded,length); //DoControlTransfer(decoded,len,offset); ReadFile(hex,code,4,&nbr,0); if(nbr!=4) { MessageBox(0,L"Failed to read checksum",L"Error",MB_OK); return; } } //reset and run Reset(false); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jur 0 22 сентября, 2010 Опубликовано 22 сентября, 2010 · Жалоба Как ты загружал? Я в консоли делал Select Monitor->выбрал хекс файл->Load Monitor. Все загрузилось. Я увидел новые PID/VID в USBView (это прога у микрософта есть бесплатна). Ты прогой этой после загрузки посмотри там все параметры девайса выдаются. Большое спасибо за подсказку! Это у меня, балды, не получалось тут же увидеть результат потому, что я записывал EEPROM-ку :-) На меня, видать, какое-то затмение нашло... Когда я загрузил HEX-файл своего фирмваре - конечно, все нормально. Вот ведь как бывает... Большое спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium13 0 23 сентября, 2010 Опубликовано 23 сентября, 2010 · Жалоба От какого источника ваши девайсы питаются? От USB или от чего-то внешнего? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться