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

 
 
> Cypress CyAPI, ---
uranium13
сообщение Sep 11 2010, 06:36
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 11-09-10
Пользователь №: 59 425



Видел похожая тема была для BORLAND'a

Я использую MS VS 2008 (MFC) и хотелось бы подключить CyAPI библиотеку

CCyUSBDevice *USBDevice;

USBDevice = new CCyUSBDevice();

и на этом возникает ошибка компоновки

"ссылка на неразрешенный внешний символ "public: __thiscall CCyUSBDevice::CCyUSBDevice(void *,struct _GUID,int)"

Как эту проблему можно для MSVS решить?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 19)
uranium13
сообщение Sep 11 2010, 08:03
Сообщение #2





Группа: Новичок
Сообщений: 6
Регистрация: 11-09-10
Пользователь №: 59 425



Проблема решена

скачал более новую библиотеку

ps кому-то приходилось работать с этим устройством на vc++ ?



Сообщение отредактировал uranium13 - Sep 11 2010, 08:04
Go to the top of the page
 
+Quote Post
jur
сообщение Sep 16 2010, 10:07
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(uranium13 @ Sep 11 2010, 11:03) *
ps кому-то приходилось работать с этим устройством на vc++ ?

Я с ним уже довольно давно работаю (чип CY7C68013). Если вопрос не очень сложный - могу попробовать помочь.


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
leva87
сообщение Sep 16 2010, 18:20
Сообщение #4





Группа: Участник
Сообщений: 12
Регистрация: 11-05-08
Пользователь №: 37 409



Я работаю с этим чипом могу помочь)
Go to the top of the page
 
+Quote Post
Sh@dow
сообщение Sep 18 2010, 13:06
Сообщение #5


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

Группа: Участник
Сообщений: 107
Регистрация: 12-03-07
Пользователь №: 26 065



Возникла необходимость использовать драйвер в visual studio 6.0. От CyAPI отказался так как она собрана так что под VS6.0 не линкуется.Пришлось работать с драйвером через DeviceIoControl.
Есть один ньюанс который мне не ясен он кстате и для CyAPI актуален.После загрузки хекса надо делать реинициализацию драйвера.Тоесть заново получать новый хэндл.Я заметил что это занимает время.Тоесть в программе необходима задержка.Не совсем понятно какое врремя устанавливать.
Кто сталкивался?

Время я установил 5000ms.Все работает.Только в доках про это не слово это и напрягает.
Go to the top of the page
 
+Quote Post
uranium13
сообщение Sep 18 2010, 17:32
Сообщение #6





Группа: Новичок
Сообщений: 6
Регистрация: 11-09-10
Пользователь №: 59 425



Как вы реализуете ф-цию чтения?

я хотел бы вынести её в отдельный поток

bool CSomeDlg::Read(UCHAR *buf, LONG buflen) {

InEndpt->TimeOut = 2000;
return InEndpt->XferData(buf,buflen);
}


но InEndpt - это указатель и в потоке компилятор выдаёт ошибку

ps "После загрузки хекса надо делать реинициализацию драйвера.Тоесть заново получать новый хэндл." простите меня, новичка, но какой хэндл всё время приходится получать? Я всё делал по примеру и после открытия IsOpen() возвращает true пока не отключишь железо от ПК даже после закрытия\открытия программы
Go to the top of the page
 
+Quote Post
Sh@dow
сообщение Sep 18 2010, 17:50
Сообщение #7


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

Группа: Участник
Сообщений: 107
Регистрация: 12-03-07
Пользователь №: 26 065



>>Как вы реализуете ф-цию чтения?
Функция чтения и записи выполняются в отдельном потоке.
>>но InEndpt - это указатель и в потоке компилятор выдаёт ошибку
В вашем примере ошибка. Вы не определяете InEndpt переменную. Если она у вас определяется в основном потоке то дочерний поток к ней обратиться не сможет однако можно ее передать дочернему потоку как параметр при запуске дочернего потока.
>>простите меня, новичка, но какой хэндл всё время приходится получать?
Хэндл драйвера.В вашем случае это HANDLE CCyUSBDevice::DeviceHandle(void)
>>Я всё делал по примеру и после открытия IsOpen() возвращает true пока не отключишь железо от ПК даже после закрытия\открытия программы
Все верно. Попробуйте загрузить прошивку в чип и прочитать новые параметры.Например новое количество эндпоинтов. У меня после загрузки прошивки оно не меняется,только после реинициализации я получаю обновленное значение.
Go to the top of the page
 
+Quote Post
jur
сообщение Sep 20 2010, 06:23
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(Sh@dow @ Sep 18 2010, 16:06) *
Возникла необходимость использовать драйвер в visual studio 6.0. От CyAPI отказался так как она собрана так что под VS6.0 не линкуется.Пришлось работать с драйвером через DeviceIoControl.

Хм... Весьма странно... Ведь их родной пример "BulkLoop" содержит незабвенные BulkLoop.dsp и BulkLoop.dsw. А чего линкер пишет? Может ему просто какого-то флага не хватает?

Насколько помнится, я просто взял их пример "Streamer", скомпилировал, запустил, убедился, что все работает. А потом на его основе написал свою DLL-ку считывания данных (и вообще всей необходимой работы с USB). Думается, что на первом этапе стоило бы скомпилировать их собственный пример ("BulkLoop" или "Streamer"). Если это сработает, то можно пробовать локализовать проблему.

А CyAPI штука очень удобная и весьма надежная.

Цитата(uranium13 @ Sep 18 2010, 20:32) *
Как вы реализуете ф-цию чтения?

я хотел бы вынести её в отдельный поток

Правильно, именно в отдельном потоке ее и следует реализовывать. Тут я поступил просто - завел глобальные переменные, которые инициализируются при старте моей 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, прием данных и т.п. Думается, эту ветку было бы тоже полезно почитать.


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
Sh@dow
сообщение Sep 20 2010, 17:50
Сообщение #9


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

Группа: Участник
Сообщений: 107
Регистрация: 12-03-07
Пользователь №: 26 065



>>Ведь их родной пример "BulkLoop" содержит незабвенные BulkLoop.dsp и BulkLoop.dsw
Спасибо за наводку.Проверю.
>>А CyAPI штука очень удобная и весьма надежная

Что меня смутило так это то что коннект к девайсу происходит в конструкторе.
USBDevice* dev = new USBDEvice()
делать в конструкторе такие вещи нельзя.Конструктор возвращать значения не может поэтому если коннект обломится то как программа это узнает?

>>Что касается закрытия драйвера
Собственно закрыть драйвер не проблема. В случае CyAPI это delete USBDevice,деструктор класса сам вызывает функцию Close.
В случае управления через DeviceIoControl это CloseHandle();

jur, Вы загружали прошивку в контроллер? Дело в том что после загрузки и сброса контроллер в системе идентифицируется по новым PID/VID и поэтому должен быть переинициализирован. Мне надо программно определить проинициализировался ли драйвер или нет если нет то программа ждет когда проинициализируется и дальше работает с новым устройством.

>>Еще вот тут "CY7C680013A Киньте ссылкой на софт и лит-ру" мы обсуждали вопросы работы с CyAPI, прием данных и т.п. Думается, эту ветку было бы тоже полезно почитать.

Спасибо.Актуально.
Go to the top of the page
 
+Quote Post
jur
сообщение Sep 21 2010, 06:01
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(Sh@dow @ Sep 20 2010, 20:50) *
>>А 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 - адреса моих эндпойнтов. Таким образом я точно знаю, что мое устройство присоединено (или нет в случае ошибки).

Цитата(Sh@dow @ Sep 20 2010, 20:50) *
>>Что касается закрытия драйвера
Собственно закрыть драйвер не проблема. В случае CyAPI это delete USBDevice,деструктор класса сам вызывает функцию Close.
В случае управления через DeviceIoControl это CloseHandle();

Там все гораздо хуже. К примеру, сначала я попробовал закрывать устройство в DllMain по приходу DLL_PROCESS_DETACH. Не закрывается ни фига. Тогда я вынужден был в основной программе по WM_DESTROY вызывать экспортированную функцию "Close". В общем-то не смертельно, но неудобно, если отлаживаешь программу. Ты ее остановил - а она, соответственно, не вызвала "Close" и привет, программа и не жива, и не мертва :-)

Цитата(Sh@dow @ Sep 20 2010, 20:50) *
jur, Вы загружали прошивку в контроллер? Дело в том что после загрузки и сброса контроллер в системе идентифицируется по новым PID/VID и поэтому должен быть переинициализирован. Мне надо программно определить проинициализировался ли драйвер или нет если нет то программа ждет когда проинициализируется и дальше работает с новым устройством.

Тут у меня опыта нет. Хотелось бы, конечно, разобраться с этим вопросом, но все как-то руки не доходят... Я пробовал в "CyConsole.exe" рестартовать устройство, или его ресетить, но у меня не получилось, чтобы оно снова ренумерировалось и нормально работало. Плюнул и записал фирмваре в EEPROM-ку :-) Коллега, если получится - пожалуйста дайте знать! (Давай на "ты"?) Думаю, что многим участникам этот вопрос будет интересным.

Или, может быть, кто-то из участников обсуждения освоил этот прием? Поделитесь опытом, пожалуйста!


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
uranium13
сообщение Sep 21 2010, 08:15
Сообщение #11





Группа: Новичок
Сообщений: 6
Регистрация: 11-09-10
Пользователь №: 59 425



спасибо за ответы, я накидал простенькую програмку чтения АЦП, подключил батарейку (4.5В через 10к резистор) и наблюдаю небольшой величины пульсации (см рис). Может знаете с чем это связанно?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
jur
сообщение Sep 21 2010, 13:15
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(uranium13 @ Sep 21 2010, 11:15) *
спасибо за ответы, я накидал простенькую програмку чтения АЦП, подключил батарейку (4.5В через 10к резистор) и наблюдаю небольшой величины пульсации (см рис). Может знаете с чем это связанно?

Это те, что с 8.5 секунды и по 21-ю? Полагаю, что наводки. Тут может быть столько причин, что и не объять :-) И вообще, АЦП рядом с цифрой - сложная смесь, я в этом деле слабый помошник...


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
Sh@dow
сообщение Sep 21 2010, 14:07
Сообщение #13


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

Группа: Участник
Сообщений: 107
Регистрация: 12-03-07
Пользователь №: 26 065



>>Я пробовал в "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);

}

Go to the top of the page
 
+Quote Post
jur
сообщение Sep 22 2010, 18:36
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(Sh@dow @ Sep 21 2010, 17:07) *
Как ты загружал? Я в консоли делал Select Monitor->выбрал хекс файл->Load Monitor.
Все загрузилось.
Я увидел новые PID/VID в USBView (это прога у микрософта есть бесплатна).
Ты прогой этой после загрузки посмотри там все параметры девайса выдаются.

Большое спасибо за подсказку! Это у меня, балды, не получалось тут же увидеть результат потому, что я записывал EEPROM-ку :-) На меня, видать, какое-то затмение нашло... Когда я загрузил HEX-файл своего фирмваре - конечно, все нормально. Вот ведь как бывает...

Большое спасибо!


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
uranium13
сообщение Sep 23 2010, 04:58
Сообщение #15





Группа: Новичок
Сообщений: 6
Регистрация: 11-09-10
Пользователь №: 59 425



От какого источника ваши девайсы питаются? От USB или от чего-то внешнего?

Go to the top of the page
 
+Quote Post
jur
сообщение Sep 23 2010, 18:17
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(uranium13 @ Sep 23 2010, 07:58) *
От какого источника ваши девайсы питаются? От USB или от чего-то внешнего?

Вообще-то это без разницы. В приборе имеется свое питание (конечно, ведь прибор большой), но когда я просто разрабатываю/отлаживаю программу, весь прибор мне не нужен. Тогда я беру только небольшой узел USB и запитываю его прямо от шины (а в программе включаю виртуальный режим, который заменяет реальные данные тестовыми).


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
uranium13
сообщение Sep 24 2010, 16:09
Сообщение #17





Группа: Новичок
Сообщений: 6
Регистрация: 11-09-10
Пользователь №: 59 425



Дело в том, что у меня при подключении к одному порту USB устройство (АЦП+усилитель+мультиплексор) даёт погрешность ~0.2 В, а при подключении к другому порту погрешности нет

+ если мой ноутбук работает не от своей батареи, а от сети, то появляется ужасный высокочастотный шум на выходе АЦП

Go to the top of the page
 
+Quote Post
jur
сообщение Sep 27 2010, 15:27
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704



Цитата(uranium13 @ Sep 24 2010, 19:09) *
Дело в том, что у меня при подключении к одному порту USB устройство (АЦП+усилитель+мультиплексор) даёт погрешность ~0.2 В, а при подключении к другому порту погрешности нет

Складывается впечатление, что дело именно в питании...

Цитата(uranium13 @ Sep 24 2010, 19:09) *
+ если мой ноутбук работает не от своей батареи, а от сети, то появляется ужасный высокочастотный шум на выходе АЦП

Ох, эти наводки... На мой скромный IMHO, наводки, взаимовлияние аналог<->цифра - самый большой источник головной боли радиоинженера :-) Посоветовать тут можно немного. Вдумчивый подход к политике земель, развязке питания и большая порция удачи...


--------------------
MPEG-4 - в массы!
Go to the top of the page
 
+Quote Post
Sh@dow
сообщение Sep 30 2010, 06:11
Сообщение #19


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

Группа: Участник
Сообщений: 107
Регистрация: 12-03-07
Пользователь №: 26 065



Возникла потребность юзать сабж под x64,в частности под Windows 7.Под нее драйвер не подписан.Кто сталкивался?Слышал что подписка стоит окло 170евро в год.Это правда?

Сообщение отредактировал Sh@dow - Sep 30 2010, 06:11
Go to the top of the page
 
+Quote Post
alexkok
сообщение Sep 30 2010, 16:50
Сообщение #20


Знающий
****

Группа: Участник
Сообщений: 609
Регистрация: 3-03-07
Из: San Jose
Пользователь №: 25 837



Цитата(Sh@dow @ Sep 30 2010, 09:11) *
Возникла потребность юзать сабж под x64,в частности под Windows 7.Под нее драйвер не подписан.Кто сталкивался?Слышал что подписка стоит окло 170евро в год.Это правда?

Самое дешевое что я нашел, это COMODO, 166уе/год.
Я не покупал, только присматриваюсь к ценам.


--------------------
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 30th June 2025 - 08:19
Рейтинг@Mail.ru


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