📄 iccard.h
字号:
/*
* copyright (c) 兰州瑞德高科技有限公司电专项目组
* all rights reserved.
* 文件名称: iccard.c
* 摘 要: 逻辑加密ic卡的读写操作函数
* 当前版本: v1.0
* 作 者: 杨晓卫
* 完成日期: 2004.7.29
*/
#ifndef ICCARD_H
#define ICCARD_H
#include <msp430x41x.h>
#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<len;i++)
{
*buf++=RByte();
_NOP();_NOP();_NOP();
}
RST_1;
_NOP();_NOP();_NOP();
RST_0;
}
void DataWrite(uchar com,uchar add,uchar data)//写数据
{
Start();
WByte(com);
WByte(add);
WByte(data);
Stop();
P6DIR&=~BIT0;
do{
SCL_1;
_NOP();_NOP();_NOP();
SCL_0;
_NOP();_NOP();_NOP();
}
while(!((P6IN&BIT0)==BIT0));
_NOP();
P6DIR|=BIT0;
}
void SecVerify(uchar secdata1,uchar secdata2,uchar secdata3)//密码校验
{
uchar mask,i;
uchar secbuf[4];
mask=1;
DataRead(SecMemRead,0,4,secbuf);
if(secbuf[0]>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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -