用【 小 | 中 | 大 】字体浏览 能给我一个吗! [popo2673] 2005-2-18 15:44:18
能给我一个吗!
能给我一个吗 [popo2673] 2005-2-18 15:46:13
能给我一个吗!
billow_ch@163.com
谢谢!
1 [qllaoda] 2005-2-18 15:52:48
#define inw(x) inpw(x)
#define outw(x, y) outpw(y, x)
#define usleep(x) delay(x/1000)
#endif
#define POWERUP 1
#define POWERDOWN 0
#define HIGH 1
#define LOW 0
#define STATUSW 0x350 //根据自己的硬件定义
#define TCLK 8 //3.3
#define TRH 1 //0.1
#define TDVR 4 //2 max
#define TCH 1 //0.2
#define TCL 1 //0.2
#define TDV 4 //2 max
#define TOH 1 //0
#define TSC 1 //0
#define THC 1 //0.2
#define TCHP 3000 //2000
#define TDS 1 //0.2
#define TDH 1 //0
#define TSPR 5 //2.2
#define THPR 1 //0.2
#define TCHP1604 5000 //5000
/*IC卡操作底层函数说明:
IC卡座的引脚定义示意图如下:
VCC [C1] [C5] GND
RESET [C2] [C6] No Use
CLK [C3] [C7] I/O
FUS [C4] [C8] PGM
*/
void _CardSetPower(int level)
{
/*
功能:将IC卡读写器Vcc段上电或下电。插入或者拨出IC卡前请先下电。
输入:Level
当Level=POWERUP,给IC卡读写器上电。
当Level=POWERDOWN,给IC卡读写器下电。
输出:无
*/
/*根据自己的硬件编写处理过程*/
usleep(2000);
}
void _CardDataDir(int level)
{
/*
功能:设置MEMORY卡数据传输方向。
输入:Level
当Level=1,读MEMORY卡。
当Level=0,写MEMORY卡。
输出:无
*/
/*根据自己的硬件编写处理过程*/
}
void _CardSetReset(int level)
{
/*
功能:置IC卡读写器Reset高或低。
输入:Level
当Level=1,给IC卡读写器Reset端置高。
当Level=0,给IC卡读写器Reset端置低。
输出:无
*/
/*根据自己的硬件编写处理过程*/
}
void _CardSetPGM(int level)
{
/*
功能:置IC卡读写器PGM高或低。
输入:Level
当Level=1,给IC卡读写器PGM置高。
当Level=0,给IC卡读写器PGM置低。
输出:无
*/
/*根据自己的硬件编写处理过程*/
}
void _CardSetClock(int level)
{
/*
功能:置IC卡读写器Clock高或低。
输入:Level
当Level=1,给IC卡读写器Clock置高。
当Level=0,给IC卡读写器Clock置低。
输出:无
*/
/*根据自己的硬件编写处理过程*/
}
int _CardPutIO(int IOData)
{
/*
功能:将数据由IC卡读写器IO端输出。
输入:IOData输出数据,值是0或1。
输出: 0 = 正确
-1 = 卡不在位
*/
unsigned int status;
if(_CardReady() == 0)
return -1;
_CardDataDir(LOW);
/*根据自己的硬件编写处理过程*/
return 0;
}
int _CardReady()
{
/*
功能:查询卡座内是否有卡
输入:无
输出:1--卡座内有卡; 0--座内无卡
*/
unsigned int status;
/*根据自己的硬件编写处理过程*/
if(status == 0)
return 1;
else
return 0;
}
int _CardReadIO()
{
/*
功能:读取IC卡读写器IO端数据
输入:无
输出:-1 = 卡不在位
0 = IC卡输出的数据。
1 = IC卡输出的数据。
*/
unsigned int status;
if(_CardReady() == 0)
return -1;
_CardDataDir(HIGH);
/*根据自己的硬件编写处理过程*/
if(status != 0)
return 1;
else
return 0;
}
void _CardDelay(int usecond)
{
/*
功能:延时。执行usecond个基本延时单位,每个基本延时单位指系统执行一次inw所需的时
间(约为1.5us)。。
输入:usecond
输出:无
*/
int i;
for(i=0; i<usecond; i++)
inw(STATUSW);
}
////////////////////////////////////////////////////////////////////////////
/////////ATMEL AT88SC102/AT88SC1604不等分区IC卡基本函数/////////////////////
////////////////////////////////////////////////////////////////////////////
int _C102Reset()
{
/*
功能:如果卡在位,上电并对AT88SC102型MEMORY卡复位。
输入:无
输出:-1 = 卡不在位;0 = 正常
*/
if(_CardReady() == 0)
return -1;
_CardSetType(MEMORYCARD);
_CardSetPower(POWERUP);
_CardSetPGM(LOW);
_CardSetReset(HIGH);
_CardSetClock(LOW);
_CardDelay(TRH); //需延时0.1微秒Trh
_CardSetReset(LOW);
_CardDelay(TDVR); //2微秒后地址0数据有效 Tdvr
return 0;
}
void _C102AddsInc(int count)
{
/*
功能:给出count个时钟脉冲,使AT88SC102型IC卡内部地址计数器增加count次。
输入:count
输出:无
*/
int i;
for(i=0; i<count; i++)
{
_CardSetClock(HIGH);
_CardDelay(TCH); // Tch=0.2微秒
_CardSetClock(LOW);
_CardDelay(TCL); //Tcl=0.2微秒
_CardDelay(TDV); //Tdv=2微秒
}
}
2 [qllaoda] 2005-2-18 15:53:18
int _C102Addressing(int address)
{
/*
功能:如果卡在位,上电,复位,并使AT88SC102型IC卡内部地址计数器为address。
输入:address
输出:-1 = 卡不在位;0 = 正常
*/
if (_C102Reset() < 0)
return -1;
_C102AddsInc(address);
return 0;
}
int _C102Read(int address, int bitlen, unsigned char *retmsg)
{
/*
功能:从IC卡地址address开始读取bitlen个比特数据。如果address不小于0,先执行上电
和复位操作。
输入:address:起始比特地址。 如果小于0, 从当前地址开始; 如果等于-2,读后地址不
加并且bitlen应为1
bitlen 要读的比特长度,应该是8的倍数,否则,最后的比特将放在低字节位(B7-
-B0)
输出:retmsg: 返回的内容,已经组成字节
返回值: -1 = 卡不在位;
0 = 正确
*/
int i, k;
int ch;
if(address >= 0)
{
if( _C102Addressing(address) < 0)
return -1;
}
for(i=0, k=0; i<bitlen; )
{
ch = _CardReadIO();
if( ch < 0 )
return -1; //卡不在位
k = (k << 1) | (ch & 1);
*retmsg = (unsigned char)(k & 0xFF);
i++;
if(i%8 == 0)
{
retmsg++;
k=0;
}
if(address != -2)
_C102AddsInc(1);
}
return 0;
}
int _C102Write(int address, int bitlen, unsigned char *msg)
{
/*
功能:从IC卡地址address开始向IC卡写bitlen个比特数据。如果address不小于0,先执行
上电和复位操作。
输入:address:起始比特地址, 如果小于0, 从当前地址开始, 如果等于-2,写后地址不
加, bitlen应为1
bitlen: 要写的比特长度,应该是8的倍数,否则msg应左对齐
msg: 要写的内容,字节形式
输出:返回值: -1 = 卡不在位;
-2 = 写入失败,与读出的不一致。
0 = 正确
*/
int i, k;
int ch;
if(address >= 0)
{
if( _C102Addressing(address) < 0)
return -1;
}
for(i=0, k=7; i<bitlen; i++)
{
ch = *msg;
ch = ch >> k;
ch &= 1;
k--;
if(k < 0)
{
msg++;
k = 7;
}
////////////////////////////////////////////////
if(ch == 0)
{
_CardSetClock(LOW);
_CardSetPGM(HIGH);
_CardDelay(TDV); //Tdv=2us
if(_CardPutIO(LOW) < 0)
return -1;
_CardDelay(TSPR); //Tspr
_CardSetClock(HIGH);
_CardDelay(THPR); //Thpr=0.2us
_CardSetPGM(LOW);
usleep(TCHP);
_CardSetClock(LOW);
_CardDelay(TDV); //Tdv=2us
}
if( _CardReadIO() != ch )
return -2;
if(address != -2)
_C102AddsInc(1);
}
return 0;
}
int _C102Erase(int address, int bitlen)
{
/*
功能:从IC卡地址address开始,擦除IC卡中bitlen个比特数据。如果address不小于0,先
执行上电和复位操作。
输入:address:起始比特地址, 如果小于0, 从当前地址开始, 如果等于-2,擦除后地址不
加, bitlen应为1
bitlen: 要擦除的比特长度,应该是8的倍数,否则msg应左对齐
msg: 要写的内容,字节形式
输出:返回值: -1 = 卡不在位;
-2 = 擦除失败,与读出的不一致。
0 = 正确
*/
int i;
if(address >= 0)
{
if( _C102Addressing(address) < 0)
return -1;
}
for(i=0; i<bitlen; i+=16)
{
_CardSetClock(LOW);
_CardSetPGM(HIGH);
评论0