|
|
Drive Smart
Cards With A Low-Cost MCU's UART
Idea for Design published in the
Electronic Design magazine on March 29, 2007.
|
|
|
DESIGN IDEAS - CMOS IC Makes Low-Cost Digital Potentiometer - Power Management In The ST62 - Automatic Power-Off Circuit Saves Battery - Simple PC Smart Card Reader Enhancement - Digital Position Encoder Does Away With ADC - Single-Supply RS-232 Transmission Without Level-Translator ICs - µC Controls Charge Pump As Background Task - Clock Multiplier Circumvents PLL - Drive Smart Cards With A Low-Cost MCU's UART - Wireless “Battery” Energizes Low-Power Devices - Harvest Energy Using A Piezoelectric Buzzer - Drive A Single-Coil Latching Relay Without An H-Bridge Circuit DESIGN CONTESTS ARTICLES
CONTACT
|
The growing need
for security and enhanced functionality in the banking, identification,
and telecom markets has increased the use of smart cards worldwide, to
the detriment of the low-security magnetic-stripe cards.
However, the development of the hardware and firmware needed for proper communications in a system based on a smart card poses new challenges to designers. Unfortunately, only some high-end microcontrollers have a dedicated UART (universal asynchronous receiver/transmitter) that can drive smart cards directly. The design described here, though, lets you drive a smart card using just the standard UART on a low-end 8-bit microcontroller, in this case an Atmel AVR ATmega 168. Smart cards have just one communication path, labeled I/O, with the outside world, so it's used as a bidirectional signal to input and output data. This signal must line up with the UART's unidirectional reception and transmission signals RxD and TxD, respectively. Because RxD is an input signal and TxD is an output signal, a 1-kΩ resistor must be used to connect them to the smartcard I/O line to avoid line contention (see the figure).
On the firmware side, the design must implement a specific procedure for the reception and transmission of data to and from the smart card (see the code listing). On the one hand, to receive a byte from the smart card, the system must disable the UART's transmitter unit –again, to avoid line contention. On the other hand, to transmit a byte to the smart card, the firmware must disable the UART's reception unit to avoid the reception of an echo character. Then it must wait until the end of the byte transmission to avoid false byte receptions. In this way, you can exchange information back and forth with the smart card using the T=0 protocol described in section 3 of the Smart Card Standard, ISO 7816-3, Electronic Signals and Transmission Protocols. As an improvement –and to fully comply with the standard describing the smart-card communication protocols– the design must implement the parity error detection and re-transmission scheme defined in the ISO 7816-3 standard. #include
<avr/io.h> #define
CARD_BAUD_RATE
12711 /*****************************************************************************
UBRR0H = (unsigned
char)(ISO7816_BAUD_RATE>>8);
// Set the baud rate register
UCSR0B = ((1 << RXEN0) | (1 << TXEN0));
// Enable USART0 receiver and /*****************************************************************************
while (!(UCSR0A &
(1<<RXC0)));
// Wait for incomming data
return (UDR0);
// Read in /*****************************************************************************
while (!(UCSR0A &
(1<<UDRE0)));
// Wait for empty transmit buffer
UCSR0A |= (1 << TXC0);
while (!(UCSR0A &
(1<<TXC0)));
// Wait for end of transmission
Listing:
Functions to initialize, receive a byte, and send a byte to the smart
card through the Atmel AVR microcontroller’s UART |
|