PSoC 마그네틱 카드 리더의 기술적 배경과 특징 PSoC 마그네틱 카드 리더의 기술적 배경과 특징
김재호 2008-01-24 10:45:34

PSoC 마그네틱 카드 리더의 기술적 배경과 특징

PSoC 마그네틱 카드리더 레퍼런스 디자인은 두 트랙 마그네틱 카드리더를 구현한다. 사용자의 응용에 특정한 데이터 디코딩을 구현 할 수 있다. 또한 카드를 읽어내는 처리과정의 직렬특성으로 인해 PSoC 소자는 단일 칩 POS 컨트롤러 솔루션으로 잠정적인 역할을 할 수 있다.

자료제공│싸이프레스(www.cypress.com)

PSoC 마그네틱 카드리더 레퍼런스 디자인은 두 트랙 마그네틱 카드 리더를 구현한다. 마그네틱 카드를 읽어 내는 헤드는 PSoC으로 직접 연결되고 트랙당 3개의 저항과 2개의 커패시터만을 필요로 한다.

카드를 순방향 혹은 역방향으로 긁으면 각 트랙으로부터의 신호는 조건에 따라 양자화된다. 알고리즘에 의해 비트들을 모아 바이트 열로 묶는다. 전체 카드가 읽혀지면 데이터는 ASCII로 디코딩 되고 RS-232 인터페이스를 통하여 연결된 PC측으로 전달된다. 카드의 내용은 터미널 프로그램(하이퍼터미널 등)을 사용하여 볼 수 있다.

모든 비트들이 읽혀지기까지 디코딩을 지연함으로써 사용자의 응용에 특정한 또 다른 데이터 디코딩을 구현할 수 있다. 또한 카드를 읽어내는 처리과정의 직렬 특성으로 인해 PSoC 소자는 단일 칩 POS 컨트롤러 솔루션으로 잠정적인 역할을 할 수 있다.(그림 1)

마그네틱 카드 리더의 기술적 배경

마그네틱 카드내의 정보는 F2F 혹은 `Aiken Biphase` 코딩 형태인 디지털 형태로 저장된다. 개념은 일련의 반대극성 펄스를 연속 기록하는 것이다. 논리값 0은 하나의 긴 펄스로, 로직값1은 긴 펄스와 같은 주기가 되도록 한 짧은 펄스 두 개로 부호화한다.(그림 2) 두 개의 짧은 주기의 지속시간 합은 긴 펄스의 지속시간과 동일하다. 0이 연속한 열은 카드의 처음과 끝에 초기 동기를 위하여 쓴다. 두 가지 동기화 열은 어떤 방향으로도 읽을 수 있도록 한다.

첫 트랙에는 6 데이터비트 + 1 패리티 비트 형태로 79개까지의 문자를 포함한다. 패리티 비트는 부호내의 1의 합이 항상 홀수가 되도록 계산된다. 두 번째 트랙은 40 BCD부호(4 데이터비트 + 패리티)까지를 포함한다. 특수 부호(시작부호(SS), 종료부호(ES))는 카드 긁은 방향 결정을 위해 트랙의 시작과 끝에 위치한다.

이들 부호는 트랙데이터로 존재해서는 안됨을 주의한다. 길이방향 리던던시 체크(LRC)는 심볼 기반의 패리티 외에도 읽기 품질을 검사하기 위해 트랙의 끝에 기록된다. LRC는 SS와 ES를 포함하는 모든 트랙 데이터에 대한 XOR 연산으로 계산된다. 따라서 트랙 데이터는 다음과 같은 형태로 나타내어 진다.

Leading Zeros | SS | Data | ES | LRC | Trailing Zeros

마그네틱 카드 리더를 위해서는 신호판단조건, 아날로그 신호를 디지털 F2F코드로의 변환, F2F를 비트스트림으로의 디코딩, 비트스트림으로부터 각 부호를 분리, 카드 긁은 방향에 대한 인식, 읽은 데이터 품질 검사, 결과 프린트 하기 작업이 해결되어야 한다. 이 모든 작업은 PSoC CY8C27xxx 시리즈를 사용함으로써 해결된다. 처음 두 항은 하드웨어만으로 나머지는 펌웨어로 해결된다.

하드웨어 구조

자기 헤드 출력 신호의 진폭은 긁는 속도, 카드 상태, 카드와 헤드에 사용된 자화 물질에 따라 수 mV에서 수십 mV까지 변화한다. 진폭은 평균 카드 긁기 속도에 대해 20~30mV 근처이다. 연속 시간 모듈에 속한 PGA를 이 신호 증폭에 사용한다. 이득은 출력 신호 진폭을 ~0.5V 근처로 공급하는 24로 선택한다. 스위칭 커패시터 블록은 테스트/디버그 목적으로 외부 Port0 핀으로 넘기는 라우팅 인자로 사용된다.(그림 3)

증폭된 아날로그 신호를 F2F코드로 변환하기 위해 슈미트 트리거가 사용된다. PGA는 ACBxxCR1 블록을 수동 조작함으로써 내부 저항이 있는 슈미트 트리거로 변환된다. 이 구현에서 입력신호는 반전 연산 증폭기 입력으로 전달되고 저항성 피드백 비반전 증폭기 입력으로 연결되어 정궤환을 만든다. 히스테리시스는 원형 PGA의 이득과 PSoC 전원 레벨에 의해 결정된다. Vhyst § Vdd / KGain

본 설계에서 KGain = 16, Vdd = 5V, Vhyst § 0.3V이고 최소 마그네틱 헤드 신호는 약 ~6mV이다. 이 값은 감도와 잡음 저항성 요구에 따라 절충된다.

극성에 따른 트리거 천이 순간 이동을 없애기 위해 슈미트 트리거를 사용할 때 대칭인 문턱 값을 얻는 것이 중요하다. 트리거 문턱 값의 이동은 트리거 옵셋 전압과 함께 옵셋 PGA와 AGND 부근의 연산 증폭기 포화 전압 비대칭에 의해 결정된다. 이 모든 옵셋을 제거하기 위해 첫 PGA 입력으로 +/- 20mV 옵셋을 더하려고 PWM이 사용된다.(그림 4)

외부 저역통과 RC 필터는 PWM 출력에 더해져서 출력 클럭 주파수를 70dB 만큼 감쇄 및 느리게 변화하도록 한다. R1, R2 ,R3 및 RHead는 전압 분할기를 형성한다. PWM과 필터는 0~5V의 DC전압 혹은 AGND +/-2.5V를 생성한다. 이 옵셋은 PSoC의 입력 신호에 더해지고 입력 옵셋 전압을 보상하게 된다. 보상 과정은 카드리더가 전원인가 후 그리고 각 트랙을 읽은 후 발생한다. 보상 전압은 최소에서 최대로 그리고 역방향으로 변하고 PWM 듀티 값은 슈미트 트리거가 반대 방향으로 바뀔 때 일시적으로 저장된다. 얻은 슈미트 트리거에 대한 상위, 하위 문턱 값 두 가지는 평균하여 그 값이 PWM 듀티 사이클 레지스터에 저장된다. 이들 동작은 전용 루틴 Calibrate()에서 완성된다.

비교기 버스를 거친 슈미트트리거 출력 신호는 16비트 타이머의 캡쳐 입력으로 전달된다. 이후 모든 처리는 소프트웨어로 구현된다. 타이머 캡쳐 메커니즘을 갖춘 슈미트트리거를 사용함으로써 소프트웨어 디코딩 로직은 크게 간단화하고 인터럽트 대기로 인한 여러 요구 사항을 없애준다.

소프트웨어

주된 F2F 디코딩 동작은 타이머 캡쳐 ISR의 T1Int(), T2Int()에서 구현된다. F2F의 상승 및 하강 에지는 비트스트림 디코딩을 위해 처리되어야 한다. 그렇게 하기 위해 캡쳐 반전 제어 비트가 타이머 ISR에서 수정되는데, 타이머 펑션 레지스터의 MSB는 각 캡쳐가 발생할 때마다 반전된다. 결과적으로 다음 캡쳐 ISR는 반대 방향 에지 입력신호에 의해 트리거 된다. 캡쳐 극성을 맞춘 후에, 현재 및 지난번 타이머 값은 펄스폭을 판단하기 위해 계산된다.

동기화는 초기 카드 긁은 위상에 맞추어진다. 이 동작동안 평균 로직 값 0 지속시간이 앞서 발생하는 0들로 특별 구간 데이터에 근거해 판단된다. 이 과정은 다음 순서로 구현된다.

- 잡음 제거를 위해 처음 5개의 펄스는 무시된다.

- 다음 6개 펄스의 지속시간을 더한 다음 8로 나눈다.

얻은 값 Txwidth075는 로직 값 0의 지속시간의 75% 예측치이다. 다음 펄스들의 지속시간들은 비트스트림 로직 값 0, 로직 값 1를 디코드하도록 이 숫자와 비교된다. 만약 펄스 지속시간이 Txwidth075 보다 크다면 로직 값 0이 디코드 된다. 만약 펄스 지속시간이 Txwidth075 보다 작고 이 상황이 연속해서 두 번 발생하면 로직 값 1이 유효하다고 판단된다. 카드를 긁는 속도는 일정하지 않기 때문에 Txwidth075는 매 6개의 펄스마다 업데이트된다.

읽은 비트들은 첫 트랙에 대해서는 7 비트 폭, 두 번째 트랙에 대해서는 5 비트 폭으로 묶어진다. 묶는 과정은 처음 0이 아닌 부호를 만났을 때부터이다. 이 동작은 부호열이 채워지거나 부호가 없어 시간 경과로 끝난 경우에 멈춘다.

이어지는 데이터 처리는 인터럽트 핸들러 밖에서 구현된다. 처음 동작은 버퍼 데이터 정렬이다. 처음 로직 1은 처음 저장된 버퍼바이트내의 어떤 비트에도 위치할 수 있음을 명심하자. 그러나 SS LSB=1임은 알려져 있어서, 모든 버퍼는 처음 버퍼 바이트의 LSB =1이 되도록 이동할 수 있다. 이 작업은 T1CorrectData()와 T2Correct-Data() 루틴에 의해 완료된다.

다음 동작은 카드 긁은 방향 결정이다. 이 작업은 다음 문제로 인해 복잡성을 띄게 된다. 카드를 역방향으로 긁었을 때 LRC가 SS부호로 오인될 수 있다.

이 문제를 극복하기 위해 Find-Direction() 루틴은 다음 알고리즘을 사용한다.

- 만약 첫 트랩 버퍼에 있는 첫 부호가 SS이고, ES 부호를 포함하고 있다면 카드가 정방향으로 긁어진 것으로 가정한다.

- 그렇지 않으면 첫 트랙 버퍼는 역방향으로 읽혀진다. 만약처음 부호가 SS이고 나중에 ES가 만나지면 카드는 역방향으로 긁혀진 것으로 가정한다.

- 첫 트랙 데이터로 방향을 분석할 수 없으면 같은 동작을 두 번째 트랙에 대해서도 실시한다.

- 만약 두 번째 트랙도 방향 결정을 할 수 없으면 오류 코드가 되돌려 진다.

T1CorrectData() 루틴은 REverse-Buf()를 불러 버퍼를 역순으로 읽는다. ReverseBuf()는 버퍼내의 비트 순서 또한 변경한다. 역순으로 데이터 버퍼를 읽기 위해서 ReverseBuf() 루틴을 불러야 하고 이어지는 다음 버퍼 동작은 일반적인 방법으로 이루어진다. FindDirection() 루틴이 성공적으로 완료하면 두 버퍼는 카드 긁은 방향에 독립인 저장된 데이터를 갖는다.

다음 단계는 데이터 품질 검사이다. 이 기능은 T1CorrectData()과 T1-CorrectData() 루틴에 구현되어 있다. 루틴에서는 SS, ES부호의 존재유무, 패리티 오류, LRC 값을 계산 및 검사한다. 상태 변수는 오류 코드 저장에 사용된다.

모든 검사가 완료되면, 데이터는 RS232 인터페이스를 통해 ASCII 포맷으로 보내진다. 정상 모드에서 오류가 발생할 때 오류 메시지만이 직렬통신을 통해 보내진다. 디버그 모드로 들어가면(DEBUG 조건 컴파일 변수가 선언된다.) 오류 형태에 관한 확장된 정보가 보내지고 트랙 데이터는 데이터가 오류를 포함하고 있을 가능성에도 불구하고, 어떤 경우에도 보내진다.

더 넓은 디버그 가능성을 위해 트랙 버퍼 데이터는 터미널로 이진수 모드로 보내질 수 있다. 이 모드를 켜기 위해서는 DEBUG_RAW 조건 컴파일 변수가 선언되어야 한다.

점검 요소

디버그 및 테스트 목적을 위해 점검 요소 및 LED가 있다. 점검 요소는 다음 목적을 위해서이다.

- PGA입력에서의 헤드 1. 헤드 2의 신호

- 증폭기 출력 신호인 `채널 1 아날로그 출력`, `채널2 아날로그 출력`

- `채널 1 디지털 출력`과 `채널 2 디지털출력` - 이들 핀에서의 신호는 펌웨어로 만들어 진다. 타이머 캡쳐 ISR 이 시작하고 로직 1이 이 핀에 써진다. ISR로부터 되돌려지기 전에 이들 핀은 정리되어 이들 핀에서의 펄스는 F2F 신호 처리를 나타내게 된다.

두 개의 LED(녹색, 적색)가 각 카드 트랙 읽기 성공을 나타내기 위해 사용된다. 전원 인가 후 모든 LED가 옵셋 보정 구간동안 켜진다. 보정이 끝나면 모든 LED는 꺼진다. 프로그램이 선단의 0들을 검지하기 시작하면 양쪽 트랙 LED를 끈다. 트랙 읽기가 끝나면 읽기 처리가 양호할 때는 녹색 LED, 오류가 발생했을 때는 적색 LED가 켜진다. 모든 LED는 미리 정해진 시간 제한 뒤에는 꺼져서 새로운 카드를 읽을 준비가 되었음을 나타낸다.

소스 코드 파일들

* main.c - 모든 데이터 처리 루틴은 여기있다.

* serial(.asm, .h) - 데이터를 연결된 PC로 보내기 위한 함수들을 포함한다.

* reverse(.asm, .h) - 입력바이트에서 역방향 비트순서를 위한 함수를 포함한다.

PSoC 디자이너 설정

마그네틱 카드 리더 레퍼런스 설계는 하나의 설정으로 구성되어 있다. 다음 표 3~표 5들은 유저 모듈 이름과 베이스 모듈 형태 등을 자세히 보이고 있다. 그림 5는 PSoC 디자이너의 디바이스 에디터에서의 PSoC 블럭 리소스 사용도를 보인다.

개정 이력

* REV 1.0 - CY8C26xxx 패밀리용 초기 버전.

* REV 2.0 - 현재의 CY8C27xxx 패밀리의 새로운 기능에 맞게 재설계

 

 

<자료출처 : 월간 반도체네트워크 2006년 03월호>

디지털여기에 news@yeogie.com <저작권자 @ 여기에. 무단전재 - 재배포금지>