Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема USB cy7c68013a
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
леха_настойчивый
Здавствуйте люди!

Подскажите кто может, в чем проблема при выделении пямяти под структуру СyUSBdevice
уже месяц бьюсь, не пойму в чем дело. СТУДИЯ видит устройство (су7с68013а)
данные передаються и принимаються, я подключил библиотеку СYUsb.Lib , СYUsb.h
к проекту, компилируеться нормально, но на строке
s_usb_device = new CCyUSBDevice();------ сообщение
"Access vilation at address 004048e1 in module "Project1" write address 0017f62c"
Заранее благодарен, Алексей.

Код

c++ Bulder

void* usb_init(void)
{
    int i = 2;
CCyUSBDevice*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
        return NULL;
    }

    if (!s_usb_device->IsOpen()) {
        // Could not open my device
        return NULL;
    }

    delete s_usb_device;

  }
Warlord
Звезду убери
Код
CCyUSBDevice s_usb_device = new CCyUSBDevice();
леха_настойчивый
Цитата(Warlord @ Sep 11 2007, 09:18) *
Звезду убери
Код
CCyUSBDevice s_usb_device = new CCyUSBDevice();



Не помогает, все также, вот только при пошаговом исполнении, если просмотреть debug inspect переменную s_usb_device, до исполнения строки
Код

CCyUSBDevice s_usb_device = new CCyUSBDevice()


поля настроек стали заполнеными, а раньше были не определены, может я что не определил
перед выделением памяти под CYUsbdevice???
Warlord
Да, со звездой я погорячился. Попробуй вынести переменную в глобальные. А потом вызвать конструктор.
Код
CCyUSBDevice *USBDevice;

main()
{
...
   USBDevice = new CCyUSBDevice();
....
}
леха_настойчивый
Цитата(Warlord @ Sep 12 2007, 10:59) *
Да, со звездой я погорячился. Попробуй вынести переменную в глобальные. А потом вызвать конструктор.
Код
CCyUSBDevice *USBDevice;

main()
{
...
   USBDevice = new CCyUSBDevice();
....
}


Вот пример того что я пытался запустить
Код

#include <vcl.h>
#pragma hdrstop
#include "CyAPI.h"

//---------------------------------------------------------------------------

#pragma argsused
CCyUSBDevice *USBDevice;

int main(int argc, char* argv[])
{

USBDevice = new CCyUSBDevice();

int devices = USBDevice->DeviceCount();
int vID, pID;
int d = 0;
do
{
USBDevice->Open(d); // Open automatically calls Close() if necessary
vID = USBDevice->VendorID;
pID = USBDevice->ProductID;
d++;
} while ((d < devices ) && (vID != 0x04b4) && (pID != 0x8613));

return 0;
}


пример взят из документации по CYUSB
На строке USBDevice = new CCyUSBDevice(); машина начинает сильно тормозить, но сообщений никаких нет?
раньше я использовал с FT245 -- ot FTDI а сейчас понадобился поток 8 Мбайт/сек

Мне кажеться что чего-то не хватает для связи с драйвером CYUSB
Я пробовал найти устройство через
QueryDosDevice(NULL, path, PATH_SIZE);
Устройсво есть но почему то 2 шт, с разными GUID???

А для чего эта функция "DeviceIoControl("???
Спасибо за ответ!!
Warlord
Цитата(леха_настойчивый @ Sep 12 2007, 14:01) *
На строке USBDevice = new CCyUSBDevice(); машина начинает сильно тормозить, но сообщений никаких нет?

Странно, а строка в конечном итоге проходит или нет??

Цитата(леха_настойчивый @ Sep 12 2007, 14:01) *
Мне кажеться что чего-то не хватает для связи с драйвером CYUSB
Я пробовал найти устройство через
QueryDosDevice(NULL, path, PATH_SIZE);
Устройсво есть но почему то 2 шт, с разными GUID???

Ты глянь в системе, железо нормально встало?? драйвер подключился?? Драйвер CyUSB.sys??
Ты GUID часом не менял в инф файле при установке драйвера??
по QueryDosDevice нчего не скажу, не пользовался.

Цитата(леха_настойчивый @ Sep 12 2007, 14:01) *
А для чего эта функция "DeviceIoControl("???

Посылает пакет драйверу устройства.
леха_настойчивый
Цитата(Warlord @ Sep 12 2007, 13:57) *
Странно, а строка в конечном итоге проходит или нет??
Ты глянь в системе, железо нормально встало?? драйвер подключился?? Драйвер CyUSB.sys??
Ты GUID часом не менял в инф файле при установке драйвера??
по QueryDosDevice нчего не скажу, не пользовался.
Посылает пакет драйверу устройства.


Нет срока не проходит. Builder застрявает на ней, я подождал минутку, потом сбросил.
Нет, GUID я не менял, драйвер СyUSB.sus стал нормально.
USB studio купреса видит устойство, я взял за основу HEX из какогото примера
у немцев ADC2USB там был HEX и прошивка для ПЗУ, все залилось, устройство появляеться сразу как
CYPRESS2USB vid и pid 04в4 и 8613--- две точки Bulk -64 и isohronous 1020
все передаеться принимаеться (через USB студию cypress)
есть еще одна особенность :
при подключении к материнским платам ASrosk c чипом VIA 6202 контроллер сy7c68013 вообще не видиться системой, только если поставить на D- сопротивление 1,5 ком, тогда все видиться, и работает. А ВОТ к плате ASUS отлично, все как по книжке.
Может в кофигурации самого контроллера чото не так??
Warlord
Цитата(леха_настойчивый @ Sep 12 2007, 15:23) *
Может в кофигурации самого контроллера чото не так??

Это вряд ли, если, говоришь USB studio работает, то и твоя прога тоже будет. Ты войди в режим отладки(в самом билдере(CPU window) или лучше в стороннем) глянь, на какой функции конструктора класса прога начинает глючить. Глянь в отладчике как исполняется конструктор в USB studio. Все д.б. один в один. Сразу найдешь ошибку.
леха_настойчивый
Цитата(Warlord @ Sep 12 2007, 15:19) *
Это вряд ли, если, говоришь USB studio работает, то и твоя прога тоже будет. Ты войди в режим отладки(в самом билдере(CPU window) или лучше в стороннем) глянь, на какой функции конструктора класса прога начинает глючить. Глянь в отладчике как исполняется конструктор в USB studio. Все д.б. один в один. Сразу найдешь ошибку.

Да это идея, спасибо большое за совет, сейчас буду пробовать!!!
леха_настойчивый
Цитата(леха_настойчивый @ Sep 12 2007, 15:40) *
Да это идея, спасибо большое за совет, сейчас буду пробовать!!!


Привет всем!
Попробовал отладчиком, так вот мой проект очень похоже обращаеться к какой-то области памяти
и система выдает ошибку. До конструктора помоему дело и не доходит ???
Очень похоже на ошибку, корая возникает при нарушении границ массивов(я имею ввиду сообщение WINDOWS)
вот конфигурация USB и участок CPU viem ----переменной USBDevice.
Код
это конфигурация USB 1.1
(fullspeed)
через USBviem

Endpoint Descriptor:
bEndpointAddress:     0x82
Transfer Type: Isochronous
wMaxPacketSize:     0x03FC (1020)
bInterval:            0x01

Configuration Descriptor:
wTotalLength:       0x0029
bNumInterfaces:       0x01
bConfigurationValue:  0x01
iConfiguration:       0x03
0x0407: "Busversorgt, kein Aufwecken"
bmAttributes:         0x80 (Bus Powered )
MaxPower:             0x4B (150 Ma)

Interface Descriptor:
bInterfaceNumber:     0x00
bAlternateSetting:    0x00
bNumEndpoints:        0x01
bInterfaceClass:      0xFF
bInterfaceSubClass:   0xFF
bInterfaceProtocol:   0xFF
iInterface:           0x04
0x0407: "Interface ohne Bandbreite, nur Bulk"

Endpoint Descriptor:
bEndpointAddress:     0x82
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00

Interface Descriptor:
bInterfaceNumber:     0x00
bAlternateSetting:    0x01
bNumEndpoints:        0x01
bInterfaceClass:      0xFF
bInterfaceSubClass:   0xFF
bInterfaceProtocol:   0xFF
iInterface:           0x05

Endpoint Descriptor:
bEndpointAddress:     0x82
Transfer Type: Isochronous
wMaxPacketSize:     0x03FC (1020)
bInterval:            0x01

=====================================================================
Вот окно CPU viem

naemec_cosole.cpp.15: USBDevice = new CCyUSBDevice();///--break point
0040139C 689C090000       push $0000099c
004013A1 E866280000       call $00403c0c
004013A6 59               pop ecx
004013A7 8945FC           mov [ebp-$04],eax
004013AA 85C0             test eax,eax
004013AC 7438             jz $004013e6
004013AE 66C745E81800     mov word ptr [ebp-$18],$0018
004013B4 6A01             push $01
004013B6 FF35D0404000     push dword ptr [$004040d0]
004013BC FF35CC404000     push dword ptr [$004040cc]
004013C2 FF35C8404000     push dword ptr [$004040c8]
004013C8 FF35C4404000     push dword ptr [$004040c4]
004013CE 6A00             push $00
004013D0 FF75FC           push dword ptr [ebp-$04]
004013D3 E86C030000       call $00401744          /// вот на этой строке происходит сбой
это значение  00401744 было в сообщении.


004013D8 83C41C           add esp,$1c



Не знаю, может что-то в конфигурации USB в самой системе, кстати пробовал
и WIn2000, WINXP на разных машинах???
Warlord
Собери это проект, отключив на закладке Linker галку Use dynamic RTL и выложи здесь exeшник. У меня щас есть плата с сайпресом, попробую у себя твой exeшник. А вообще надо идти по коду глубже и смотреть какая именно простейшая команда вызвала Exception.
леха_настойчивый
Цитата(Warlord @ Sep 13 2007, 12:01) *
Собери это проект, отключив на закладке Linker галку Use dynamic RTL и выложи здесь exeшник. У меня щас есть плата с сайпресом, попробую у себя твой exeшник. А вообще надо идти по коду глубже и смотреть какая именно простейшая команда вызвала Exception.


вот архив, в нем
ADC2USB там HEX и т.д.
и проэкт С++ Builder
Нажмите для просмотра прикрепленного файла
Warlord
У тебя какой Билдер?? Явно не шестой. EXe-шник не запускается - при сборке галку не убрал. Проект Билдера пустой =\ Сдается мне, что библиотека не подходит под твою версию Билдера.
-Al-
С этим Cypress API есть довольно неприятная хреновина (или фича?), библиотека работает ТОЛЬКО при компиляции с Data Alignment = 8 (Quad Word), в противном случае вываливается в точности как у Вас. Чтобы не трогать проект, необходимо в CyAPI.h добавить тройку строчек с #pragma pack:
Код
//______________________________________________________________________________
//
// Copyright (c) Cypress Semiconductor, 2003
// All rights reserved.
//
//______________________________________________________________________________

#ifndef CyUSBH
#define CyUSBH

#pragma pack(push)
#pragma pack(8)

.....

#pragma pack(pop)

#endif

У меня после этого все завелось и работает без проблем независимо от data alignment smile.gif
леха_настойчивый
Цитата(Warlord @ Sep 13 2007, 15:07) *
У тебя какой Билдер?? Явно не шестой. EXe-шник не запускается - при сборке галку не убрал. Проект Билдера пустой =\ Сдается мне, что библиотека не подходит под твою версию Билдера.


У меня не шестой, у меня Borland Developer Studio

Borland® C++Builder® Preview for Microsoft® Windows™ Version 10.0.2151.25345 Copyright © 2005 Borland® Software Corporation. All Rights Reserved.

НЕУЖЕЛИ ИЗ-ЗА ЭТОГО ????????, у меня есть шестой, может поробовать, мне казалось этот лучше?
тут все борландовские примочки есть?
я тоже заметил что если взять библиотеку VC++ и подсунуть ему
то реакция без изменений.

ПРОШУ ПРОЩЕНИЯ я не заметил что путь срр изменен.
Вот опять архив, галка убрана.



Цитата(Warlord @ Sep 13 2007, 15:07) *
У тебя какой Билдер?? Явно не шестой. EXe-шник не запускается - при сборке галку не убрал. Проект Билдера пустой =\ Сдается мне, что библиотека не подходит под твою версию Билдера.


У меня не шестой, у меня Borland Developer Studio

Borland® C++Builder® Preview for Microsoft® Windows™ Version 10.0.2151.25345 Copyright © 2005 Borland® Software Corporation. All Rights Reserved.

НЕУЖЕЛИ ИЗ-ЗА ЭТОГО ????????, у меня есть шестой, может поробовать, мне казалось этот лучше?
тут все борландовские примочки есть?
я тоже заметил что если взять библиотеку VC++ и подсунуть ему
то реакция без изменений.

ПРОШУ ПРОЩЕНИЯ я не заметил что путь срр изменен.
Вот опять архив, галка убрана.

wub.gif

Цитата(-Al- @ Sep 13 2007, 16:02) *
С этим Cypress API есть довольно неприятная хреновина (или фича?), библиотека работает ТОЛЬКО при компиляции с Data Alignment = 8 (Quad Word), в противном случае вываливается в точности как у Вас. Чтобы не трогать проект, необходимо в CyAPI.h добавить тройку строчек с #pragma pack:
Код
//______________________________________________________________________________
//
// Copyright (c) Cypress Semiconductor, 2003
// All rights reserved.
//
//______________________________________________________________________________

#ifndef CyUSBH
#define CyUSBH

#pragma pack(push)
#pragma pack(8)

.....

#pragma pack(pop)

#endif

У меня после этого все завелось и работает без проблем независимо от data alignment smile.gif



я посмотрел в настройках у меня стоит Data Alignment = 8 (Quad Word) ???
Warlord
Цитата(леха_настойчивый @ Sep 13 2007, 17:46) *
У меня не шестой, у меня Borland Developer Studio

Borland® C++Builder® Preview for Microsoft® Windows™ Version 10.0.2151.25345 Copyright © 2005 Borland® Software Corporation. All Rights Reserved.

НЕУЖЕЛИ ИЗ-ЗА ЭТОГО ????????, у меня есть шестой, может поробовать, мне казалось этот лучше?
тут все борландовские примочки есть?

ИМХО не пойдёть с Borland Developer Studio, библотека CyAPI.lib не та. Юзай либо 6 билдер, либо найди CyAPI.lib для Borland Developer Studio (например напиши в поддержку сайпреса). Да, и еще, скачай самые последние дрова, я глянул у тя не самые свежие.
леха_настойчивый
Цитата(Warlord @ Sep 14 2007, 08:40) *
ИМХО не пойдёть с Borland Developer Studio, библотека CyAPI.lib не та. Юзай либо 6 билдер, либо найди CyAPI.lib для Borland Developer Studio (например напиши в поддержку сайпреса). Да, и еще, скачай самые последние дрова, я глянул у тя не самые свежие.


Cпасибо!
Сейчас ставлю шестой билдер, буду пробовать!

Цитата(Warlord @ Sep 14 2007, 08:40) *
ИМХО не пойдёть с Borland Developer Studio, библотека CyAPI.lib не та. Юзай либо 6 билдер, либо найди CyAPI.lib для Borland Developer Studio (например напиши в поддержку сайпреса). Да, и еще, скачай самые последние дрова, я глянул у тя не самые свежие.


Огромное спасибо Warlord!!!
ЗАПУСТИЛОСЬ, и видит устройство, вы мне очень помогли!!!
Vix
Всем привет!
Скажите, что такого изменилось в Codegear (CBuilder 2007) относительно CBuilder 6, что CyAPI нельзя использовать? Причина в CyAPI.lib или в настройках IDE?


Вопрос 2 (USBIOLIB, v2.0):
В CBuilder 6 некомпилируется пустой проект, результат:

[Linker Error] Unresolved external 'CSetupApiDll::CSetupApiDll()' referenced from F:\.....\UNIT1.OBJ
[Linker Error] Unresolved external 'CSetupApiDll::~CSetupApiDll()' referenced from F:\....\UNIT1.OBJ
Почему?
Vix
Кстати, если в CBuilder 2007 использовать IOCTL вместо CyAPI, то все работает, но писанины больше!
MSL
Начал сегодня возиться с одной платой с 68013А - та же проблема с Builder-ом 2007. Никто не может кинуть CyAPI.lib под него? Сенкс.
Serg_Sm
Выкиньте вы эти библиотеки - я вот написал класс для работы напрямую с драйвером и пользуюсь им уже года 2 без доработок.
MSL
Цитата(Serg_Sm @ Mar 31 2008, 13:04) *
Выкиньте вы эти библиотеки - я вот написал класс для работы напрямую с драйвером и пользуюсь им уже года 2 без доработок.


Видите ли, Serg_Sm, какая фигня - у меня есть тестовый образец платы, на которой кроме 68013A есть еще CPLD, ARM с новыми для меня регистрами и пр. мелочи и мне нужно в макс. короткое время сделать тестовое приложение на писи плюс тесты для арм и цплд, чтобы протестировать работу всего устройства... Так, что советы типа все выкинуть и переписать будут оправданы через недели и мало помогают-) А пока, если никто не поможет c LIB под 2007 билдер - прийдется ставить 6ку или поюзать виндрайвер...
Vix
MSL
Вот простенький примерчик. Без потоков и OVERLAPPED.
Для Builder2007.
MSL
Цитата(Vix @ Apr 1 2008, 06:57) *
Вот простенький примерчик. Без потоков и OVERLAPPED.
Для Builder2007.


Спасибо! Я смотрю, что принято каждому писать свою библиотеку или класс через IOCTL-)) Немного не в тему, наверное, но такой вопрос - с чем это связано? С СuUSB так можно выжать макс. скорость или просто желание иметь собой написанный класс или либ? Просто на будующее, потому что вчера ночью уже зацепил 68013 все через windriver - заняло 1 час + ф-ции чтения/записи еепром и пр.).
Vix
MSL
Видимо, кому что ближе и удобнее...
ИМХО: универсальных драйверов не так уж и много - CyUSB и USBIO (встречал только эти). С USBIO у меня как-то не пошло. А с CyUSB я уже работал через API, все нравилось. Вот и решил, что я все равно буду использовать этот драйвер и в 2007 билдере.
MSL
2 'Vix'

Ясно, значит тема про LIB для BCB2007 все еще актуальна. Я просто в сети не нашел, у сайпреса на их страшном сайте тоже вроде ничего. Может кто с саппортом общался? Если честно - даже не изучал чем вызыватется ошибка после компиляции со страрой lib. Если что узнаю или заработает - напишу, и так же буду признателен, если кто сделает это раньше. даже интересно-)
Седой
Цитата(Vix @ Apr 1 2008, 14:34) *
ИМХО: универсальных драйверов не так уж и много - CyUSB и USBIO (встречал только эти). С USBIO у меня как-то не пошло. А с CyUSB я уже работал через API, все нравилось. Вот и решил, что я все равно буду использовать этот драйвер и в 2007 билдере.


A WinUSB?
http://msdn2.microsoft.com/en-us/library/aa476426.aspx
http://www.microsoft.com/whdc/device/conne...nUsb_HowTo.mspx

По поводу CyAPI.lib в BDS - ошибки скорее всего связаны с особенностями реализации кучи в различных версиях.
В принципе можно сделать в BCB6 или в VC dll c экпортируемыми функциями - обертками методов классoв и применять в любом компиляторе.
Дуглас Шеппард
Цитата(Warlord @ Sep 12 2007, 16:27) *
Посылает пакет драйверу устройства.


да да, есть такая функция, так наз. IRP пакеты посылает, в аргументах помоему у нее
что то вроде указателя на void и надо знать структуру этого пакета для конкретного девайса
и передовать приводя его к (* void)
-=HermiT=-
Здравствуйте!

Бьюсь со скоростью обмена. Возникли вопросы.

Работаю с отладочной платой для ПЛИС, на которой установлена микросхема CY7C68013A.
С обменом разобрался, все проверено и перепроверено - работает.

Сделал тестовую программу, которая заполняет IN pipe в CY7C68013A с определенной скоростью. Скорость можно регулировать. Передача bulk. При передаче контроллирую, чтоб не было потерь данных. Т.е. если IN pipe не пуст, а данные надо передавать, то считаю, что данные потеряны.

Испытал эту всю систему в EzMonitor.

Сделал тестовую программу в Builder C++ 6. Сначала делал в CyAPI.lib, но скорость получалась примерно в 32 раза ниже, чем у EzMonitor.

Сделал программу с использованием DeviceIoControl. Скорость практически не изменилась.

Подскажите, пожалуйста, что это может быть, как достичь скорости, как в EzMonitor???

Вот код приема:

const int kmax = 8;
char buf[kmax][1024]; // содержит принятые данные

DWORD NOfBytes;
unsigned __int16 rc_int;
AnsiString str10;
int j_base;
ULONG nBytes = 0;


for (int k = 0; k < kmax / 2; k++)
{
bulkControl.pipeNum = 2;
DeviceIoControl (FX2Device,
IOCTL_EZUSB_BULK_READ,
&bulkControl,
sizeof (BULK_TRANSFER_CONTROL),
buf[2*k],
1024,
(unsigned long *)&nBytes,
NULL);

bulkControl.pipeNum = 3;
DeviceIoControl (FX2Device,
IOCTL_EZUSB_BULK_READ,
&bulkControl,
sizeof (BULK_TRANSFER_CONTROL),
buf[2*k + 1],
1024,
(unsigned long *)&nBytes,
NULL);
}

Может, это из-за того, что в программе EzMonitor запросы ставяться в очередь ближе к аппаратному уровню, а у меня пока не выполниться одна команда, вторая не будет поставлена в очередь

EzMonitor - он же "EZ-USB Control Panel"
-=HermiT=-
может, надо при инициализации устройства какие-то команды посылать?
Я просто получаю handle устройства:
Цитата
FX2Device = CreateFile(FX2Name,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);

if (FX2Device == INVALID_HANDLE_VALUE)
return;


И после этого начинаю обмен данными
-=HermiT=-
В документе FX2 TechRefManual.pdf написано:
Цитата
The USB 2.0 Specification requires that high-speed (480 Mbit/sec) devices must also be capable
of enumerating at full-speed (12 Mbit/s). In fact, all high-speed devices begin the enumeration process
in full-speed mode; devices switch to high-speed operation only after the host and device
have agreed to operate at high speed. The high-speed negotiation process occurs during USB
reset, via the “Chirp” protocol described in Chapter 7 of the USB 2.0 Specification.

(что за “Chirp” protocol я там так и не нашел). Но зато в 7 главе есть следующее:
Цитата
7.5 USB Bus Reset
The host signals a USB Bus Reset by driving an SE0 state (both D+ and D- data lines low) for a
minimum of 10 ms. The FX2 senses this condition, requests the USB Interrupt (INT2), and supplies
the interrupt vector for a USB Reset. After a USB bus reset, the following occurs:
• Toggle bits are cleared to 0.
• The device address is reset to zero.
• If the Default USB Device is active, the USB configuration and alternate settings are reset
to zero.
• The FX2 will renegotiate with the host for high-speed (480 Mbps) mode.


Казалось бы то, что надо.
Вставил команду:
Код
DeviceIoControl        (FX2Device,
                                IOCTL_Ezusb_RESET,
                                NULL,
                                0,
                                NULL,
                                0,
                                (unsigned long *)&nBytes,
                                NULL);

Но она никак не повлияла
-=HermiT=-
Проблема решилась с помощью использования асинхронного ввода вывода.
Использовал драйвер CyUSB.sys

Код фактически такой же, как в документе CyAPI.pdf на странице 6 (2.1 BeginDataXfer( ))

Код
OVERLAPPED in6OvLap1, in8OvLap1, in6OvLap2, in8OvLap2, in6OvLap3, in8OvLap3, in6OvLap4, in8OvLap4;
in6OvLap1.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN61");
...
UCHAR *inContext61 = BulkInEpt6->BeginDataXfer(buf[0], 1024, &in6OvLap1);
...
BulkInEpt6->WaitForXfer(&in6OvLap1, 10000);
...
BulkInEpt6->FinishDataXfer(buf[0], 1024, &in6OvLap1, inContext61);
...
CloseHandle(in6OvLap1.hEvent);
...
AndreyS
Цитата(-=HermiT=- @ Nov 25 2008, 14:37) *
В документе FX2 TechRefManual.pdf написано:

(что за “Chirp” protocol я там так и не нашел). Но зато в 7 главе есть следующее:


Добрый день.

Ну для начала внимательно смотрим на то что написано. Вами указано именно ссылка на главу 7 USB2.0 спецификации, а не пользовательской инструкции FX2.
Ну а если вы там почитаете внимательно, то там идет описание выхода устройства на High speed режим.
И самое главное. Если у вас хост не high speed, то FX2 не перейдет на бфструю скорость. И наоборот. Если у вас хост 2.0, то несущая у вас будет с FX2 именно 480Мбит. Даже если вы скажете FX2, что работатете на full speed (пропускная способность кончно упадет, но несущая будет 480МГц).
В свое время пытался из-за глюков (потеря данных, периодическое пропадание устройства в системе) на плохом кабеле, но с хостом USB2.0 заставить всеми силами FX2 перейти на несущую 12мбит. Но без отключения хаба 2.0 в компе этого не происходит. И виноват в этом Chirp протокол smile.gif Он работает на нижнем уровне и на него нет возможности повлиять со стороны FX2.
-=HermiT=-
Цитата(AndreyS @ Nov 25 2008, 20:46) *
Вами указано именно ссылка на главу 7 USB2.0 спецификации, а не пользовательской инструкции FX2.


smile.gif да точно, я как-то даже и не заметил.
Спасибо за ответ. Спецификацию изучу
Konst_777
Цитата(AndreyS @ Nov 25 2008, 21:46) *
Если у вас хост 2.0, то несущая у вас будет с FX2 именно 480Мбит. Даже если вы скажете FX2, что работатете на full speed (пропускная способность кончно упадет, но несущая будет 480МГц).

В разделе "3.1 Disabling High-speed Chirp via EEPROM Config Byte" документа "Migrating From EZ-USB FX2™ to EZ-USB FX2LP™" (fx2_to_fx2lp.pdf) описано, как заставить FX2/FX2LP работать на Full Speed с High Speed хостом.

Цитата(AndreyS @ Nov 25 2008, 21:46) *
В свое время пытался из-за глюков (потеря данных, периодическое пропадание устройства в системе) на плохом кабеле, но с хостом USB2.0 заставить всеми силами FX2 перейти на несущую 12мбит. Но без отключения хаба 2.0 в компе этого не происходит. И виноват в этом Chirp протокол smile.gif Он работает на нижнем уровне и на него нет возможности повлиять со стороны FX2.

Сам такую задачу не решал, так что, сейчас буду фантазировать smile.gif
Можно так: подключиться с разрешенным “Chirp”, затем проанализировать, если в течении определенного времени хост не присваивает адрес FX2/FX2LP, хотя VBUS присутствует, то FX2/FX2LP устанавливает в "1" бит 1 недокументированного регистра CT1 и переподключается к USB.
Дальше: наличие сбоев обмена анализировать по регистрам USBERRIE, USBERRIRQ, ERRCNTLIM, CLRERRCNT. Если число сбоев больше допустимого, то опять таки, переключить FX2/FX2LP в режим Full Speed.
-=HermiT=-
В общем на этом грабли на пути достижения высокой скорости передачи не закончились.

Пытался передать на компьютер 32 МБ. Попытался на 40.9 МБ/с - не получилось. Пришлось понизить скорость заполнения pipes. Стабильной передачи удалось добиться на скорости примерно 11.7 МБ/с.
Дальнейшие эксперименты показали, что на скорости 40,9 МБ/с нормально передается около 1020 кБ, бОльшие объемы информации на такой скорости компьютер не успевает принимать.

Проверил программу на нескольких компьютерах. Там где система была послабее, не удавалось достичь и скорости 6 МБ/с.

При этом программа грузит два ядра процессора практически на 100%.

Вот код
Код
        const int kmax = 1023;//8192;//65536;
        const int kmax_2 = kmax / 2;
        
        char *buf = new char[kmax * 1024];

        
        //-------------------------------------
        OVERLAPPED in6OvLap[kmax_2], in8OvLap[kmax_2];

        for (int i = 0; i < kmax_2; i++)
        {
                in6OvLap[i].hEvent = CreateEvent(NULL, false, false, NULL);
                in8OvLap[i].hEvent = CreateEvent(NULL, false, false, NULL);
        }

        // BeginDataXfer
        UCHAR *inContext6[kmax_2];
        UCHAR *inContext8[kmax_2];

        for (int i = 0; i < kmax_2; i++)
        {
                int i_base = 2 * i * 1024;
                UCHAR *buf2 = buf + i_base;
                UCHAR *buf3 = buf + i_base + 1024;
                inContext6[i] = BulkInEpt6->BeginDataXfer(buf2, 1024 , &in6OvLap[i]);
                inContext8[i] = BulkInEpt8->BeginDataXfer(buf3, 1024 , &in8OvLap[i]);
        }

        
        // WaitForXfer
        for (int i = 0; i < kmax_2; i++)
        {
                BulkInEpt6->WaitForXfer(&in6OvLap[i], 10000);
                BulkInEpt8->WaitForXfer(&in8OvLap[i], 10000);
        }


        // FinishDataXfer
        for (int i = 0; i < kmax_2; i++)
        {
                int i_base = 2 * i * 1024;
                UCHAR *buf2 = buf + i_base;
                UCHAR *buf3 = buf + i_base + 1024;
                BulkInEpt6->FinishDataXfer(buf2, 1024 , &in6OvLap[i], inContext6[i]);
                BulkInEpt8->FinishDataXfer(buf3, 1024 , &in8OvLap[i], inContext8[i]);
        }

        // CloseHandle
        for (int i = 0; i < kmax_2; i++)
        {
                CloseHandle(in6OvLap[i].hEvent);
                CloseHandle(in8OvLap[i].hEvent);
        }
        //-------------------------------------
                delete [] buf;
AndreyS
Цитата(Konst_777 @ Nov 26 2008, 22:14) *
В разделе "3.1 Disabling High-speed Chirp via EEPROM Config Byte" документа "Migrating From EZ-USB FX2™ to EZ-USB FX2LP™" (fx2_to_fx2lp.pdf) описано, как заставить FX2/FX2LP работать на Full Speed с High Speed хостом.
Сам такую задачу не решал, так что, сейчас буду фантазировать smile.gif
Можно так: подключиться с разрешенным “Chirp”, затем проанализировать, если в течении определенного времени хост не присваивает адрес FX2/FX2LP, хотя VBUS присутствует, то FX2/FX2LP устанавливает в "1" бит 1 недокументированного регистра CT1 и переподключается к USB.
Дальше: наличие сбоев обмена анализировать по регистрам USBERRIE, USBERRIRQ, ERRCNTLIM, CLRERRCNT. Если число сбоев больше допустимого, то опять таки, переключить FX2/FX2LP в режим Full Speed.


Добрый день.

Огромное спасибо за ссылку. Этот документ я не читал.
AndreyS
Цитата(Konst_777 @ Nov 26 2008, 22:14) *
В разделе "3.1 Disabling High-speed Chirp via EEPROM Config Byte" документа "Migrating From EZ-USB FX2™ to EZ-USB FX2LP™" (fx2_to_fx2lp.pdf) описано, как заставить FX2/FX2LP работать на Full Speed с High Speed хостом.


Добрый день.
Нашел этот документ, но в нем нет адреса этого регистра, в даташите об этом регистре тоже ничего нет.
Нашел хидер с перечнем недокументированных регистров ( в том числе и адрес этого пресловутого CT1). Но возник резонный вопрос, а дока по ним есть?? smile.gif Я что-то не нашел.
Konst_777
Цитата(AndreyS @ Dec 3 2008, 00:46) *
Добрый день.
Нашел этот документ, но в нем нет адреса этого регистра, в даташите об этом регистре тоже ничего нет.
Нашел хидер с перечнем недокументированных регистров ( в том числе и адрес этого пресловутого CT1). Но возник резонный вопрос, а дока по ним есть?? smile.gif Я что-то не нашел.

Я и не искал. Поскольку прочитал в "FX2regs.h", что:
Код
/ Debug/Test
// The following registers are for Cypress's internal testing purposes only.
// These registers are not documented in the datasheet or the Technical Reference
// Manual as they were not designed for end user application usage
EXTERN xdata volatile BYTE DBUG              _AT_ 0xE6F8;  // Debug
EXTERN xdata volatile BYTE TESTCFG           _AT_ 0xE6F9;  // Test configuration
EXTERN xdata volatile BYTE USBTEST           _AT_ 0xE6FA;  // USB Test Modes
EXTERN xdata volatile BYTE CT1               _AT_ 0xE6FB;  // Chirp Test--Override
EXTERN xdata volatile BYTE CT2               _AT_ 0xE6FC;  // Chirp Test--FSM
EXTERN xdata volatile BYTE CT3               _AT_ 0xE6FD;  // Chirp Test--Control Signals
EXTERN xdata volatile BYTE CT4               _AT_ 0xE6FE;  // Chirp Test--Inputs

Если есть большое желание узнать, как использовать эти регистры, то можно попробовать пообщаться с техподдержкой Cypress. Отвечают они всегда быстро, но, бывает, что результат общения - нулевой.
AndreyS
Цитата(Konst_777 @ Dec 3 2008, 21:59) *
Если есть большое желание узнать, как использовать эти регистры, то можно попробовать пообщаться с техподдержкой Cypress. Отвечают они всегда быстро, но, бывает, что результат общения - нулевой.



Спасибо. Было просто любопытно.
MegaElektronik
Здравствуйте! help.gif
Помогите пожалуйста!
Проблемма:
Имеется CY7C68013A. Написаны дескрипторы и т.д. система определяет USB audio device, как и требовалось, а конкретнее USB Speaker. Драйвер стандартный используется. Тип передачи изохронный. Так вот пытаюсь в него передать данные например Winamp-ом и смотру как данные идут в настройке драйвера выхода (DirectSound вкладка статус), а он пишет что отправил 1280байт (примерно) и стоит. В чем может быть проблемма? В программе для контроллера в функции TD Pool в регистры пишется EP2BCH=0, а EP2BCL=0x80.
Чать кода привожу..


void TD_Poll(void) // Called repeatedly while the device is idle
{
// Audio control action
if( !(EP2CS & bmEPEMPTY) ) //EP2CS & bmEPFULL ) // Is there something available
{

IOB = EP2FIFOBUF[0];

EP2BCH = 0;
EP2BCL = 0x80; // Rearm endpoint buffer
}
}


Может кто делал такое и кусочком исходника поделится?
Помогите!!! Уже неделю бьюсь.
Vix
Итак, снова о CodeGear 2007 и Builder6.
Исключительную ситуацию в CodeGear 2007 вызывают следующие коды
1) ... = new CCyUSBDevice(...);
2) USBDevice->Open(...);

Чтобы использовать CyAPI в CodeGear 2007, необходимо написать простую DLL в Builder6.
В DLL передается VID & PID, а возвращается указатель на CCyUSBDevice. Далее работаем с CyAPI как обычно.

Пример функции из DLL

extern "C" __declspec(dllexport) CCyUSBDevice* IUSBDeviceOpen(int VID,int PID){
CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL);
int i;
int USBDevCount = USBDevice->DeviceCount();
if (USBDevCount == 0) return NULL;
for (i = 0; i < USBDevCount; i++)
{
USBDevice->Open(i);
if((USBDevice->VendorID == VID) && (USBDevice->ProductID == PID))
break;
}
if(i == USBDevCount) return NULL;//"No USB device found";
if(!USBDevice->EndPoints)
{
USBDevice->ReConnect();
return NULL;
}
return USBDevice;
}

Если нужна готовая DLL (со стандартным GUID), могу выложить.
J2post
Цитата(Vix @ Dec 5 2008, 13:17) *
Итак, снова о CodeGear 2007 и Builder6.
Исключительную ситуацию в CodeGear 2007 вызывают следующие коды
1) ... = new CCyUSBDevice(...);
2) USBDevice->Open(...);

Чтобы использовать CyAPI в CodeGear 2007, необходимо написать простую DLL в Builder6.
В DLL передается VID & PID, а возвращается указатель на CCyUSBDevice. Далее работаем с CyAPI как обычно.

Пример функции из DLL

extern "C" __declspec(dllexport) CCyUSBDevice* IUSBDeviceOpen(int VID,int PID){
CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL);
int i;
int USBDevCount = USBDevice->DeviceCount();
if (USBDevCount == 0) return NULL;
for (i = 0; i < USBDevCount; i++)
{
USBDevice->Open(i);
if((USBDevice->VendorID == VID) && (USBDevice->ProductID == PID))
break;
}
if(i == USBDevCount) return NULL;//"No USB device found";
if(!USBDevice->EndPoints)
{
USBDevice->ReConnect();
return NULL;
}
return USBDevice;
}

Если нужна готовая DLL (со стандартным GUID), могу выложить.

Очень интересует такой вопрос, а для VC будет работать эта DLL написанная в Borlande??????????
Vix
Цитата(J2post @ Dec 10 2008, 15:20) *
Очень интересует такой вопрос, а для VC будет работать эта DLL написанная в Borlande??????????

Маловероятно. Пробуйте. А лучше в более старой студии создайте аналогичную DLL.
J2post
Цитата(Vix @ Dec 10 2008, 18:32) *
Маловероятно. Пробуйте. А лучше в более старой студии создайте аналогичную DLL.

Ого как оперативно, спасибо за такое внимание.
Вообще у меня следующая проблема, не знаю как прикрутить эту библиотеку к компилятору MinGW (осваиваю Qt4), есть вариант написать СОМ обьект, но не хочется заморачиваться. Как думаете что поможет в моем случае?
Glitko
Помогите разобратся ! У меня на плате CY768013A-128, АТмега-64,ПЛИС и АЦП.CY768013A-128 используется в режиме GPIF.Прошивка GPIF сделана GPIF Designer и Кейлом.Сейчас занимаюсь отладкой GPIF интерфейса.На плисене на GPIF интерфейсе ставлю все нули (16 бит) читаю число 1024,ставлю все 1 читаю 65407.Физически прибором на входах CY768013A-128 все соответствует устанавливаемым на плис значениям, интерфейс распаян правильно,тем не мение как бы я не менял значения бит в интерфейсе биты 8-ой и 11-ый не меняются.В связи с этим у меня вопрос-это пи....ц CY768013A-128 или есть еще каке то варианты?
Vix
to Glitko
читаете данные каким образом?
alexkok
Цитата(Glitko @ May 18 2009, 06:53) *
Помогите разобратся ! У меня на плате CY768013A-128, АТмега-64,ПЛИС и АЦП.CY768013A-128 используется в режиме GPIF.Прошивка GPIF сделана GPIF Designer и Кейлом.Сейчас занимаюсь отладкой GPIF интерфейса.На плисене на GPIF интерфейсе ставлю все нули (16 бит) читаю число 1024,ставлю все 1 читаю 65407.Физически прибором на входах CY768013A-128 все соответствует устанавливаемым на плис значениям,

Что значит "Физически прибором"?
Возможно у Вас просто плохая пайка, в статике работает, а в динамике нет.
Цитата
интерфейс распаян правильно,тем не мение как бы я не менял значения бит в интерфейсе биты 8-ой и 11-ый не меняются.В связи с этим у меня вопрос-это пи....ц CY768013A-128 или есть еще каке то варианты?

Попробуйте поднять эти ноги и гарантированно установить на них значения тумблером.
Glitko
Цитата(Glitko @ May 18 2009, 06:53) *
Помогите разобратся ! У меня на плате CY768013A-128, АТмега-64,ПЛИС и АЦП.CY768013A-128 используется в режиме GPIF.Прошивка GPIF сделана GPIF Designer и Кейлом.Сейчас занимаюсь отладкой GPIF интерфейса.На плисене на GPIF интерфейсе ставлю все нули (16 бит) читаю число 1024,ставлю все 1 читаю 65407.Физически прибором на входах CY768013A-128 все соответствует устанавливаемым на плис значениям, интерфейс распаян правильно,тем не мение как бы я не менял значения бит в интерфейсе биты 8-ой и 11-ый не меняются.В связи с этим у меня вопрос-это пи....ц CY768013A-128 или есть еще каке то варианты?

Все разобрался, элементарно плохо пропаял ножки CY768013A-128.Паял сам -сам и виноват.Щуп ставиш - ножка липнет, все нормально, убираеш - тестируеш плату- глюк.Вообшем век живи век учись.....
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.