UniHigh v1.0

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

 

드뎌 보드땜질이 끝나고 보드가 완성되었다.

clip_image001

clip_image002

 

납땜 전에 이전 강좌와 이 글을 차근차근 읽어보고 납땜에 들어가자.

납땜전에 PCB의 불량유무를 먼저 검사하자.
PCB 제조시 테스트를 거쳤고, 본좌가 몇개 테스트 해본 결과 이상이 없었지만.
안전한게 좋은거다.

테스트는 VCC와 GND핀 사이에 쇼트가 없는지,
각 I/O핀과 VCC, GND 핀사이에 쇼트가 없는지,
인접한 I/O 핀 사이에 쇼트가 없는지를 테스터기로 찍어보자.

SMD부품 -> 큰 부품 -> USB Connector -> Pin 헤더 순으로 납땜한다.

C14~C17까지의 탄탈 커페시터는 극성이 있으므로 다음과 같이 납땜한다.

clip_image001

D1의 다이오드도 마찬가지로 PCB에 마킹된 곳과 다이오드의 마킹이 일치하게 납땜한다.
D2의 발광다이오드는 극성에 주의해 다음과 같이 납땜한다.

clip_image002

극성 마킹이 윗면 귀퉁이에 점으로 찍힌 경우에는 다음과 같다.

clip_image003

LDO( U2 )도 PCB의 마킹과 깎인 면이 일치하도록 납땜한다.

clip_image004

USB Connector는 납땜할 때, 납이 많이 들어간다.
PCB의 Pad에 인두를 대어 Pad를 가열하면서 납을 충분히 녹인다.
납땜후에 USB 커넥터가 흔들리지 않고 잘 고정되어 있는지 확인하자.

마지막으로 Pin Header를 납땜할 때 주의 점. ( * UniHigh v1.0에만 해당 됨 – PCB상의 마킹 확인 바람)

만능기판에 UniHigh 모듈을 “직접 납땜”해서 쓰려고 하는 행자들은 모듈에 Pin Header를 납땜하기 전 상태에서 만능기판에 모듈을 끼우고 납땜을 하자.
본좌의 판단 착오로 UniHigh 모듈의 P1, P2사이의 간격이 만능기판의 구멍 간격보다 약간 “작다”.
따라서 Pin Header를 모듈에 그냥 납땜 후, 이를 만능기판에 끼우려고 하면 애로사항이 꽃피울 것이다.
그러므로 납땜 전에 미리 만능기판에 꽂아 다리간격이 조금 벌어지도록 한 후, 납땜을 하면 약간 벌어진 상태가 유지되므로 그 이후에는 만능기판에 꽂았다 뺏다 하기가 수월할 것이다.

clip_image005

만능기판에 소켓을 납땜하여 쓰는 행자들도 마찬가지로 소켓까지 핀 헤더에 끼워진 상태로 모듈과 만능기판에 각각 핀 헤더와 소켓을 납땜하면 나중에 장착/분리가 수월 할 것이다.( 핀 사이 간격 12칸 )
본좌가 실험해 본 결과 납땜 된 상태에서도 소켓이 약간 기울어질 수 있으므로 그냥 납땜해도 상관은 없더라.

빵판의 꽂아 쓰려고 경우는 그냥 핀 헤더를 납땜하시라. 잘 맞는다.

빵판과 만능기판을 왔다 갔다 하실 행자들은 만능기판을 기준으로 하시라.

아울러, UniHigh모듈의 주변회로를 꾸미기 위해 스스로 PCB를 뜨실 행자들을 위해 Pin Header의 규격을 첨부하니 참고 하기 바란다.

UniHigh v1.0
UniHigh Size Spec.pdf

UniHigh v1.1
UniHigh v1.1 Size.pdf

* http://muosys.egloos.com/96567에 잘못된 PCB 마킹에 대한 사항이 있으니 꼭 참고하시라. 꼭~.
( * 역시 UniHigh v1.0에만 해당 됨)

 

오늘은 디바이스가 준비되었다고 가정하고, 강좌를 진행 하겠다.
그림이 작아서 글씨가 잘 안보이는 것들은 그림을 클릭하여서 조금 크게 보자.
우리가 만든 UniHigh 모듈을 USB포트에 연결시키면, 장치관리자에 다음과 같이 인식이 된다.

clip_image001[5]

장치관리자는 시작-> 설정->제어판->시스템->하드웨어 탭->장치관리자 버튼을 누르면 나타나는 대화창에서 “범용 직렬 버스 컨트롤러” 항목을 더블 클릭하면 USB에 관련된 장치들이 나타난다.
( Windows 2000 기준 )

만일 장치관리자에서 위의 그림처럼 인식이 되지 않는다면 장치에 뭔가 문제가 있는 것이므로 납땜이 제대로 되어 있는지 한번 더 점검을 해보자.

그 다음은
clip_image002[5]

Cypress Development Kit을 깔 때,
바탕화면에 생긴 EZ-USB Control Panel 아이콘을 클릭하여 Control Panel을 열자.

우리가 지금 공부하고 있는 것은 USB장치의 펌웨어 인데, 이것을 테스트 하기 위해서는 USB 드라이버와 Win32 Application이 필요하다.
Cypress Development Kit을 설치할 때, ezusb.sys라는 드라이버 파일이 같이 설치되었고, EZ-USB Control Panel이 이 드라이버를 이용해 우리가 만든 펌웨어를 테스트 할 수 있게 만들어 주는 Win32 Application이다.

UniHigh 장치를 꽂은 채로 EZ-USB Control Panel을 실행 했다면, 다음과 같이 나타날 것이고,

clip_image004

EZ-USB Control Panel을 먼저 실행하고, 장치를 꽂았다면 “Open All” 버튼을 눌러주자.
(맨 처음 EZ-USB Control Panel를 실행 할 때에는, “FX2”를 선택해 주어야 하는 대화창이 뜰 것이다. 물론 나중에 “Target” 리스트 박스에서 이를 바꿔 줄 수도 있다.)

clip_image006

이제 우리가 이제까지 분석했던 BulkLoop 펌웨어 예제를 USB를 통해 Cypress FX2 칩에 다운로드하여 보자.
“Download” 버튼을 누르면 나타나는 대화 창에서 C:\Cypress\USBExamples\FX2\bulkloop\bulkloop.hex 파일을 선택하여 “열기” 버튼을 누른다.
그러면 USB를 통해 펌웨어가 FX2로 다운로드 된 후, FX2칩이 ReNumeration되면서 장치관리자에 다음과 같이 나타날 것이다.

clip_image007

Get XXX 버튼들을 누르면 우리가 desc.a51파일에서 보았던 decriptor들이 나타날 것이다.
그중에서 “Get Pipe”버튼을 누르면 “Pipe” 리스트박스에 파이프에 대한 정보가 뜰 것이다.
Endpoint를 Pipe라고 부르기도 한다는 것이라고 본좌가 언급한 사실을 기억하는가?

clip_image009

Endpoint 2/4는 OUT Endpoint이므로 원하는 Endpoint를 선택하고, 입력창에 숫자(16진수)의 배열을 입력한 후, “Bulk/Int”버튼을 누르면 숫자들이 FX2의 해당 Endpoint(Pipe)로 전송된다.
(“Bulk/Int”버튼이 눌리기 전에 반드시 한번은 “Get Pipe”버튼이 눌려야 어플리케이션이 Pipe를 인식하고 제대로 동작한다.)

clip_image011

마찬가지로 In Endpoint를 선택하고, Length에 숫자(앞서 입력한 숫자배열의 크기)를 입력한 후 “Bulk/Int”버튼을 누르면 FX2의 해당 Endpoint(Pipe)로부터 숫자의 배열이 전송된다

clip_image013

요기까지가 우리가 분석한 Bulkloop의 동작의 주요 부분이다.

Bulkloop의 펌웨어( TD_Init() )에서 Endpoint Buffer 세팅을 512byte, Quad Buffering으로 설정했던 것을 기억 하시는가?
이와 함께, TD_Poll()의 코드를 염두에 두고서 Bulkloop의 펌웨어가 다음의 상황에서 어떠한 반응을 보이는 지를 행자들 스스로 테스트 해 보자.
1. 버퍼 depth(4)보다 더 많은 횟수의 OUT transfer가 이루어 졌을 때.
2. 선행된 OUT transfer의 횟수보다 더 많은 IN Transfer가 행해 졌을 때,
3. OUT transfer의 길이와 요구한 IN transfer의 길이가 다를 때
4. 등등등

뭐 이 테스트가 중요한 의미를 가진 것은 아니고, 그저 우리가 분석한 bulkloop 펌웨어가 실제로 어플리케이션과 더불어 작동 할 때 일어날 수 있는 예외 상황에서 어떻게 반응하느냐를 보고자 하는 것이므로 이것저것 다양한 시도를 해 보면서 그 이유를 생각해 보시라.
낼은 본좌가 위의 실험 결과에 대한 이유를 설명하고, 우리가 전송하는 데이터에 맞춰 LED가 점등하게끔 Bulkloop 소스를 뜯어 고쳐 보자.

UniHigh을 포트에 꼽고 EZ-USB Control Panel을 실행시킨 후, “Get Pipes” 버튼을 눌러주면 다음과 같이 리스트 박스에 파이프( Endpoint ) 정보가 뜬다.

clip_image002[7]

Pipe를 “0 : Endpoint 2 OUT”으로 선택하고, “Hex xxx”에 “0 1 2 3 4 5 6 7 8 9”를 입력한 후 ( 따옴표는 제외 ) Bulk/Int 버튼을 눌러보자.
그러면 Endpoint 2로 위의 숫자 배열이 전송될 것이다.

계속해서
“1 2 3 4 5 6 7 8 9”,
“2 3 4 5 6 7 8 9”,
“3 4 5 6 7 8 9”을 전송해 보자.

여기까지는 아무 문제 없이 전송이 될 것이다.
그러나 한번 더 “4 5 6 7 8 9”를 전송하면, 잠깐 동안 Control Panel이 응답이 없다가 먼젓번과는 다르게 “Write IOCTL passed”라는 메시지가 안 나올 것이다.

왜 그럴까?
Bulkloop 펌웨어 프로젝트를 열어서 bulkloop.c의 TD_Poll()을 다시 보자.
바로

if(!(EP2468STAT & bmEP6FULL))

여기서 걸려서 if 문 안으로 들어가지 못하기 때문에 이전 네 번의 transfer와는 달리 아무 동작도 하지 않는다.

EP2의 버퍼에는 펌웨어가 처리해야 할 데이터 “4 5 6 7 8 9”가 도착 했는데, EP6의 버퍼는 꽉 차버려서
EP2BCL = 0x80; // re(arm) EP2OUT
를 호출하지 못하고 계속 TD_Poll()을 헛도는 것이다.
바꿔 말하면 호스트는 데이터를 보냈는데 디바이스로부터 ACK를 받지 못하고 있는 상태이다.
헉! ACK가 뭐냥? 하시는 행자들은 뒤쪽으로 빽 하셔서 요기를 보시라.

계속해서 Pipe를 “2 : Endpoint 6 IN”으로 선택하고, Length에 “10”을 입력한 후, Bulk/Int 버튼을 눌러보자.

clip_image003

위와 같이 IN transaction이 일어나자 마자 ( IN 버퍼에 쓸 자리가 생기므로 ) Pending되어 있던 OUT transaction이 완료되는 것을 볼 수 있을 것이다.

이제 Pipe를 “2 : Endpoint 6 IN”를 유지한 상태에서, Length에 “9”을 입력한 후, Bulk/Int 버튼을 누르면 당근 성공적으로 IN transcation이 일어날 것이다.

그러나 우리는 9 대신에 8을 입력한 후, Bulk/Int 버튼을 누질러 보자.
“Read IOCTL failed 시스템에 부착된 장치가 작동하지 않습니다.”
라는 메시지가 뜰 것이다.

다시 9를 입력한 후, Bulk/Int 버튼을 누질러 보자.
성공적으로 “Read IOCTL passed 0000 01 02 03 04 05 06 07 08 09” 라는 메시지가 출력될 것이다.
무슨 일이 일어난 걸까?

FX2의 EP6 버퍼에는 나가기를 기다리고 있는 9 byte의 데이터가 있는데, 호스트에서 8 byte를 요청하면 FX2는 8 byte를 보내는 것이 아니라, 뭔가 에러가 있음을 호스트에 알린다.
그래서 “Read IOCTL failed 시스템에 부착된 장치가 작동하지 않습니다.” 라는 메시지가 뜬 것이다.

계속 해서 9를 입력한 후, Bulk/Int 버튼을 누질러 보자.
버튼을 한번 더 누르자.
이번에는 두 번 다 성공적으로 IN transaction이 일어난다.
EP6 버퍼에 남아 있는 데이터는 각각 8, 7 byte였는데, 호스트에서 9byte를 요구하여도 자기가 가지고 있는 데이터만큼만을 주고서 Transaction을 끝낸다.

정리하면 FX2는 전송할 데이터보다 작은 데이터를 호스트가 요구하면 에러를 리턴하고, 큰 데이터를 요구하면 가지고 있는 데이터 만큼만 주고 Transaction을 성공적으로 마무리한다.

요기까지가 쓸데 없는 사설 이었다.
하지만 이 쓸데 없는 사설이 여러 행자덜이 스스로 디바이스를 개발하면서 언젠가는 부딪치게 될 문제가 될 것이다.

오늘은 Default Control Endpoint를 통해 디바이스에 명령을 주는 연습을 해 보자.
본좌가 Bulkloop예제를 변형하여 UniHigh v1.0 펌웨어 소스를 만들어 아래에 첨부하니 다운받아서 C:CypressUSBExamplesFX2폴더에 풀어 넣기 바란다.
UniHigh1.0.zip

자세한 설명은 내일로 넘기기로 하고, 오늘은 예제를 작동시키는 법을 설명한다.
행자들은 bulkloop예제와 달라진 점이 뭔지 한번 살펴보기 바란다.
(desc.a51파일과 bulkloop.c파일을 주로 건드렸고.
프로젝트 폴더에 UniHigh.h 파일을 새로 포함시켰다.)
UniHigh v1.0 펌웨어는 Default Control Endpoint로 Vender Request “0xD0”와 “0xD1”을 받아들인다.
(Dir는 “0 OUT”으로 하고, Hex~~~는 비워라.)

clip_image005[5]

전자는 PortA.7에 연결된 LED를 켜라는 명령이고, 후자는 끄라는 명령이다.
“Download” 버튼을 이용해서 펌웨어를 UniHigh 보드로 다운로드 한 후 LED를 키고 꺼 보자.
회로는 아래와 같다.

clip_image006

(이 회로는 잘못된 회로도이다. http://muosys.egloos.com/96567를 참조하시라)

clip_image008

clip_image009[5]

Advertisements

답글 남기기

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

WordPress.com 로고

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

Twitter 사진

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

Facebook 사진

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

Google+ photo

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

%s에 연결하는 중

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