Interfaccia smartcard nell’ST7SCR microcontrollore di ST

ST7 smartcard

Il microcontrollore ST7SCR di ST Microelectronics è dotato di un'interfaccia per smartcard e in questo articolo faremo una descrizione dettagliata del suo funzionamento e dei registri coinvolti per poterla utilizzare al meglio. I dispositivi ST7SCR e ST7FSCR sono membri della famiglia di microcontrollori ST7 progettati per applicazioni USB. Tutti i dispositivi sono basati su un common standard di settore Core 8-bit, con un set di istruzioni ampliate.

Architettura

L’interfaccia smartcard (CRD) del micro ST7SRC è elettricamente compatibile e certificata con gli standards ISO7816, EMV, GSM, WHQL e supporta smartcard tipo memory cards e microprocessor cards. In figura 1 lo schema a blocchi dell’interfaccia.

Figura 1. Schema a blocchi dell’interfaccia CRD

Figura 1. Schema a blocchi dell’interfaccia CRD

Sono previsti due buffer (trasmissione e ricezione) e 3 contatori (ETU, GUARDTIME,  GENERAL PURPOSE), la frequenza di funzionamento è di 4MHz e vengono effettuati controlli di parità sui byte trasmessi/ricevuti che, in caso di  errore, richiedono il rinvio dei dati. Tutte le procedure che interessano la smartcard sono interamente gestite dall’intefaccia CRD che provvede a fornire la giusta alimentazione e a disattivarsi/attivarsi quando la card viene rimossa/inserita (ISO7816-3 card deactivation sequence). Il CRD essenzialmente deve fornire in uscita al pin CRDVCC la tensione di lavoro e gestire le I/O della card che viene alimentata dallo stesso pin. La tensione della card è variabile e può essere impostata dall’utente  tramite  il  bit  VCARD del registro CRDCR: le possibili tensioni sono 5V, 3V, 1,8V e 0V.

Quando la card viene rimossa il CRDVCC viene direttamente posto a massa.
L’attivazione della card, (power-on) viene gestita via software, mentre la disattivazione (power-off) è gestita direttamente dall’hardware del dispositivo. Le I/O  delle smartcard possono essere pilotate  dal micro in 2 modi:

  • modalità UART (impostando il bit UART del registro CRDCR a 1);
  • modalità manuale (resettando il bit UART del registro CRDCR).

I registri CRDTXB  (per la trasmissione) e CRDRXB (per la ricezione) agiscono come buffer e sono connessi all’UART shift register. Per default l’UART è in modalità ricezione e commuta automaticamente in trasmissione qualora un byte venga scritto sul buffer.

Elementary Time Unit Counter

L’Elementary Time Unit Counter (ETU) è un contatore a 11-bit che lavora alla stessa frequenza di clock della scheda (4MHz). Si possono ottenere frequenze di lavoro diverse usando opportunamente  il bit  COMP del registro CRDETU1 che permette di diminuire la velocità di conteggio. Il valore è limitato alla metà del ciclo di clock, e può variare tra n e n-1 cicli di clock (dove n è il valore scritto nel registro CRDETU). La durata del carattere (10bits) è 10*(n-1/2)  cicli di clock come specificato dallo standard ISO7816-3.

Guardtime Counter

Il Guardtime Counter è un contatore a 9-bit che gestisce il frame del carattere e controlla la durata di due trasmissioni consecutive di un carattere tranne la durata della prima trasmissione. Il contatore, tra l’ultimo byte ricevuto dalla smartcard e quello successivo inviato dal dispositivo deve essere gestito dal software.

Waiting Time Counter

Questo contatore  a 24-bit  è usato per generare il segnale di timeout. L’Elementary Time Unit Counter funge da prescaler al Waiting Time Counter che si incrementa alla sua stessa velocità. Il contatore trova utilizzo sia nella modalità UART sia in quella manuale e agisce in modi differenti a seconda della modalità scelta. I registri CRDWT2, CEDWT1 e CRDWT0 possono essere solo caricati e non sono direttamente accessibili.

Modalità UART

Per entrare in modalità  UART  è sufficiente porre il micro nelle seguenti condizioni:

  • Il bit start viene riconosciuto mentre il bit UART è 1 e WTEN è 1;
  • Si effettua l’accesso per  scrivere nel  registro CRDWT2 quando il bit UART è alto e WTEN basso: in questo caso il Waiting Time Counter può essere sfruttato  come contatore d’uso generico.

In questa modalità se il bit WTEN del registro CRDCR è alto il contatore si carica automaticamente appena viene riconosciuto il bit di start. Il software può intervenire cambiando tempestivamente il valore di time out semplicemente scrivendo nei registri CRDWT. Ad esempio in modalità T=1 il software deve caricare il block waiting time (BWT) timeout nel registro CRDWT prima  dello start bit  dell’ultimo  carattere trasmesso. Dopo  la trasmissione di  quest’ultimo  carattere, segnalata tramite l’interrupt  TXC, il software scrive il valore del CWT (Character Waiting Time) nel registro CRDWT (figura 2).

Figura 2. Un esempio di gestione del Waiting Time Counter

Figura 2. Un esempio di gestione del Waiting Time Counter

Modalità Manuale

Con un accesso in scrittura al registro CRDWT2 quando il bit UART è basso e il bit WTEN è 0, viene abilitata la modalità manuale. In  modalità  manuale se il  bit  WTEN del  registro CRDCR è 0 il timer funziona come contatore general purpose: in ogni  caso entra in funzione quando si scrive nel registro CRDWT2 ponendo a 1 il bit WTEN.

Generatore di interrupt

L’interfaccia smartcard ha 2 vettori di interrupt:

  • interrupt di inserimento e rimozione scheda
  • CRD interrupt

Il CRD interrupt viene resettato ogni volta che viene letto il contenuto del registro CRDIPR. L’interrupt  di inserzione/rimozione smartcard è un interrupt esterno che si resetta automaticamente via hardware  alla fine di ogni routine di servizio (istruzioni IRET). Se un interrupt viene generato quando il registro CRDIPR è in lettura, il bit corrispondente verrà settato non appena viene terminata la lettura del registro.

Meccanismo di rilevazione della smartcard

In figura 3 è riportato lo schema a blocchi della sezione di riconoscimento della presenza della smartcard.

Figura 3. La sezione di riconoscimento della card

Figura 3. La sezione di riconoscimento della card

Il bit CRDDET del registro CRDCR indica, quando la card è inserita, se il contatto  per lo scambio dati è aperto o chiuso (card switch)  mentre quando il bit CRDIRF  del registro CRDSR  è alto  significa che la carta è presente nel lettore. Rimuovendo la smartcard, automaticamente si innesca la sequenza di disattivazione (prevista dallo standard ISO7816-3). Il bit CRDIRF commuta quando cambia il valore del pin CRDDET  e non è previsto alcun debouncing hardware. Questo cambiamento definito card switch genera un interrupt che può essere utilizzato, ad esempio, per “risvegliare”  il dispositivo da una fase di standby o per gestire il debouncing software.
Questa situazione si può riassumere in tre casi:

  • Il micro sta funzionando ed attende l’inserimento della carta.

In questo caso l’inserimento della carta genera un interrupt e il bit CRDIRF è alto ed il debouncing è gestito dal software. Terminata la procedura  di  debouncing  se il  bit CRDIRF è alto il software manda a 1 il bit CRDVCC del registro CRDCR per applicare la tensione scelta al pin CRDVCC che alimenta la smartcard.

  • Il micro è in standby quando viene inserita la carta: L’ST7 viene “risvegliato” da un interrupt, successivamente gestisce la card nella stessa maniera del caso precedente.
  • La carta viene rimossa:

Il bit CRDIRF viene posto a 0 senza alcun debouncing hardware, viene generato un interrupt di inserzione/rimozione scheda (ovvero bit CRDIRM alto   nel registro MISCR2), il pin di alimentazione  CRDVCC viene  immediatamente azzerato iniziando la sequenza di disattivazione.
La sequenza di disattivazione viene attivata in 2 modi differenti:

  • Automaticamente nel caso in cui il bit indicatore della presenza della scheda è basso (non c’è presenza di smartcard).
  • Tramite il firmware, scrivendo sul bit CRDVCC se viene rilevata una corrente troppo  alta  (bit  IOVFF alto nel registro CRDSR) o se il valore della tensione non rientra nel range supportato.

In questi casi il  bit  CRDVCC viene posto a livello basso avviando la sequenza di disattivazione che interessa i pin CRDCLK, CRDIO, CRDC4, CRDC8 secondo la temporizzazione di figura 4.

Figura 4. Sequenza di disattivazione della smartcard

Figura 4. Sequenza di disattivazione della smartcard

I REGISTRI COINVOLTI

La figura 5 mostra tutti i registri coinvolti nella gestione dell’interfaccia smartcard. Di seguito verranno analizzati dettagliatamente uno ad uno.

Figura 5. I registri di gestione dell’interfaccia CRD

Figura 5. I registri di gestione dell’interfaccia CRD

Registro di controllo CRDCR

È un registro di lettura/scrittura il cui valore di reset è 0000 0000 (0x00). BIT7 (CRDRST): Questo bit, settato direttamente dal software, resetta l’interfaccia UART del dispositivo. BIT6 (CRDDET): Il software usa questo bit per settare adeguatamente lo switch card per il riconoscimento della scheda (bit=1; scheda presente). BIT 5,4  (VCARD): Questi  2  bit,  opportunamente combinati,  determinano l’alimentazione della smartcard in accordo alla tabella di figura 6.

Figura 6. Configurazione dell’alimentazione della card

Figura 6. Configurazione dell’alimentazione della card

BIT3 (UART): Determina  la modalità  (bit=1,  UART mode, bit=0, Manual). BIT2 (WTEN): Abilita il Waiting Time Counter.  Se a 0 il conteggio viene interrotto,  a 1 il contatore si attiva. In modalità UART il contatore viene ricaricato ad ogni start bit. BIT1 (CREP): Ripetizione automatica del carattere in caso di errore di parità. Se a 0 non viene indicato alcun errore di parità quindi non si ha ritrasmissione. Se a 1 la parità viene gestita automaticamente: in trasmissione vengono ritrasmessi fino a 4 caratteri che vengono riprocessati in ricezione. Il PARF, ovvero il bit che segnala un errore di parità, è gestito dall’hardware: se un carattere trasmesso viene rifiutato il bit va a livello alto e genera un interrupt. Se  CREP  è alto il PARF  segnala l’errore alla quinta occorrenza viceversa con CREP a livello basso il PARF va a 1 al primo errore di parità rilevato. BIT0 (CONV): Selezione convenzione ISO. Se a 0 il bit di parità viene inserito dopo il bit B7 altrimenti viene aggiunto dopo il bit B0.

Registro di stato CRDSR

È un registro di sola lettura (tranne alcuni bit) e vale 1000 0000 (0x80) al reset. Bit7 (TxBEF): Indicatore (flag) del buffer di trasmissione (sola lettura). Se 0 il buffer non è pieno. Bit6 (CRDIRF): Flag di inserimento/rimozione  smartcard (sola lettura). Se 0 nessuna carta presente. Bit5 (IOVF): Flag di possibili sovraccarichi di corrente (sola lettura). Se 0 nessun sovraccarico rilevato. Bit4 (VCARDOK): Flag sullo stato della tensione (sola lettura). Se 0 la tensione è nel range specificato. Bit3 (WTF): Flag del Waiting Time Counter (sola lettura). Se 0 il WTC non ha raggiunto il valore massimo. Bit2 (TXCF): Flag di  trasmissione caratteri (lettura/scrittura).  Il bit viene settato dall’hardware e resettato dal software. Se 0 nessun carattere trasmesso. Bit1 (RXCF): Flag di ricezione carattere (sola lettura). Questo bit è settato/resettato dall’hardware quando il buffer CRDRXB viene letto. Se 0 nessun carattere ricevuto. Bit0 (PARF): Flag errore di parità (lettura/scrittura). Il bit è attivato dall’hardware e resettato dal software. Se 0 nessun errore di parità. Ad ogni carattere ricevuto il bit RXCF è sempre settato, nel caso in cui si riceva un bit con errore di parità anche il PARF va a livello alto.

Registro di controllo contatti CRDCCR

È un registro di lettura/scrittura il cui valore al reset è 00xx xx00. Bit7 (CLKSEL): Bit di selezione clock della card. Se 0 il segnale sul pin CRDCLK è una copia del bit CRDCLK altrimenti il segnale sul pin CRDCLK è alla frequenza di 4Mhz. Per attivare il clock, il bit CRDCLK deve essere cambiato prima del bit CLKSEL. Bit6: bit riservato. Bit5 (CRDC8): controllo in lettura e scrittura del pin CRDC8. Bit4 (CRDC4): controllo del pin CRDC4. Bit3 (CRDIO): controllo del pin CRDIO. Questo bit è attivo solamente nel caso in cui il bit  UART nel registro CRDCR sia 0. Se il bit UART=0 scrivendo 0 in CRDIO viene forzato a livello basso il pin CRDIO altrimenti scrivendo 1 il pin diviene open-drain. Bit2 (CRDCLK): controllo del pin CRDCLK. Entra in funzione solo nel casi in  cui CLKSEL  nel registro CRDCCR è basso. Leggendo questo bit  si legge il valore  presente nel  registro non  quello  del  pin CRDCLK. Per assicurarsi che il clock si fermi al valore dato, scrivere il valore desiderato nel bit CRDCLK prima di cambiare il bit CLKSEL da 1 a 0. Bit1 (CRDRST): controllo del pin CRDRST. Bit0 (CRDVCC): controllo del pin CRDVCC. Questo bit è gestito normalmente dal software nel caso sia presente una smartcard; in caso contrario l’hardware lo pone a 0 (bit CRDIRF=0).  Se 0 nessuna tensione applicata al pin CRDVCC, se 1 la tensione selezionata è applicata al pin CRDVCC.

Registri ETU (Elementary Time Unit, CRDETUx)

CRDETU1
Registro di  lettura/scrittura  il  cui  valore al reset è 0000 0001 (0x01) Bit7 (COMP): compensazione ETU . Se 0 la compensazione disabilitata. Per accettare valori non interi, un ciclo di clock viene sottratto dall’ETU nei bit dispari. Bit [6…3]: riservati Bits2:0 (ETU [10:8]): valore ETU nei cicli di clock della smartcard. Scrivendo nel registro CRDETU1  si ricarica il contatore ETU.

CRDETU0
Registro di lettura/scrittura. Al reset vale 0111 0100 (0x74)

Bits[7:0] (ETU[7:0]): valore ETU nei cicli di clock della smartcard. Il valore dell’ETU[10:0] deve stare nel range da 12 a 2047. Per scrivere 2048, resettare tutti i bits.

Registri Guardtime (CRDGTx)

Il Guardtime è il minimo  valore che intercorre tra due stop-bits consecutivi in trasmissione. Il valore è espresso in ETU da 11 a 511.

CRDGT1
Registro di lettura/scrittura. Al reset vale 0000 0000 (0x00).

CRDGT0
Registro di lettura/scrittura. Al reset vale 0000 1100 (0x00).

Il software scrive il valore del Guardtime counter in questi registri. Il valore viene caricato alla fine del periodo del Guard. Il Guardtime tra l’ultimo  byte ricevuto dalla smartcard e quello successivo trasmesso dal lettore deve essere gestito dal software.

Registri Character Waiting Time (CRDWTx)

CRDWT2
Registro di lettura/scrittura. Al reset vale 0000 0000 (0x00).

CRDWT1
Registro di lettura/scrittura. Al reset vale 0010 0101 (0x25).

CRDWT0
Registro di lettura/scrittura. Al reset vale: 1000 0000 (0x80).

WT:  Character Waiting  Time  espresso in  ETU (0/16777215).   I registri CRDWT0, CRDWT1 e CRDWT2 mantengono  al loro interno  il valore del WTC. Un’operazione di lettura non rientra nel valore del conteggio. Se il bit WTEN del registro CRDCR è 0, il contatore viene ricaricato appena inizia un accesso in scrittura nel registro CRDWT2. Questo come contatore d’uso generale. Se invece il bit WTEN è 1 e la modalità UART è attivata, il contatore funziona come autoreload timer: il timer viene ricaricato ogni volta che uno start bit viene inviato o riconosciuto. Nel caso in cui il timer va in overflow tra 2 start-bit trasmessi consecutivamente, viene generato un interrupt.

Registro di abilitazione interrupt (CRDIER)

Registro di lettura/scrittura. Al reset vale 0000 0000 (0x00) I bit di questo registro abilitano o disabilitano la funzione di interrupt a loro associata e sono gestiti completamente via software.
Bit7 (TXBEM): interrupt  per buffer di trasmissione vuoto
Bit6: Riservato
Bit5 (IOVFM): interrupt per corrente di overload.
Bit4: (VCRDM): interrupt  per errata tensione di alimentazione smartcard.
Bit3: (WTM): interrupt del Waiting Timer.
Bit2: (TXCM): interrupt dei caratteri trasmessi.
Bit1: (RXCM): interrupt per la ricezione dei caratteri.
Bit0: (PARM): interrupt per errore di parità.

Per tutti:               Bit=0 interrupt disabilitato:

Bit=1 interrupt abilitato

Registro di pending (attesa) interrupt (CRDIPR)

Registro di  sola lettura.  Al reset vale 0000  0000 (0x00)

Questo registro indica la sorgente di interrupt. Viene resettato dopo ogni operazione di lettura. I bit di questo registro abilitano o disabilitano la funzione pending di interrupt  a loro associata e sono settati dall’hardware.

Bit7 (TXBEP): interrupt pending per buffer di trasmissione vuoto.
Bit6: Riservato.
Bit5 (IOVFP): interrupt pending  per corrente di overload.
Bit4 (VCRDP): interrupt pending  per errata tensione di alimentazione smartcard. Bit3 (WTP): interrupt pending  del Waiting Timer.
Bit2  (TXCP): interrupt  pending    dei  caratteri trasmessi.
Bit1 (RXCP): interrupt  pending   per la ricezione dei caratteri.
Bit0 (PARP): interrupt pending  per errore di parità.

Buffer di trasmissione (CRDTXB)

Registro di lettura/scrittura. Al reset vale 0000 0000 (0x00). Questo registro è usato per inviare un byte alla smartcard.

Buffer di ricezione (CRDRXB)

Registro di lettura/scrittura. Al reset vale 0000 0000 (0x00). Questo registro è usato per ricevere un byte dalla smartcard.

 

STAMPA     Tags:, ,

Una risposta

  1. Maurizio Di Paolo Emilio Maurizio Di Paolo Emilio 3 febbraio 2017

Scrivi un commento

ESPertino è la nuova scheda per IoT compatibile ARDUINO.
Scopri come averla GRATIS!