⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iccard.h

📁 在MSP430下操作IC卡以及FLASH以及ADS1242
💻 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 + -