SLE4442 Smart Card interface with PIC

Status
Not open for further replies.

nooknikz

Full Member level 5
Joined
Apr 22, 2002
Messages
317
Helped
25
Reputation
50
Reaction score
3
Trophy points
1,298
Activity points
2,297
sle4442 atr command for read memory

I'm looking for SLE4442 Smart Card interface with PIC .
Anyone have information or source code , please share me

thank you
 

sle4442 smart card

hi,
i found this source code on the net hope it help you :

/* Filename XSLE4442.C
Description SLE4442 Smartcard Example Program
Hardware START-C51 + Smartcard Socket
Clock 11.0592 Mhz (x2)
Compiler Keil CA51 v5.0
Engineer Sanon & Kriangsak
Company Sila Research Co.,Ltd.
*/

#include <reg51.h>
#include <absacc.h>
#include <assert.h>
#include <ctype.h>
#include <intrins.h>
#include <math.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/********** I/O PORT **********/

sbit RST = P1^0;
sbit CLK = P1^1;
sbit IO = P1^2;

/********** INT-RAM WORKING AREA **********/

unsigned char SMCBUF[8];

/********** BASIC FUNCTION **********/

void dmsec (unsigned int count) { // mSec Delay
unsigned char i; // for Franklin C51 & 22.1184 Mhz
while (count) {
for (i=1;i<=228;i++);
count--;
}
}

void start (void) {
SCON = 0x52; // set RS232 parameter
TMOD = 0x20;
TH1 = 0xfd; // speed 19200
TR1 = 1;

RST = 0; // init I/O for smart card
CLK = 0;
IO = 1;
}

void smcdelay (void) { // pluse delay
unsigned char i;
i = 20;
while (i>0) i--;
}

void smcgetatr (void) { // get answer-to-reset
unsigned char a,c,x,i; // out = SMCBUF (4 byte)

RST = 1; // reset
smcdelay ();
CLK = 1;
smcdelay ();
CLK = 0;
smcdelay ();
RST = 0;
smcdelay ();

c = 0;
a = 0;
x = 0;
for (i=0;i<=31;i++) { // read 32 bit atr
IO = 1;
a >>= 1;
if (IO) a |= 0x80; else a &= 0x7f;
CLK = 1;
smcdelay ();
CLK = 0;
smcdelay ();
if (++c==8) {
SMCBUF[x++] = a;
c = 0;
a = 0;
}
}
}

void smcstart (void) { // start condition
CLK = 0;
IO = 1;
CLK = 1;
smcdelay ();
IO = 0;
smcdelay ();
CLK = 0;
smcdelay ();
}

void smcstop (void) { // stop condition
IO = 0;
CLK = 1;
smcdelay ();
IO = 1;
smcdelay ();
CLK = 0;
smcdelay ();
}

void smcwbyte (unsigned char x) { // write 1 byte
unsigned char i;
for (i=0;i<=7;i++) {
IO = (x & 0x1) ? 1 : 0;
CLK = 1;
smcdelay ();
CLK = 0;
smcdelay ();
x >>= 1;
}
}

unsigned char smcrbyte (void) { // read 1 byte
unsigned char i,x;
x = 0;
for (i=0;i<=7;i++) {
IO = 1;
x >>= 1;
if (IO) x |= 0x80; else x &= 0x7f;
CLK = 1;
smcdelay ();
CLK = 0;
smcdelay ();
}
return (x);
}

void smcread (unsigned char com,add,len) { // read data
unsigned char i; // output = SMCBUF[]
smcstart (); // start
smcwbyte (com); // command
smcwbyte (add); // address
smcwbyte (0);
smcstop (); // stop
for (i=0;i<len;i++) { // data
SMCBUF = smcrbyte ();
}
RST = 1; // reset
smcdelay ();
RST = 0;
}

void smcwrite (unsigned char com,add,dat) { // write data
smcstart (); // start
smcwbyte (com); // command
smcwbyte (add); // address
smcwbyte (dat); // data
smcstop (); // stop
do { // wait
CLK = 1;
smcdelay ();
CLK = 0;
smcdelay ();
IO = 1;
} while (!IO);
}

unsigned char smcver (unsigned char p1,p2,p3) { // verify PSC code
unsigned char mask,i; // out 0=OK 1,2,3=Error
mask = 1;
smcread (0x31,0,4); // check error counter (EC)
if (SMCBUF[0]>0) {
for (i=0;i<=2;i++) {
if (SMCBUF[0] & mask) break;
mask <<= 1;
}
SMCBUF[0] ^= mask;
smcwrite (0x39,0,SMCBUF[0]); // write free bit in EC
smcwrite (0x33,1,p1); // compare verification data
smcwrite (0x33,2,p2);
smcwrite (0x33,3,p3);
smcwrite (0x39,0,0xff); // erase EC
smcread (0x31,0,4); // check EC
}
mask = 0; // change EC to 1,2,3
for (i=0;i<=2;i++) {
if ((SMCBUF[0] & 0x01)==0) mask++;
SMCBUF[0] >>= 1;
}
return (mask);
}

/********** MAIN **********/

void clearbuf (void) { // clear ram buffer
unsigned char i;
for (i=0;i<=7;i++) SMCBUF = 0;
}

void dump (unsigned char len) { // dump 8 byte
unsigned char i;
for (i=0;i<len;i++) {
printf ("%02bX ",SMCBUF);
}
printf ("\n");
}

void main (void) {
unsigned char i,a;

dmsec (300); // power delay
start (); // start RS232 & init I/O
dmsec (200);

printf ("XSLE4442.C Example Program ...\n");
clearbuf ();
printf ("ATR code ...\n");
smcgetatr ();
dump (4);

printf ("Dump 64 byte memory ...\n");
a = 0;
for (i=0;i<=7;i++) {
smcread (0x30,a,8);
dump (8);
a += 8;
}

printf ("Verify PSC code ...\n");
a = smcver (0xff,0xff,0xff);
if (a==0) {
printf ("OK\n");
printf ("Write 11h,22h,33h,44h, at 20-23h ...\n");
smcwrite (0x38,0x20,0x11);
smcwrite (0x38,0x21,0x22);
smcwrite (0x38,0x22,0x33);
smcwrite (0x38,0x23,0x44);
}
else printf ("Error ... %bu\n",a);

while (1); // stop
}


Fire in the Wire :idea:

Added after 18 minutes:

aslo ,
you can download a program work with the example
from:
**broken link removed**
**broken link removed**
**broken link removed**

Fire in The Wire :idea:
 

xsle4442.c

we have a reader which can do all process by itself with SLE4422, you only need to use T=0 command with cards
 

Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…