개요: MAX3420E를 이용하면 범용 마이크로컨트롤러를 이용해 USB 주변장치를 간편하게 설계할 수 있다. 이 애플리케이션 노트에서는 MAX3420E와 이 소자의 SPI 인터페이스에 대해 설명하고 하드와이어 SPI 유닛이나 비트뱅잉 범용 I/O 핀을 이용해 이 소자에 액세스하는 방법에 대해 제공한다. 또한 MAXQ2000 마이크로컨트롤러를 이용한 USB 설계의 C 코드 예를 제공한다.
개요
범용 직렬 버스(USB)에 대한 글은 보통 PC에서의 새로운 접속 표준으로서의 USB의 정당성을 논하는 것으로 시작하곤 했다. 다행히 이제는 그럴 필요는 없게 되었으므로, 이 글에서의 서론 역시 짧게 쓸 수 있겠다. 임베디드 시스템에서 PC로의 접속이 필요할 경우 대세는 이제 USB이다.
Maxim Integrated Products의 새로운 칩 MAX3420E를 사용하면 어떠한 시스템에도 USB를 추가할 수 있다. 이 애플리케이션 노트에서는 범용 SPI 구현을 위한 예제 C 코드를 제공함으로써 SPI 인터페이스에 초점을 맞추고 있다. 그리고 Windows 기반 '패닉 버튼'이라는 간단한 USB HID(Human Interface Device) 코드를 만드는 것으로 글을 맺고자 한다.
무엇에든 USB 달기
마이크로컨트롤러(µC)의 선택은 종종 내장된 주변기기에 의해 이뤄진다. 어떤 프로세서에는 USB 기능이 들어 있지만, 대부분은 (특히 아주 저가형의 소자는) 그렇지 않다. I/O와 주변기기의 완벽한 조합이 갖춰진 마이크로프로세서를 선택했는데 정작 USB는 없는 경험을 해 본 적이 있는가? 이럴 때 USB를 달아 기존에 갖고 있던 개발 툴을 계속 사용하기를 원하는가?
이제 Maxim의 MAX3420E를 이용하면 어떤 마이크로컨트롤러에나 USB를 추가할 수 있게 되었다. 이 칩은 풀 스피드 USB 트랜시버, 지능형 USB 직렬 인터페이스 엔진(SIE) 및 최고 26MHz의 SCK 클록 신호로 동작할 수 있는 SPI 슬레이브 인터페이스를 제공한다. MAX3420E는 하나의 제어 엔드포인트, 2개의 이중 버퍼 방식 64바이트 데이터 엔드포인트 및 1개의 64바이트 인터럽트 엔드포인트를 사용하여 풀 스피드 USB 주변기기로서 동작한다.
버스 전원식 소형 기기
 그림 1. USB 버스 구동 제품
그림 1에는 일반적인USB 주변 기기 구조가 나와 있다. USB VBUS 와이어는 3.3V 레귤레이터에 5V 전원을 공급하여 마이크로컨트롤러와 MAX3420E를 구동하므로 외부 전원이 필요 없다. SPI 인터페이스는 3개, 4개 혹은 5개 와이어로 구성될 수 있다. 표 1은 최대 5핀 인터페이스이다.
표 1. 3~5개의 핀을 이용하는 SPI 인터페이스
| Signal |
MAX3420E Direction |
Description |
| MOSI |
In |
SPI master out, slave in |
| MISO |
Out |
SPI master in, slave out |
| SCLK |
In |
Serial clock |
| SS# |
In |
Slave select |
| INT |
Out |
Interrupt (level or pulse) |
애플리케이션이 인터럽트를 필요로 하지 않으면(레지스터 비트를 읽어서 모든 MAX3420E 인터럽트 조건을 곧바로 테스트 가능) INT 핀을 제외시키고 4핀 인터페이스를 이용할 수 있다. SPI 마스터가 양방향 데이터 인터페이스이면(동일 양방향 핀으로 MOSI/MISO) 인터페이스 핀을 추가적으로 줄일 수 있다. 그러므로 인터럽트를 지원하지 않고 양방향 데이터 핀을 이용한 SPI 인터페이스는 3개 핀만을 이용한다.
마이크로컨트롤러가 SPI 포트를 갖고 있지 않은 경우에도 별 문제는 없다. 범용 I/O 핀을 직접 토글하여 펌웨어 구동 방식의 SPI 마스터를 쉽게 구성할 수 있다. USB의 강력한 기능 중 하나는 자체적으로 속도 조절이 가능하다는 것이다. 자동으로 SPI 측의 어떠한 속도의 인터페이스에도 맞춰서 동작할 수 있다(USB 측에 대해 NAK 핸드셰이크를 사용함으로써 “지금은 바쁘니 조금 있다 시도하라”는 알림 기능을 하게 된다). 많은 USB 주변기기, 특히 사람에 연결된 기기의 경우에는 아무리 느린 SPI 인터페이스를 갖추었다 해도 아주 뛰어난 반응성을 갖고 동작할 수 있다.
그림 1의 마이크로컨트롤러가 정말로 작을 경우에는, 예를 들어 10핀짜리도 안 되는 경우는 어떨까? 단순히 USB 칩과의 통신을 위해 귀한 I/O 핀을 써 버릴 것인가? 그렇다. 그것이 바로 MAX3420E가 4개의 범용 입력과 4개의 범용 출력을 제공하는 이유이다. 간단히 말해서 MAX3420E가 8개 범용 I/O로 통신에 필요한 핀들을 대체하고 I/O 핀을 더 제공한다. 따라서 MAX3420E를 달게 되면 시스템의 I/O 핀이 실질적으로 늘어나게 된다.
대형 칩 연결
 그림 2. 대형 칩으로 연결
MAX3420E는 소형 시스템에만 사용할 수 있는 것은 아니다. 그림 2를 보면 어떻게 USB 기능을 ASIC, FPGA, DSP 또는 기타 대형의 칩에 추가할 수 있는지를 알 수 있다. 이렇게 하는 이유는 큰 칩의 경우에도 USB 기능이 내장되어 있지 않을 수 있고, 내장 USB라는 것 자체가 여러분이 원하는 것이 아닐 수 있기 때문이다. 이러한 아키텍처의 또 다른 장점은 칩을 보다 작은 공정으로 축소하여 설계할 때 USB가 필요로 하는 3.3V와 같은 ‘높은’ 전압을 구현하기 어렵기 때문이기도 하다. 이러한 설계에는 저전압의 SPI 인터페이스를 갖는 외장 USB 칩을 사용하면 이러한 문제를 쉽게 해결할 수 있다. 저전압 인터페이스를 구동하기 위해, MAX3420E에는 레벨 시프터가 내장되어 있으며 SPI 인터페이스의 동작 전압을 1.7V~3.6V 사이의 어떤 전압으로든 설정할 수 있는 VL 핀이 갖춰져 있다.
USB 분리
 그림 3. USB 분리
그림 3에서 보듯이 SPI 인터페이스가 광 분리(optical isolation)를 위한 편리한 위치이다. 이는 SPI 신호가 단방향이고 저가형 광커플러(optocoupler)를 지원하기 위해 낮은 주파수로 동작하기 때문이다.
SPI 인터페이스
SPI는 2개의 데이터 라인, 1개의 직렬 클록 및 1개의 칩 선택 신호를 사용하는 간단한 직렬 인터페이스이다. SPI 마스터는 SS# 신호를 low로 함으로써 전송을 시작하고, 직렬 클록 SCLK을 구동하여 슬레이브 장치로 데이터 입출력에 대한 클록을 동시에 제공한다. 그리고 SPI 마스터는 SS# 신호를 high로 함으로써 전송을 종료하게 된다.
SPI 인터페이스에는 4개의 클록 모드가 있는데, 이는 CPOL(clock polarity) 및 CPHA(clock phase)이라는 두 개의 모드 신호에 의해 결정된다. 이 신호들은 (CPOL, CPHA)의 형태로 표시된다. 인터페이스가 첫 번째 포지티브 클록 에지 이전에 포지티브 에지 SCKS 및 MOSI 데이터를 이용할 수 있기 위해서는 변경 없이 (0,0) 및 (1,1) 모드로 동작할 수 있다. 이러한 특성으로 인해 MAX3420E는 모드 핀이 없이도 모드 (0,0) 또는 (1,1)로 동작할 수 있다.
그림 4와 그림 5는 마이크로컨트롤러(MAXQ2000)와 MAX3420E 사이의 동일한 데이터 전송을 보여준다. 그림 4는 SPI 모드 (0,0)을 이용한 것이고, 그림 5는 SPI 모드 (1,1)을 이용한 것이다. 차이점은 SCLK 신호의 비활성 레벨로서 (0,0) 모드는 로우이고 (1,1) 모드는 하이이다.
 그림 4. SPI 인터페이스가 (0,0) 모드로 동작
 그림 5. SPI 인터페이스가 (1,1) 모드로 동작
MAX3420E가 모든 전송의 첫 번째 바이트로 명령 바이트를 수신한다. 명령 바이트는 레지스터 넘버와 방향 비트를 포함한다. 두 번째 및 이후 바이트는 데이터를 포함한다. 그림 4와 그림 5에서 명령 바이트가 클록 인(MOSI 핀)될 때 MAX3420E로부터 수신(MISO 핀)되는 8개 비트는 명령 바이트가 클록 인 될 때 항상 이용가능한 USB 상태 비트이다. 이 기능은 MISO 및 MOSI의 각각의 데이터 핀을 이용하는 인터페이스에 대해서만 활성화된다.
SPI 코드
MAX3420E를 위해 C 코드를 작성하기 위해서는 먼저 최소한의 SPI 동작을 별도의 모듈로 분리시키고 각각의 SPI 인터페이스에 대해 이 모듈을 맞춤화하는 것이다. 이 모듈은 최소한 다음 3가지만 수행하면 된다.
- SPI 초기화 (Initialize_SPI)
- 바이트 읽기 (Read byte)
- 바이트 쓰기 (Write byte)
여기서의 애플리케이션 예는 하드웨어 SPI 유닛을 이용했다. 이런 유닛을 이용하지 않는 애플리케이션을 위해서 먼저 비트뱅잉된 SPI 인터페이스를 위한 일반적인 C 코드를 살펴보도록 하자.
비트뱅잉 SPI
Init SPI
Initialize_SPI 함수는 프로세서에 따라 대부분이 변경된다. 이 함수가 인터페이스에 이용되는 특정 I/O 핀을 지정하고, 방향을 설정하고, SS = 1 및 SCLK = 0의 초기 조건을 설정한다. (여기서는 (0,0) 모드 SPI 마스터로 하였다.)
Read Register, Write Register
rreg는 MAX3420E 레지스터를 읽기 위한 C 함수이다. 매크로(모두 대문자)가 다양한 마이크로컨트롤러의 다양한 I/O 방식으로부터 이 함수는 분리된다. 매크로를 이용해서 코드가 읽기가 간편하며 프로세서는 독립적이게 된다. wreg는 MAX3420E 레지스터에 쓰기 위한 루틴이다.
프로세서를 변경하면 이들 루틴을 이용하는 일련의 매크로만 변경하면 된다. 예를 들어 아래 매크로들은 하드웨어 SPI 유닛을 포함하지 않는 마이크로컨트롤러를 위한 것이다.
#define SCLK_HI OUTA = PINSA | 0x02;
#define SCLK_LO OUTA = PINSA & 0xFD;
#define SS_HI OUTA = PINSA | 0x04;
#define SS_LO OUTA = PINSA & 0xFB;
#define MOSI(v) OUTA = (PINSA & 0x7F) | (v & 0x80);
#define MISO inval |= PINSA & 0x01;
BYTE rreg(BYTE r) // Read a register, return its value.
{
int j;
BYTE bv,inval;
inval = 0;
SS_LO
bv = r<<3; // Left-shift the reg number, WRITE=0
for (j=0; j<8; j++) // send the register number and direction bit
{
MOSI(bv) // put out a bit
bv <<= 1; // shift one bit left
SCLK_HI
SCLK_LO
}
for (j=0; j<7; j++) // get 7 bits and shift left into 'inval'
{
SCLK_HI
MISO
inval <<= 1; // shift in one bit
SCLK_LO
}
SCLK_HI // one more bit, but don't shift 'inval' this time
MISO
SCLK_LO
SS_HI
return inval; // return the byte we read in
}
void wreg(BYTE r,BYTE v) // register, value
{
int j;
BYTE bv;
SS_LO
bv = (r<<3)+2; // Left-shift the reg number, set the WRITE direction bit
for (j=0; j<8; j++) // send the register number and direction bit
{
MOSI(bv) // put out a bit
bv <<= 1; // shift one bit left
SCLK_HI
SCLK_LO
}
for (j=0; j<8; j++) // send the register data
{
MOSI(v) // put out a bit
v <<= 1; // shift one bit left
SCLK_HI
SCLK_LO
}
SS_HI
}
하드웨어 SPI
여기서는 위에서 언급했던 MAXQ2000 마이크로컨트롤러에 대해 설명한다. 간단히 말해 MAXQ2000은 최초의 저전력 16비트 고성능 RISC 프로세서이다. MAXQ2000의 Q는 'quiet'를 의미하는 것으로서 이 아키텍처가 민감한 아날로그 회로와 공존할 수 있도록 설계되었음을 나타난다. MAXQ2000은 SPI 포트를 내장하여 특히 MAX3420E에 대해 친화적이다. 다음 예는 MAXQ2000 개발 킷과 MAX3420E를 이용해서 단순하면서도 흥미로운 Windows 제품을 개발한 것이다.
MAXQ2000 하드웨어 SPI 유닛은 SCLK, MOSI, MISO는 제공하지만 SS#는 제공하지 않는다. SS# 동작의 변동성(단일 바이트 액세스와 바이트 버스트 액세스 등) 때문에 SS#에는 범용 I/O 핀을 이용하는 것이 낫다.
MAXQ I/O 셀

그림 6. MAXQ I/O 셀
그림 6은 기본적인 MAXQ I/O 셀이다. I/O 포트 비트가 port.bit 형식으로 표시되는데 ‘p’는 포트이고 ‘b’는 비트이다. 여기서는 5번 I/O 포트의 3번 비트에 대해 살펴본다(이 핀을 P53으로 표기되어 있다).
모든 I/O 셀이 플립 플롭을 이용하는데 이 예에서는 PO5.3 비트를 이용해 쓰여진다. 'O'는 출력을 의미한다. 이 플립 플롭을 아무 때나 쓸 수 있다. 이 플립 플롭이 핀으로 연결되거나 연결되지 않는 것은 방향 비트에 의해 결정된다. 출력 핀을 구성할 때 글리치를 방지하기 위해서는 플립 플롭을 핀으로 연결하기 전에 쓰는 것이 좋다.
P53 핀의 방향은 PD5.3 비트에 의해 설정된다. 'D'는 방향을 나타내며, D 신호가 핀 드라이버의 출력 인에이블로 동작해서 1 = drive, 0 = float이다. 이 핀의 상태를 PI5.3 비트를 이용해서 아무 때나 읽을 수 있다. I는 입력을 나타낸다. 내부 플립 플롭을 이용해서든(PD5.3 = 1) 외부적인 것을 이용해서든(PD5.3 = 0) 이 핀을 어떻게 구동하든 PI 비트가 핀 상태를 나타낸다.
이 구조에서 한 가지 특기할 점이 있다. P53 핀을 입력으로 구성하면 (PD5.3 = 0) 플립 플롭의 출력이 출력으로 이용되지 않으므로, 풀업 저항 스위치로 재사용할 수 있다. D = 0이면 그림 6에서 점선 및 스위치로 표시되었듯이, O 신호가 "풀업 저항 연결"을 의미하도록 재정의된다.
그림 6의 하단에서 볼 수 있듯이, 일부 I/O 핀은 인터럽트 기능을 이용한다. 인터럽트 블록이 3개 신호를 이용한다.
- 플래그 비트가 인터럽트 요청이 활성화되면 설정되고 CPU에 의해서 리셋된다.
- 에지 선택 비트는 에지 타입(포지티브 또는 네거티브)을 결정한다.
- 특정 핀에 대한 인터럽트 인에이블 비트
여기서의 애플리케이션 예에서는 MAX3420E INT 출력 핀을 포지티브 에지 트리거 인터럽트로 구성한다. MAXQ2000 측에서는 MAXQ2000 인터럽트 시스템을 이용하는 것이 아니라, 코드가 곧바로 인터럽트 플립 플롭을 테스트해서 대기중인 USB 인터럽트가 있는지 확인한다. 프로그램이 푸시버튼의 상태만 검사하고 USB 요청에 응답하므로 폴링 루프만 있으면 된다.
Init SPI
범용 I/O와 SPI 유닛 같은 특수기능 하드웨어가 MAXQ2000 I/O 핀을 공유한다. 특수 하드웨어를 이용하려면 먼저 하드웨어 블록을 구성하고 I/O 핀에 연결할 수 있도록 인에이블시켜야 한다. 아래의 SPI_Init() 루틴이 핀 방향을 설정하고 SPI 인터페이스를 구성하고 인에이블시킨다.
void SPI_Init(void)
{
// MAXQ2000 SPI port
CKCN = 0x00; // system clock divisor is 1
SS_HI // SS# high
PD5 |= 0x070; // Set SPI output pins (SS, SCLK, DOUT) as output.
PD5 &= ~0x080; // Set SPI input pin (DIN) as input.
SPICK = 0x00; // fastest SPI clock--div by 2
SPICF = 0x00; // mode(0,0), 8 bit data
SPICN_bit.MSTM = 1; // Set Q2000 as the master.
SPICN_bit.SPIEN = 1; // Enable SPI
// MAX3420E INT pin is tied to MAXQ2000 P60; make it an input
PD6 &= ~0x01; // PD6.0=0 (turn off output)
}
Read Register, Write Register
아래 함수들은 MAXQ2000의 하드웨어 SPI 유닛을 이용한 것으로, 비트뱅잉 기법에 비해서 코드가 더 작고 신속하다.
// Read a MAX3420E register, return its value.
BYTE rreg(BYTE reg)
{
BYTE dum;
SS_LO
SPIB = reg<<3; // reg number w. dir=0 (IN)
while(SPICN_bit.STBY); // loop if data still being sent
dum = SPIB; // read and toss the input byte
SPIB=0x00; // data is don't care, we're clocking in MISO bits
while(SPICN_bit.STBY); // loop if data still being sent
SS_HI
return(SPIB);
}
// Write a MAX3420E register.
void wreg(BYTE reg, BYTE dat)
{
SS_LO // Set SS# low
SPIB = (reg<<3)+2; // send reg. number w. DIR bit (b1) set to WRITE
while(SPICN_bit.STBY); // loop if data still being sent
SPIB = dat; // send the data
while(SPICN_bit.STBY); // loop if data still being sent
SS_HI // set SS# high
}
Windows 기반 패닉 버튼 예
이 USB 제품은 Windows 기반 USB HID(Human Interface Device)로 단일 ‘패닉’ 버튼을 특징으로 한다. 이 버튼을 클릭하면 모든 활성화된 PC 창이 최소화되고 바탕화면을 보게 된다. 이 버튼을 다시 누르면 모든 애플리케이션 창이 원래대로 복구된다.
USB 키보드는 흥미롭게도 여러 개의 키보드를 꽂으면 이들 모두가 동시에 동작한다. 따라서 이 패닉 버튼은 정상적인 키보드와 동작한다.
PC가 정지하면 패닉 버튼이 새로운 역할로서 PC를 위한 원격 웨이크 업 버튼으로 동작한다. 이 동작은 PC가 USB로부터의 웨이크 업을 지원하느냐 지원하지 않느냐에 따라 달라진다. 어떤 PC는 이를 지원하지만 어떤 PC는 지원하지 않는다. 이 버튼이 PC가 이 기능을 지원하는지 판단할 수 있도록 한다.
이 코드 예는 소형 USB 보조 보드(MAX3420E 포함)를 확장 커넥터에 연결하고 MAXQ2000 개발 킷에서 실행한다.
USB 설명
이 애플리케이션은 기본적인 enumeration 작업을 수행하는 USB 반복 코드를 포함한다. 이 장치의 특성에 대해서는 이 애플리케이션 노트 끝부분에 Panic_Button_Enum_Data.h 리스팅의 문자 어레이로 자세히 설명되어 있다.
이 애플리케이션은 필수적인 CONTROL 엔드포인트 0과 단일 버퍼 64바이트 엔드포인트 EP3-IN, 이 두 엔드포인트를 이용한다. MAX3420E가 2개 이중 버퍼 64바이트 엔드포인트(EP1-OUT 및 EP2-IN)를 포함하지만, 이 애플리케이션에는 이중 버퍼링의 스루풋 이점이 필요하지 않다.
HID에 대해 흔히 오해하는 것이 HID 장치가 낮은 속도로만 동작한다는 것이다. 이 애플리케이션은 키보드처럼 느린 장치라도 풀 스피드로 동작하는 것이 이로울 수 있다는 것을 보여준다. 이는 키보드가 1.5MHz 패킷이 아니라 12MHz를 전송함으로써, 더 적은 버스 대역폭을 이용하기 때문이다.

그림 7. 패닉 버튼 플로우 다이어그램
인터럽트 엔드포인트는 폴링 간격을 이용해서 USB 호스트가 얼마나 자주 IN 엔드포인트에 데이터를 요청할지를 결정한다. 매 간격마다 호스트가 이 장치의 엔드포인트 3으로 IN 요청을 전송한다. 그림 7은 이들 요청을 처리하는 간단한 상태기(state machine)이다. 장치가 열거되면 마이크로컨트롤러가 이 루틴을 반복적으로 실행한다. 작업을 간소화하기 위해 이 애플리케이션은 인터럽트 핀이 활성화되었는지 폴링한다. 마이크로컨트롤러에서 다른 동작이 실행되고 있으면 인터럽트에 대한 응답으로 Do_IN3 함수를 호출해야 한다.
이 상태기는 state와 button의 2개 전역 변수를 이용한다. C 매크로가 IDLE, RELEASE, WAIT의 3개 상태를 정의한다. state 변수는 IDLE로 초기화된다. button의 변수는 MAX3420E GPIN0 핀에 연결된 푸시버튼을 누르면 하이가 되고 그렇지 않으면 로우가 된다. main()의 무한 루프가 버튼 검사 타이머를 증가시키고, 이 시간이 종료되면 MAX3420E의 GPIO 레지스터를 읽어서 버튼 상태를 판단한다. 그리하여 불필요한 SPI 트래픽을 줄인다.
버튼을 누르지 않으면 상태 다이어그램이 2개의 왼쪽으로 향하는 분기를 취하고 아무 일도 하지 않는다. IDLE 상태에서 버튼을 누르면 곧바로 키코드를 전송해서 활성 창을 소거한다. 이것이 시퀀스 08(Windows 키) 00(예비) 07(문자 d)이다. 다음 상태는 RELEASE로 설정되고 동작이 완료된다.
MAX3420E가 USB를 통해 이 패킷을 전송하면 또 다른 EP3-IN 인터럽트 요청을 생성해서 EP3-IN FIFO를 데이터 로딩을 위해 다시 이용할 수 있다고 알려준다. 그림 7의 함수가 다시 시작된다. 이번에는 state = RELEASE이므로 이 함수가 시퀀스 00 00 00을 전송해서 "키가 눌러지지 않았다"는 것을 알려준다. 다음 상태는 WAIT으로 설정된다. 이는 "버튼이 해제되기를 기다리라"는 뜻이다.
그러면 이 함수가 WAIT 상태 분기를 이용해 버튼 해제를 탐지하기만 하면 된다. 버튼이 눌러져 있는 동안에는 아무 동작도 일어나지 않는다. 버튼이 해제되면 상태 다이어그램이 2개의 오른쪽으로 향하는 분기를 취하고 상태 변수를 다시 IDLE로 초기화해서 함수가 다음 버튼 누르기를 위해 준비되도록 한다.
대부분의 경우에 실행되는 코드가 매우 적다. 아래 코드는 그림 7의 플로우 차트를 구현하는 전체 함수이다.
void Do_IN3(void)
{
switch(state)
{
case IDLE:
if (button)
{
wreg(rEP3INFIFO,0x08); // "Windows" prefix key
wreg(rEP3INFIFO,0);
wreg(rEP3INFIFO,0x07); // "D" key
wreg(rEP3INBC,3); // arm it
state = RELEASE; // next state sends the "keys up" code
}
break; // else do nothing (and the SIE will NAK)
//
case RELEASE:
{
wreg(rEP3INFIFO,0x00); // key up
wreg(rEP3INFIFO,0x00);
wreg(rEP3INFIFO,0x00); // key up
wreg(rEP3INBC,3); // arm it
state = WAIT; // next state waits for the PB to be unpressed
}
break;
case WAIT:
if (!button)
state = IDLE;
break;
default: state = IDLE;
} // end switch
}
코드에 대한 설명
코드에 대해 몇 가지 점을 살펴볼 필요가 있다.
시간 민감 USB 이벤트
MAX3420E가 버스로 'K' 상태를 10ms 동안 구동해서 원격 웨이크 업을 시그널링한다. SPI 마스터가 이 시간을 세지 않아도 되도록 MAX3420E가 내부적으로 이 신호(및 그 외의 모든 USB 시간 민감 이벤트)를 타이밍하고, 이 시간이 완료되면 SPI 마스터에 인터럽트를 부여한다. 그러므로 SPI 마스터가 이들 이벤트를 위해 자체 타이머를 이용할 필요가 없이 곧바로 동작을 시작하고 완료 인터럽트를 기다린다.
ACKSTAT 비트
rregAS 및 wregAS 함수가 rreg 및 wreg와 한 가지 다른 점이 있다. 이들 함수가 SPI 명령 바이트에서 ACK STATUS 비트를 설정한다는 것이다. SPI 마스터(여기서는 MAXQ2000)가 이 비트를 이용해서 MAX3420E에 현재 CONTROL 전송을 서비스하는 것을 완료했다고 알려줌으로써, 상태 스테이지를 확인응답하고 CONTROL 전송을 종료한다. ACKSTAT가 내부 레지스터 비트로 존재하기는 하지만, SPI 명령 바이트에 이를 포함함으로써 빈번하게 사용되는 이 동작을 더 신속하게, 그리고 더 적은 코드로 실행할 수 있다.p>
readbytes(), writebytes() Functions
readbytes(), writebytes() 함수는 MAX3420E의 버스팅 기능을 이용한다. 이들 함수는 바이트 액세스마다 2개 SPI 바이트(명령 바이트와 데이터 바이트)를 전송하는 것이 아니라, 먼저 SS#를 드롭시키고, 명령 바이트를 전송하고, 바이트 버스트를 클록 인/아웃한 후 최종적으로 SS#를 상승시켜서 SPI 전송을 종료한다.
제품 ID 검색

그림 8. 여기에 제품 ID 스트링이 나타난다.
패닉 버튼을 처음으로 연결했을 때 제품 ID(PID) 스트링(Panic_Button_Enum_Data.h)이 짧은 메시지로 나타난다. enumeration 프로세스가 실행되는 동안 이 ID 스트링이 나타나 패닉 버튼을 HID로 식별하고, 이를 내장 Windows 드라이버와 연관시킨다.
이후의 모든 첨부는 USB 장치를 연결했을 때 Windows 사운드와 함께 표시될 때를 제외하고는 표시되지 않는다. 아무 때라도 장치 상태를 확인하려면 그림 8의 화면으로 이동한다. 이 화면은 "내 컴퓨터"에서 오른쪽 마우스 버튼을 클릭하고, "속성", "하드웨어" 탭, "장치 관리자" 버튼을 클릭한 후, "Human Interface Device" 항목을 열어 "USB Human Interface Device "에서 오른쪽 마우스 버튼을 클릭하고, "속성"을 선택하여 이동할 수 있다.
USB 표준 준수
이 코드를 보면 “단일 버튼 USB 장치를 위해 많은 작업을 해야 하는 것”으로 생각할 수 있다. 이는 어느 USB 장치이든 특정한 오버헤드를 포함하기 때문이다. 다행히 USB는 신중하게 기술됨으로써, 이 enumeration 코드를 어느 USB 장치를 위해서나(복사-붙여넣기로) 템플릿으로 이용할 수 있다.
철저한 개발자라면 자신의 설계가 USB-IF 인증을 통과할 수 있을지 확인해야 한다. USB-IF는 개발자의 설계가 어느 PC에서나 문제를 일으키지 않고 동작하는지 검증하는 곳이다. 이 애플리케이션은 USB-IF 웹사이트에서 이용할 수 있는 테스트 세트로 USB Command Verifier(USBCV 버전 1.2.1.0) 및 HID 테스트를 통과하였다. 그림 9는 이 패닉 버튼의 점수표이다.
 그림 9. 이 패닉 버튼의 USB 및 HID 테스트의 테스트 로그 및 상태 보고서
맺음말
USB 주변장치를 설계할 때 MAX3420E를 이용할 수 있다. 이 칩은 크기가 작고, 프로그래밍이 편리하며, 무료 샘플 코드가 제공된다. MAX3420E가 I/O 핀을 추가하고, SPI를 지원하는 어느 시스템에서도 유연하게 동작한다. SPI가 비트뱅잉이 매우 편리하므로, 이 설계가 모든 마이크로컨트롤러를 포함한다. 더 높은 성능을 원하면 SPI 인터페이스를 최고 26MHz로 클로킹할 수 있다.
이와 유사한 글이 Circuit Cellar 2005년 7월호에 게재되었음.
부록. 코드 리스팅
 코드 리스팅 다운로드
의견을 보내주세요! 위 내용이 도움이 되셨나요? 여러분의 의견을 기다립니다 — Maxim은 보내주신 정정이나 제안사항을 반영하고 있습니다.
이 페이지를 평가하고 의견을 보내주십시오.
자동 업데이트
관심있는 분야의 애플리케이션 노트가 나올 때 자동으로 업데이트 받고 싶으세요? 그렇다면 EE-Mail™을 신청하십시오.
| 추가 정보 | |
APP 3637: Sep 08, 2006
|
|
|
|
다운로드, PDF 형식 (205kB)
AN3637,
AN 3637,
APP3637,
Appnote3637,
Appnote 3637
|
|