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;i 0) { 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