EZ-USB/CyAPI 속도 문제를

N

Nephazz

Guest
안녕하세요,

나의 현재 프로젝트는 FPGA를하고 WinXP PC를 사이에 확립 USB 연결합니다.그래도 난 FPGA를 안에 손을 얻을 나의 더러운, 나의 상사가 물건을 의미.그는 datarate의 요구를 제공하기 위해 내가 적어도 15 MB / s의난 탑재된 칩의 645490 "적이있어 04 기판을 갖고있다"사이 프러스 반도체 CY3684 / 3674 용 EZ - B 호의 USB 고급 개발 보드 "를 인쇄하고는"CY7C68013A - 128AXC 0731.내가 AVnet에서 보드를 FPGA를 사용하여 이것을 개발할 나의 WinXP 소프트웨어 (석사는 Visual C ) 사용을 최종 버전 것입니다하지만.컨트롤러는 USB - CY7 현재의 펌웨어에 대한 bulkloop.hex이다에 deliverd에 c : / 사이 프러스 /는 USB / 예.

지금 내가 어떤 정보를 같이 "에서 대량 전송"및 종점 번호 및 설정할 수에 I'am과 CyAPI을 사용하여 연결을 할 수있는 보드.사용 내가 tranferspeed을 meassure.(원본 파일이 첨부되어 있습니다) 안타깝게도 난 오직 얻을 약 1 MB / s의(필자가 사용 해봤 http://www.cypress.com/?docID=4383를 속도를 meassure 수 있지만 나는 그것을 실행 할 수 없습니다.의 USB 컨트롤 패널 - 그건이지의의 "아마 때문에 대신에"내가 사용 "의 USB 콘솔을" 그래서 .. 나는 아무데도 찾을 수 없습니다.)

그래서 ...어디 병목 제?높은 대역폭을 얻기가없는 일반적인 CyAPI를?잘못은 내가 사용하거나입니까 제공하지 않습니다 그냥 펌웨어를 expample?읽고 해 - 당신이 가진 어떤 애플 리케이션 노트 또는 기타 겠지?

,이 좋은 하루
1 월추신 : 이것은에 crossposted입니다 http://www.cypress.com/forums/forum/messageview.cfm?catid=8&threadid=10046&enterthread=y코드 :

//************************************************ ***********

//************************************************ ***********

/ /

/ / 파일 : Test_CyAPI.cpp을

/ / 날짜 : 7.4.10

/ / 저자 : Kießling, 1 월 조선

/ / 목적 : CyAPI하고 기본적인 작문 익숙해지

/ / 함수

//************************************************ ***********

//************************************************ ***********
//************************************************ ***********

/ /이 포함됩니다

//************************************************ ***********

#은 <windows.h> 포함

#은 <stdio.h> 포함

/ / #은 <iostream.h> 포함

#은 <time.h> 포함

#은 <conio.h> 포함

#은 <math.h> 포함

#은 <CyAPI.h> 포함

#은 <string> 포함

#은 <iostream> 포함//************************************************ ***********

/ / 매크로와 전역 변수

//************************************************ ***********

네임 스페이스는 표준을 사용;

통근 자의 담당 처리;

표준 : : 문자열을 사용하여;

//************************************************ ***********

/ / 선언

//************************************************ ***********

bool USBSend512 (서명 char *로 아웃, CCyUSBDevice *의 USBDevice);

bool USBGet512 (에 서명 char *로, CCyUSBDevice *의 USBDevice);

무효의 wait_seconds (int 초);

//************************************************ ***********

/ / 메인

//************************************************ ***********

메인 (무효) 무효

(

/ / [의 USB 초기화]를

CCyUSBDevice * USBDevice = 새로운 CCyUSBDevice (NULL을);

/ / 시도 장치를 # 0 열

아닙니다 이미 열려 있습니다 (USBDevice -> DeviceCount () & &! USBDevice -> 열기 (0)) / /있는 경우 장치를 사용할 경우 Device0에는 있는지 확인하는 경우

(

법정 < "는 리셋 <0"<<endl를 장치를 여는;

USBDevice -> 재설정 ();

USBDevice -> 열기 (0);

)

(만약! USBDevice - IsOpen ())>

(

printf ( "\ N 개의 장치가 아닙니다 열린 \ N 개의 \ 안내 n");

)

다른 사람

(

printf ( "\ N 개의 장치를 열고 \ 안내 n \ n");

)/ / [정보]를 얻을

int 장치 = USBDevice -> DeviceCount ();

int altInt = USBDevice -> AltIntfcCount ();

int curInt = USBDevice -> AltIntfc ();

int eptCount = USBDevice -> EndPointCount ();

int maxPaketSize = USBDevice -> BulkOutEndPt -> MaxPktSize;/ / [인쇄 정보]를

법정 << "FriendlyName :"<<USBDevice -> FriendlyName <<endl;

/ / 법정 << "번호 사이 프러스 장비 :"<<장치 <endl을 <;

법정 << "대체 인터페이스의 개수 :"<<altInt <<endl;

법정 < "는 인터페이스를 사용 <:"<<curInt <<endl를;

법정 << "번호 종점의 :"<<eptCount <<endl;

1 절판 대량의 법정 << "최대 Paket 사이즈 :"<<maxPaketSize <<endl;

법정 << "송금 크기 ="<<USBDevice -> BulkOutEndPt -> GetXferSize () <<endl;/ / [리포트 유형 및 방향에] 모든 종점

문자열 방향을 입력합니다;

int C = 0 (용; C <eptCount; C 로)

(

(USBDevice -> 종점의 [C] -> bin을)하는 경우

(

방향 = "입력";

)

다른 사람

(

방향 = "출력";

)

(USBDevice -> 종점 [C] -> 속성) 스위치

(

경우 0 :

유형 = "권한";

휴식;

경우 1 :

유형 = "등시";

휴식;

경우 2 :

유형 = "일괄";

휴식;

사례 3 :

유형 = "인터럽트";

휴식;

)

법정 << "종점"는 <C << "는"<<유형 << ""<<방향 <<endl입니다 <;

)/ / [속도 테스트]를

메기 서명되지 않은 아웃 [512];

메기 [512]에서 서명되지 않은;

time_t t_start, t_end;

더블 t_elapsed;

/ / 배열 초기화

(다 = 0; C <513; C 로)

(

밖으로 [C] = 0x00 C를;

[C] = 나타내고 0x01에;

)

/ / 테스트를 시작합니다

시간 (& t_start); / / 현재 시간을 얻을

더블 맥 = 0 (용; 맥 <65535; 맥 )

(

USBSend512 (밖으로, USBDevice);

USBGet512 (에, USBDevice);

)

시간 (& t_end);

t_elapsed = difftime (t_start t_end);

법정 << "는"<t_elapsed <<endl <;

/ / [마지막 두 배열을 동일?]

카 bool = true로;

(다 = 0; C <512; C 로)

(

(다] [하는 경우! = 아웃 [C])

(

카 = FALSE로;

)

)

면 (카)

(

법정 << "에서 <<endl"아웃 같음;

)

다른 사람

(

법정 << "에서는 같지 않음 <<endl"절판 않는다;

)

/ / [주요]의 끝

USBDevice -> 닫기 ();

반환;

)//************************************************ ***********

/ / 함수

//************************************************ ***********bool USBSend512 (서명 char *로 아웃, CCyUSBDevice *의 USBDevice)

(

/ /이 함수는 USB를 통해 오픈 종점에 512 바이트를 전송합니다

/ / 만약 확인을 TRUE로, 거짓없는 경우가 존재 EP에 반환

bool = FALSE로 확인;

오랫동안 길이 = 512;(USBDevice -> BulkOutEndPt) / EP는 있는지 / 체크면

(

확인 = (USBDevice -> BulkOutEndPt -> XferData (밖으로, 길이)); / / 배열을 보내는

)

다른 사람

(

확인 = FALSE로;

)

확인을 반환;

)

//************************************************ ***********

bool USBGet512 (에 서명 char *로, CCyUSBDevice *의 USBDevice)

(

/ /이 함수는 USB를 통해 열려있는 종점에서 512 바이트를 얻을 수

/ / 만약 확인을 TRUE로, 거짓없는 경우가 존재 EP에 반환

bool = FALSE로 확인;

오랫동안 길이 = 512;(USBDevice -> BulkInEndPt) / EP는 있는지 / 체크면

(

확인 = USBDevice -> BulkInEndPt -> XferData (에, 길이);

)

다른 사람

(

확인 = FALSE로;

)

확인을 반환;

)

//************************************************ ***********

무효의 wait_seconds (int 초)

(

clock_t endwait;

endwait = 시계 () 초 * CLOCKS_PER_SEC;

(클럭 () <endwait) 동안

()

)

 
내가 문제를 해결 확신 해요 내가.그래도 조금 보이는데 사실로 좋다.

나는 데이터의 무한한 공간을 소비 / 전달했습니다 변화에 bulksrc.hex 펌웨어.내가 깃발 가정 그 준비의 종류이 좀 / 삭제 설정을 발생합니다.따라서 8051 종점을로드하거나하지 않습니다 읽을 시간이 걸릴 수 있습니다.이 변경 사항은 혼자 속도 준을 많이 한 날.

다른 요점은 그게 FFFF로부터 0x200 설정 사용) 나 (SetXferSize 있습니다.내가 추천 appnote 전 모르겠 그게 정확히 무슨지만.

제 3 지점)은 사용의입니다 XferData (.난 큰 바이트 배열을 사용하는 전송 512 ...어떤 패킷 단 하나의 USB 순대.이제 패킷을 대표하는 128 전화와 함께 각각의 (배열이 메서드 메기 내 손으로 그것을 포인터로 큰 FFFF).이러한 읽기의 10000 16 초 소요 날 그 근처에있을 거라고 41메가바이트 / s의

읽기 100000은 162 초 정도 걸립니다.

 
bulkloop의 경우에만 / 모든 데이터가 종점에 writtent입니다 절판는 USB에 의해 종점 반환됩니다.저기 ezUSB 내에 데이터 소싱 안돼.이 마이크로 컨트롤러에서 데이터의 이동 8051 출력 가난하여 수행할 수에있다.그래서 당신은 속도를 충분히 얻을 수 없습니다.

의 경우에는 bulksrc) 동안 (하나의 인디애나 종점 EP8) 전송 데이터를 EP4 (다시 종점 recived 하나의 출력, 나머지는 독립적입니다.EP6 실제로 소스 고정 512 바이트를 포장.

그것은 분명하지 EP에 무엇이 귀하의 응용 프로그램에 사용.최소하는 참여는, Ep4 그때도 8051 있도록하여 데이터 작업을 EP4 및 복사도 보내면 당신은하지 않습니다.
Ep2은 마이크로 컨트롤러에서 요구하지 않고 모든 데이터를 받고 데이터를 반영하도록 노력하겠습니다없이 컨트롤을 반환합니다 비슷하게 유지 EP6 및 마이크로 컨트롤러에서 간섭 /.이것은 출력 대역폭이 높은 것입니다 결과입니다.그 디자인의 ezUSb의 본질이야.

SetXferSize ()는, 내부 버퍼를 반환하기 전에 (애플 리케이션) 할 수의 USB 조정에서 데이터를 더욱 따라서 드라이버의 버퍼 및 오버헤드가 낮은 결과가 있습니다.이것은 일정한 한도 얻기 위해 대역폭 않는 도움 있지만하지 1Mbps에서 41MBps.

또한 당신의 첨부 sampel 코드, 쇼, 그 BulkOutEndPt을> 당신은 사용 USBDevice -> BulkInEndPt USBDevice - 어느과 EP2) Ep6하여 기본 만들기를 가리킨 사용 가능한 첫 번째 나올 종점 각각 (.대역폭 결과에서 더 높은 경로의 개입에 USB 데이터 8051 그럼 안돼.

 
악의는 아니, 난 그냥 바로 이해가 내가 원하는 걸 확인 : 당신은 그 coclusions 상태에서 위에 내 모든 rigth있다, 당신은 아닌가요?

 
내가 주 당신이 알고있을 것 없어 속도를 왜 데이터 자네의 높은

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="미소" border="0" />특히 :
SetXferSize ()는 차이가 많이 만들어하지 않습니다.그냥 자신을 사용하는 bulkIO 확인 및.
데이터를 수신 및 전송 EP8에 사용되지 않습니다 bulksrc을 많이하고 차이를한다면 EP4를 사용합니다.

문제는 차이를 만드는 "입니다"아니오 마이크로의 USB 개입의 데이터 경로

최종 사용자 장치를 설계하는 동안 계속 마음이 있습니다.

 
좋아, 설명 덕분에

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="미소" border="0" />
 
SetXferSize ()는 드라이버를 호스트 컨트롤러에 설정하는 버퍼 크기를 ...cyapi으로 기본 8 것이다 .... 그것은 종점 집합 크기 *차이의 변화 (이것은 사용 SetXferSize 만들기 수)입니다 ...

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="매우 행복" border="0" />
 

Welcome to EDABoard.com

Sponsor

Back
Top