|
|
  |
проблема USB cy7c68013a, инициализация устройства |
|
|
|
Sep 10 2007, 15:46
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 27-04-07
Пользователь №: 27 348

|
Здавствуйте люди! Подскажите кто может, в чем проблема при выделении пямяти под структуру С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;
}
|
|
|
|
|
Sep 11 2007, 06:18
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 23-09-05
Из: Москва
Пользователь №: 8 874

|
Звезду убери Код CCyUSBDevice s_usb_device = new CCyUSBDevice();
|
|
|
|
|
Sep 11 2007, 15:00
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 27-04-07
Пользователь №: 27 348

|
Цитата(Warlord @ Sep 11 2007, 09:18)  Звезду убери Код CCyUSBDevice s_usb_device = new CCyUSBDevice(); Не помогает, все также, вот только при пошаговом исполнении, если просмотреть debug inspect переменную s_usb_device, до исполнения строки Код CCyUSBDevice s_usb_device = new CCyUSBDevice() поля настроек стали заполнеными, а раньше были не определены, может я что не определил перед выделением памяти под CYUsbdevice???
|
|
|
|
|
Sep 12 2007, 07:59
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 23-09-05
Из: Москва
Пользователь №: 8 874

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

Группа: Новичок
Сообщений: 15
Регистрация: 27-04-07
Пользователь №: 27 348

|
Цитата(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("??? Спасибо за ответ!!
|
|
|
|
|
Sep 12 2007, 10:57
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 23-09-05
Из: Москва
Пользователь №: 8 874

|
Цитата(леха_настойчивый @ 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("??? Посылает пакет драйверу устройства.
|
|
|
|
|
Sep 12 2007, 11:23
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 27-04-07
Пользователь №: 27 348

|
Цитата(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 отлично, все как по книжке. Может в кофигурации самого контроллера чото не так??
|
|
|
|
|
Sep 12 2007, 12:19
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 23-09-05
Из: Москва
Пользователь №: 8 874

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

Группа: Новичок
Сообщений: 15
Регистрация: 27-04-07
Пользователь №: 27 348

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

Группа: Новичок
Сообщений: 15
Регистрация: 27-04-07
Пользователь №: 27 348

|
Цитата(леха_настойчивый @ 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 на разных машинах???
|
|
|
|
|
Sep 13 2007, 10:32
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 27-04-07
Пользователь №: 27 348

|
Цитата(Warlord @ Sep 13 2007, 12:01)  Собери это проект, отключив на закладке Linker галку Use dynamic RTL и выложи здесь exeшник. У меня щас есть плата с сайпресом, попробую у себя твой exeшник. А вообще надо идти по коду глубже и смотреть какая именно простейшая команда вызвала Exception. вот архив, в нем ADC2USB там HEX и т.д. и проэкт С++ Builder
Proj.rar ( 406.97 килобайт )
Кол-во скачиваний: 247
|
|
|
|
|
Sep 13 2007, 13:02
|

Местный
  
Группа: Свой
Сообщений: 330
Регистрация: 10-06-05
Из: Россия, Москва
Пользователь №: 5 894

|
С этим 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
|
|
|
|
|
Sep 13 2007, 13:46
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 27-04-07
Пользователь №: 27 348

|
Цитата(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++ и подсунуть ему то реакция без изменений. ПРОШУ ПРОЩЕНИЯ я не заметил что путь срр изменен. Вот опять архив, галка убрана.  Цитата(-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  я посмотрел в настройках у меня стоит Data Alignment = 8 (Quad Word) ???
|
|
|
|
|
Sep 14 2007, 05:40
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 23-09-05
Из: Москва
Пользователь №: 8 874

|
Цитата(леха_настойчивый @ 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 (например напиши в поддержку сайпреса). Да, и еще, скачай самые последние дрова, я глянул у тя не самые свежие.
|
|
|
|
|
Sep 14 2007, 06:56
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 27-04-07
Пользователь №: 27 348

|
Цитата(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!!! ЗАПУСТИЛОСЬ, и видит устройство, вы мне очень помогли!!!
|
|
|
|
|
Mar 14 2008, 07:42
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 24-06-05
Пользователь №: 6 281

|
Всем привет! Скажите, что такого изменилось в 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 Почему?
|
|
|
|
|
Mar 14 2008, 10:22
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 24-06-05
Пользователь №: 6 281

|
Кстати, если в CBuilder 2007 использовать IOCTL вместо CyAPI, то все работает, но писанины больше!
|
|
|
|
|
Mar 31 2008, 18:43
|
Частый гость
 
Группа: Участник
Сообщений: 75
Регистрация: 25-07-04
Из: Rostov-on-Don
Пользователь №: 382

|
Цитата(Serg_Sm @ Mar 31 2008, 13:04)  Выкиньте вы эти библиотеки - я вот написал класс для работы напрямую с драйвером и пользуюсь им уже года 2 без доработок. Видите ли, Serg_Sm, какая фигня - у меня есть тестовый образец платы, на которой кроме 68013A есть еще CPLD, ARM с новыми для меня регистрами и пр. мелочи и мне нужно в макс. короткое время сделать тестовое приложение на писи плюс тесты для арм и цплд, чтобы протестировать работу всего устройства... Так, что советы типа все выкинуть и переписать будут оправданы через недели и мало помогают-) А пока, если никто не поможет c LIB под 2007 билдер - прийдется ставить 6ку или поюзать виндрайвер...
|
|
|
|
|
Apr 1 2008, 02:57
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 24-06-05
Пользователь №: 6 281

|
MSL Вот простенький примерчик. Без потоков и OVERLAPPED. Для Builder2007.
Прикрепленные файлы
2_.rar ( 264.96 килобайт )
Кол-во скачиваний: 99
|
|
|
|
|
Apr 1 2008, 08:18
|
Частый гость
 
Группа: Участник
Сообщений: 75
Регистрация: 25-07-04
Из: Rostov-on-Don
Пользователь №: 382

|
Цитата(Vix @ Apr 1 2008, 06:57)  Вот простенький примерчик. Без потоков и OVERLAPPED. Для Builder2007. Спасибо! Я смотрю, что принято каждому писать свою библиотеку или класс через IOCTL-)) Немного не в тему, наверное, но такой вопрос - с чем это связано? С СuUSB так можно выжать макс. скорость или просто желание иметь собой написанный класс или либ? Просто на будующее, потому что вчера ночью уже зацепил 68013 все через windriver - заняло 1 час + ф-ции чтения/записи еепром и пр.).
|
|
|
|
|
Apr 1 2008, 08:34
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 24-06-05
Пользователь №: 6 281

|
MSL Видимо, кому что ближе и удобнее... ИМХО: универсальных драйверов не так уж и много - CyUSB и USBIO (встречал только эти). С USBIO у меня как-то не пошло. А с CyUSB я уже работал через API, все нравилось. Вот и решил, что я все равно буду использовать этот драйвер и в 2007 билдере.
|
|
|
|
|
Apr 1 2008, 20:42
|
Местный
  
Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806

|
Цитата(Vix @ Apr 1 2008, 14:34)  ИМХО: универсальных драйверов не так уж и много - CyUSB и USBIO (встречал только эти). С USBIO у меня как-то не пошло. А с CyUSB я уже работал через API, все нравилось. Вот и решил, что я все равно буду использовать этот драйвер и в 2007 билдере. A WinUSB? http://msdn2.microsoft.com/en-us/library/aa476426.aspxhttp://www.microsoft.com/whdc/device/conne...nUsb_HowTo.mspxПо поводу CyAPI.lib в BDS - ошибки скорее всего связаны с особенностями реализации кучи в различных версиях. В принципе можно сделать в BCB6 или в VC dll c экпортируемыми функциями - обертками методов классoв и применять в любом компиляторе.
Сообщение отредактировал Седой - Apr 1 2008, 21:07
|
|
|
|
|
Apr 3 2008, 13:24
|
Группа: Новичок
Сообщений: 11
Регистрация: 29-10-07
Пользователь №: 31 841

|
Цитата(Warlord @ Sep 12 2007, 16:27)  Посылает пакет драйверу устройства. да да, есть такая функция, так наз. IRP пакеты посылает, в аргументах помоему у нее что то вроде указателя на void и надо знать структуру этого пакета для конкретного девайса и передовать приводя его к (* void)
|
|
|
|
|
Nov 21 2008, 11:56
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 29-11-05
Из: Belarus
Пользователь №: 11 540

|
Здравствуйте!
Бьюсь со скоростью обмена. Возникли вопросы.
Работаю с отладочной платой для ПЛИС, на которой установлена микросхема 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"
|
|
|
|
|
Nov 25 2008, 07:53
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 29-11-05
Из: Belarus
Пользователь №: 11 540

|
может, надо при инициализации устройства какие-то команды посылать? Я просто получаю handle устройства: Цитата FX2Device = CreateFile(FX2Name, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (FX2Device == INVALID_HANDLE_VALUE) return; И после этого начинаю обмен данными
|
|
|
|
|
Nov 25 2008, 11:37
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 29-11-05
Из: Belarus
Пользователь №: 11 540

|
В документе 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); Но она никак не повлияла
|
|
|
|
|
Nov 25 2008, 14:51
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 29-11-05
Из: Belarus
Пользователь №: 11 540

|
Проблема решилась с помощью использования асинхронного ввода вывода. Использовал драйвер 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); ...
|
|
|
|
|
Nov 25 2008, 17:46
|

Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276

|
Цитата(-=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 протокол  Он работает на нижнем уровне и на него нет возможности повлиять со стороны FX2.
--------------------
Удачи.
|
|
|
|
|
Nov 26 2008, 12:16
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 29-11-05
Из: Belarus
Пользователь №: 11 540

|
Цитата(AndreyS @ Nov 25 2008, 20:46)  Вами указано именно ссылка на главу 7 USB2.0 спецификации, а не пользовательской инструкции FX2.  да точно, я как-то даже и не заметил. Спасибо за ответ. Спецификацию изучу
|
|
|
|
|
Nov 26 2008, 19:14
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(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 протокол  Он работает на нижнем уровне и на него нет возможности повлиять со стороны FX2. Сам такую задачу не решал, так что, сейчас буду фантазировать Можно так: подключиться с разрешенным “Chirp”, затем проанализировать, если в течении определенного времени хост не присваивает адрес FX2/FX2LP, хотя VBUS присутствует, то FX2/FX2LP устанавливает в "1" бит 1 недокументированного регистра CT1 и переподключается к USB. Дальше: наличие сбоев обмена анализировать по регистрам USBERRIE, USBERRIRQ, ERRCNTLIM, CLRERRCNT. Если число сбоев больше допустимого, то опять таки, переключить FX2/FX2LP в режим Full Speed.
|
|
|
|
|
Nov 27 2008, 07:04
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 29-11-05
Из: Belarus
Пользователь №: 11 540

|
В общем на этом грабли на пути достижения высокой скорости передачи не закончились. Пытался передать на компьютер 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;
Сообщение отредактировал -=HermiT=- - Nov 27 2008, 07:08
|
|
|
|
|
Nov 29 2008, 20:24
|

Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276

|
Цитата(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 хостом. Сам такую задачу не решал, так что, сейчас буду фантазировать Можно так: подключиться с разрешенным “Chirp”, затем проанализировать, если в течении определенного времени хост не присваивает адрес FX2/FX2LP, хотя VBUS присутствует, то FX2/FX2LP устанавливает в "1" бит 1 недокументированного регистра CT1 и переподключается к USB. Дальше: наличие сбоев обмена анализировать по регистрам USBERRIE, USBERRIRQ, ERRCNTLIM, CLRERRCNT. Если число сбоев больше допустимого, то опять таки, переключить FX2/FX2LP в режим Full Speed. Добрый день. Огромное спасибо за ссылку. Этот документ я не читал.
--------------------
Удачи.
|
|
|
|
|
Dec 2 2008, 20:46
|

Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276

|
Цитата(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). Но возник резонный вопрос, а дока по ним есть??  Я что-то не нашел.
Сообщение отредактировал AndreyS - Dec 2 2008, 20:47
--------------------
Удачи.
|
|
|
|
|
Dec 3 2008, 18:59
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(AndreyS @ Dec 3 2008, 00:46)  Добрый день. Нашел этот документ, но в нем нет адреса этого регистра, в даташите об этом регистре тоже ничего нет. Нашел хидер с перечнем недокументированных регистров ( в том числе и адрес этого пресловутого CT1). Но возник резонный вопрос, а дока по ним есть??  Я что-то не нашел. Я и не искал. Поскольку прочитал в "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. Отвечают они всегда быстро, но, бывает, что результат общения - нулевой.
|
|
|
|
|
Dec 3 2008, 20:48
|

Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276

|
Цитата(Konst_777 @ Dec 3 2008, 21:59)  Если есть большое желание узнать, как использовать эти регистры, то можно попробовать пообщаться с техподдержкой Cypress. Отвечают они всегда быстро, но, бывает, что результат общения - нулевой. Спасибо. Было просто любопытно.
--------------------
Удачи.
|
|
|
|
|
Dec 5 2008, 07:07
|
Частый гость
 
Группа: Участник
Сообщений: 174
Регистрация: 23-01-08
Из: Нижний Новгород
Пользователь №: 34 339

|
Здравствуйте! Помогите пожалуйста! Проблемма: Имеется 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 } }Может кто делал такое и кусочком исходника поделится? Помогите!!! Уже неделю бьюсь.
|
|
|
|
|
Dec 5 2008, 07:17
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 24-06-05
Пользователь №: 6 281

|
Итак, снова о 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), могу выложить.
|
|
|
|
|
Dec 10 2008, 12:20
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 12-04-06
Из: Томск
Пользователь №: 16 049

|
Цитата(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??????????
|
|
|
|
|
Dec 10 2008, 12:32
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 24-06-05
Пользователь №: 6 281

|
Цитата(J2post @ Dec 10 2008, 15:20)  Очень интересует такой вопрос, а для VC будет работать эта DLL написанная в Borlande?????????? Маловероятно. Пробуйте. А лучше в более старой студии создайте аналогичную DLL.
|
|
|
|
|
Dec 10 2008, 12:38
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 12-04-06
Из: Томск
Пользователь №: 16 049

|
Цитата(Vix @ Dec 10 2008, 18:32)  Маловероятно. Пробуйте. А лучше в более старой студии создайте аналогичную DLL. Ого как оперативно, спасибо за такое внимание. Вообще у меня следующая проблема, не знаю как прикрутить эту библиотеку к компилятору MinGW (осваиваю Qt4), есть вариант написать СОМ обьект, но не хочется заморачиваться. Как думаете что поможет в моем случае?
|
|
|
|
|
May 18 2009, 03:53
|
Группа: Новичок
Сообщений: 14
Регистрация: 21-10-07
Пользователь №: 31 567

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

Группа: Участник
Сообщений: 40
Регистрация: 24-06-05
Пользователь №: 6 281

|
to Glitko читаете данные каким образом?
|
|
|
|
|
May 18 2009, 04:12
|
Знающий
   
Группа: Участник
Сообщений: 609
Регистрация: 3-03-07
Из: San Jose
Пользователь №: 25 837

|
Цитата(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 или есть еще каке то варианты? Попробуйте поднять эти ноги и гарантированно установить на них значения тумблером.
--------------------
|
|
|
|
|
May 18 2009, 16:29
|
Группа: Новичок
Сообщений: 14
Регистрация: 21-10-07
Пользователь №: 31 567

|
Цитата(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.Паял сам -сам и виноват.Щуп ставиш - ножка липнет, все нормально, убираеш - тестируеш плату- глюк.Вообшем век живи век учись.....
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|