📄 iccard.h
字号:
#ifndef ICCARD_H
#define ICCARD_H
#define uint unsigned int
#define uchar unsigned char
#define ulongint unsigned long
#include <msp430x41x.h>
#define IC_SDA_1 P6OUT|=BIT0
#define IC_SDA_0 P6OUT&=~BIT0
#define IC_SCL_1 P6OUT|=BIT2
#define IC_SCL_0 P6OUT&=~BIT2
#define IC_RST_1 P6OUT|=BIT3
#define IC_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)//上电
{
IC_RST_0;
_NOP();
IC_SCL_0;
_NOP();
IC_SDA_0;
_NOP();_NOP();_NOP();
P6DIR|=BIT1;
P6OUT|=BIT1;
_NOP();
IC_SDA_1;
_NOP();
_NOP();
}
//**************************************************************************************************
void PowerOff(void)//下电
{
IC_RST_0;
_NOP();
IC_SCL_0;
_NOP();
IC_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;
IC_SCL_0;
_NOP();_NOP();_NOP();
IC_RST_1; //RESET
_NOP();_NOP();_NOP();
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_SCL_0;
_NOP();_NOP();_NOP();
IC_RST_0;
_NOP();_NOP();_NOP();
a=0;
for(i=0;i<4;i++)
{
for(k=0;k<8;k++)
{
//IC_SDA_1;
a>>=1;
if((P6IN&BIT0)==BIT0)
a|=0x80;
else
a&=~0x80;
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_SCL_0;
_NOP();_NOP();_NOP();
}
//DATABUFF[i]=a;
_NOP();
_NOP();
_NOP();
_NOP();
a=0;
}
P6DIR|=BIT0;
}
//***************************************************************************************************
void Start(void) //开始
{
IC_SCL_0;
_NOP();
IC_SDA_1;
_NOP();
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_SDA_0;
_NOP();_NOP();_NOP();
IC_SCL_0;
_NOP();_NOP();_NOP();
}
//******************************************************************************************************
void Stop(void) //结束
{
IC_SDA_0;
_NOP();
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_SDA_1;
_NOP();_NOP();_NOP();
IC_SCL_0;
_NOP();_NOP();_NOP();
}
//********************************************************************************************************
void WByte(uchar wdata)//写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
if((wdata&0x01)==0x01)
{IC_SDA_1;_NOP();_NOP();_NOP();}
else
{IC_SDA_0;_NOP();_NOP();_NOP();}
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_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();
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_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();
}
IC_RST_1;
_NOP();_NOP();_NOP();
IC_RST_0;
}
//******************************************************************************************************
void DataWrite(uchar com,uchar add,uchar data)//写数据
{
Start();
WByte(com);
WByte(add);
WByte(data);
Stop();
P6DIR&=~BIT0;
do{
IC_SCL_1;
_NOP();_NOP();_NOP();
IC_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 + -