Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

SLE4442 Smart Card interface with PIC

Status
Not open for further replies.

nooknikz

Full Member level 5
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.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top