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

📄 iccard.h

📁 430读写IIC总线以及中断控制程序
💻 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 + -