Bulk Endpoint로 데이터 날리기

출처 : http://muosys.egloos.com/109906

 

오늘은 BULK OUT 트렌스퍼를 연습해 보자.

UniHigh1.5.zip

IN/OUT의 주체가 호스트란 것은 이미 설명 했으니, 이번 연습이 호스트가 데이터를 디바이스로 보내는 것이라는 것은 설명 안 해도 다들 잘 알고 계시리라.
라고 하면서 설명해 버렸다. -.-;

무엇부터 해야 될까?

빙고.
엔드포인트 디스크립터부터 추가해 주어야 하겠다.
그래서 본좌가 추가해 주었다.
Full/High Speed 똑같이 말이다.
이전 강의에서 Full Speed에서 Bulk Transfer의 Max Packet Size는 8, 16, 32, 64 byte중에 하나여야 하고, High Speedd에서는 최대 512byte여야 한다고 언급한 적이 있다.
근데 본좌가 High Speed Endpoint Descriptor의 Max Packet Size도 64로 세팅해버린 데는 남다른 사연이 있다.
바로 본좌의 귀차니즘 때문이다. -.-;
디바이스가 High Speed로 동작할 때와 Full Speed로 동작할 때를 따로 코딩해야 한다고 생각하니 너무 너무 귀찮은 생각이 들어서, 기냥 High Speed건 Full Speed건 상관없이 본좌가 코드 짜기 편하게끔 두 디스크립터를 똑같이 해버렸다.

행자들은 부디 본좌보다 부지런하길 바라며, Fx2.h에 선언된 EZUSB_HIGHSPEED() 매크로를 이용하면 내 장치가 구닥다리 컴퓨터에 붙여져서 Full Speed로 동작하는지, 아니면 최신형 신삥에 붙어서 High Speed로 동작하는 지 알 수 있다.

EZUSB_HIGHSPEED()를 사용하는 예는 Bulkloop.c의 ISR_Highspeed() 함수를 참조하시라.

추후에는 본좌가 암말 않터라도 위의 매크로를 이용해 Full/High Speed로 동작할 때, 달리 코딩해 주어야 하는 부분은 if 문으로 구분해서 코딩해 주시라.

사설이 길어졌는데….
어쨌든 Bulk Endpoint Descriptor를 추가 했으니 Desc.a51에 가서 휙~ 둘러보고 오시라.
디스크립터에 관한 설명은 이전에도 했고 해서 따로 안한다.

TD_Init()에 PortB를 output으로 설정하는 초기화 코드를 추가 했고,

SYNCDELAY;
EP2BCL = 0x80; // arm EP2OUT by writing byte count w/skip.
SYNCDELAY;
EP2BCL = 0x80;

도 추가했다.

EP2CFG = 0xA2;
요 초기화 코드는 위 코드의 앞에서 생략된 것으로 보심 되는데, 디폴트 값이기 때문이다.
T.R.M. 가서 휘딱 디비고 오시라.

EP2BCL에 아무 값이나 써 넣는 것은 OUT Endpoint Buffer를 쓰기 전에 꼭 우리가 해주어야 할 짓거리다.
http://muosys.egloos.com/81469를 참조하시라.

TD_Poll()의 마지막에 추가한 if문은 이전에 Bulkloop를 분석할 때 본 거를 쬐끔 변형한 것이므로 생각이 안 나면 http://muosys.egloos.com/75316를 다시 함 보시든지, 병원 가서 치매 치료를 받아보시라.

소스 설명은 끝이고…
아래의 회로를 꾸미시라.
Host에서 날라오는 데이터 대로 LED가 점등되도록 함 해보자.

clip_image001

어떻게 테스트를 하냐 하면 펌웨어를 다운로드 한 후에, Get Pipe 하고, Pipe 1을 선택한 후에, File Transfer버튼을 눌러 본좌가 제공한 파일을 지정해 주면 LED가 파일의 데이터 대로 깜빡거린다.
data.bin

clip_image002

이전에는 Hex … 리스트박스에 우리가 직접 데이터를 적어 넣어 주었지만, 길이가 긴 데이터는 매번 그렇게 하기가 번거로우므로 File Transfer 기능을 사용한 것이다.
이거나 그거나 데이터를 디바이스로 날린다는 거는 매한가지다.

clip_image003

본좌가 만든 bin파일은 Visual Studio같은 바이너리 파일이 편집 가능한 툴로 편집할 수 있다.

그렇게 데이터를 날리면 아래와 같이 호스트가 날린 테이터에 따라 LED가 깜빡인다.
LED가 너무 빨리 깜빡이면 우리 눈에는 안 보이므로 본좌가 TD_Poll()의 마지막 if문에서 delay를 준 것이다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: