www.pudn.com > newrlb.rar > iccard.h


/* 
* copyright (c) 兰州瑞德高科技有限公司电专项目组 
* all rights reserved. 
 
* 文件名称: iccard.c 
* 摘    要: 逻辑加密ic卡的读写操作函数 
 
* 当前版本: v1.0 
* 作    者: 杨晓卫 
* 完成日期: 2004.7.29 
*/ 
#ifndef ICCARD_H 
#define ICCARD_H 
 
#include  
#include "predef.h" 
 
#define SDA_1    P6OUT|=BIT0 
#define SDA_0    P6OUT&=~BIT0 
#define SCL_1    P6OUT|=BIT2 
#define SCL_0    P6OUT&=~BIT2 
#define RST_1    P6OUT|=BIT3 
#define RST_0    P6OUT&=~BIT3 
    
 
#define MainMemRead       0x30 //读主存储器 
#define MainMemUpdate      0x38 // 修改主存储器 
#define ProMemRead    0x34 // 读保护存储器 
#define ProMemWrite    0x3c // 写保护存储器 
#define SecMemRead   0x31 // 读加密存储器  
#define SecMemUpdate  0x39 // 修改加密存储器 
#define DataCompare     0x33 // 比较校验密码 
 
void PowerOn(void);//上电 
void PowerOff(void);//下电 
 
 
void Reset(void);//复位 
void Start(void);//开始 
void Stop(void);//结束 
void WByte(uchar data);//写一个字节 
uchar RByte(void);// 读一个字节 
void DataRead(uchar com,uchar add,uchar len,uchar *buf);//读数据 
void DataWrite(uchar com,uchar add,uchar data);//写数据 
void SecVerify(uchar secdata1,uchar secdata2,uchar secdata3);//校验密码 
 
void PowerOn(void)//上电 
{ 
RST_0; 
_NOP(); 
SCL_0; 
_NOP(); 
SDA_0; 
_NOP();_NOP();_NOP(); 
P6DIR|=BIT1; 
P6OUT|=BIT1; 
_NOP(); 
SDA_1; 
_NOP(); 
_NOP(); 
 
} 
 
void PowerOff(void)//下电 
{ 
RST_0; 
_NOP(); 
SCL_0; 
_NOP(); 
SDA_0; 
_NOP(); 
_NOP();_NOP();_NOP(); 
P6DIR|=BIT1; 
P6OUT&=~BIT1;  
_NOP(); 
_NOP(); 
_NOP(); 
 
} 
 
 
 
void Reset(void) //GET ATR 
{ 
uchar a,i,k; 
uchar DATABUFF[4]; 
P6DIR&=~BIT0; 
 
SCL_0; 
_NOP();_NOP();_NOP(); 
 
RST_1;         //RESET 
_NOP();_NOP();_NOP(); 
SCL_1; 
_NOP();_NOP();_NOP(); 
SCL_0; 
_NOP();_NOP();_NOP(); 
RST_0; 
_NOP();_NOP();_NOP(); 
 
a=0; 
 
for(i=0;i<4;i++) 
 { 
   for(k=0;k<8;k++) 
     { 
      //SDA_1; 
       
       a>>=1; 
   
     
 
      if((P6IN&BIT0)==BIT0) 
        a|=0x80; 
      else  
        a&=~0x80; 
  
        SCL_1; 
        
       _NOP();_NOP();_NOP();  
               
        SCL_0; 
      _NOP();_NOP();_NOP(); 
       
       } 
  
 
      
      DATABUFF[i]=a; 
      _NOP(); 
      _NOP(); 
      _NOP(); 
      _NOP();       
      a=0; 
  }   
P6DIR|=BIT0; 
 }      
 
 
void Start(void) //开始 
{ 
SCL_0; 
_NOP(); 
SDA_1; 
_NOP(); 
SCL_1; 
_NOP();_NOP();_NOP(); 
SDA_0; 
_NOP();_NOP();_NOP(); 
SCL_0; 
_NOP();_NOP();_NOP(); 
} 
  
void Stop(void) //结束 
{ 
 
SDA_0; 
_NOP(); 
 
 
SCL_1; 
_NOP();_NOP();_NOP(); 
 
SDA_1; 
_NOP();_NOP();_NOP(); 
SCL_0; 
_NOP();_NOP();_NOP(); 
 
} 
 
void WByte(uchar wdata)//写一个字节 
{ 
uchar i; 
for(i=0;i<8;i++) 
 { 
 if((wdata&0x01)==0x01) 
      {SDA_1;_NOP();_NOP();_NOP();} 
 else 
      {SDA_0;_NOP();_NOP();_NOP();} 
  
      SCL_1; 
     _NOP();_NOP();_NOP(); 
      SCL_0; 
      _NOP();_NOP();_NOP(); 
   
  wdata>>=1; 
 }     
} 
 
uchar RByte(void)//读一个字节 
{ 
 
    uchar i,data; 
    P6DIR&=~BIT0; 
    data = 0; 
    for (i=0;i<=7;i++) { 
       
        data>>= 1;  
        if ((P6IN&BIT0)==BIT0)  
           data |= 0x80; 
              
        else  
           data &=~0x80; 
       
        _NOP();_NOP();_NOP(); 
        SCL_1; 
        _NOP();_NOP();_NOP(); 
        SCL_0; 
       _NOP();_NOP();_NOP(); 
        
    }  
    P6DIR|=BIT0; 
    return (data); 
 
} 
 
void DataRead(uchar com,uchar add,uchar len,uchar *buf) 
{ 
uchar i; 
Start(); 
WByte(com); 
WByte(add); 
WByte(0); 
Stop(); 
 
   
 
  for(i=0;i0) 
 { 
 for(i=0;i<3;i++) 
  { 
  if(secbuf[0]&mask) break; 
  mask<<=1; 
  } 
 } 
 
 
secbuf[0]^=mask; 
 
DataWrite(SecMemUpdate,0x00,secbuf[0]); 
DataWrite(DataCompare,0x01,secdata1); 
DataWrite(DataCompare,0x02,secdata2); 
DataWrite(DataCompare,0x03,secdata3); 
DataWrite(SecMemUpdate,0x00,0xff); 
DataRead(SecMemRead,0,4,secbuf); 
} 
 
#endif