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

📄 sle4422.txt

📁 西门子4442开发代码
💻 TXT
字号:
/*

;程序最后修改时间 2001-8-11

;软件标题:sle4442 操作子程序

;软件说明:sle4442 I2C 逻辑加密卡

;_________________________________________

*/



#include <stdio.h>
#include <reg52.h>
#include <intrins.h>
#include <string.h>


#define uchar unsigned char
#define uint unsigned int
#include <serial.h>
#include <ic_data_proc.h>
#include <main_proc.h>

sbit rst=P1^6;	/*sle4442复位*/
sbit sdio=P1^0;	/*sle4442输出*/
sbit sclk=P1^5;	/*sle4442时钟*/

//定义对各存储器的操作命令

uchar code RD_MAIN_RAM=0X30;        //读主存储器 ic卡模式:outgoing data
uchar code WR_MAIN_RAM=0X38;        //写主存储器 ic卡模式:processing
uchar code RD_P_RAM=0X34;        //读保护存储器 ic卡模式:outgoing data
uchar code WR_P_RAM=0X3C;        //写保护存储器 ic卡模式:processing
uchar code RD_PSC_RAM=0X31;        //读安全存储器 ic卡模式:outgoing data
uchar code WR_PSC_RAM=0X39;        //写安全存储器 ic卡模式:processing
uchar code COMP_PSC_RAM=0X33;         //比较安全存储器 ic卡模式:processing

unsigned char xdata ISO[4];            //存放复位响应数据

//短延时

void Delay(uchar j)
{uchar data i;
i=j;
for(i;i>0;i--);
}





/**********************************************/

/*          control line state settings       */

/**********************************************/



/*******************************************************/

/*               interface routines                    */

/*******************************************************/

/*1. ISSUE a xstart condition */

void ic_start()                                   

{

  sclk=0;

  sdio=1;

  Delay(3);

  sclk=1;

  Delay(3);

  sdio=0;

  Delay(3);

  sclk=0;



}



/*2.  ISSUE a xstop condition */

void ic_stop()                                  

{

  sdio=0;

  sclk=1;

  Delay(5);

  sdio=1;

  sclk=0;

}



/*3. ISSUE a clock pulse  */

void  clock()

{



  sclk=1;

  Delay(5);

  sclk=0;

  Delay(5);

}



/*****************************************************************************/

/*6. sends 8 bit 'byte' to the sle4442       */

/*****************************************************************************/

void out_byte(uchar byte)

{

uchar data count,byte_temp;

  for (count=0;count<8;count++)

  {

          byte_temp=byte;

        sdio=0x1&(byte_temp>>count);

        clock();

  }

}



/*****************************************************************************/

/*7. reads 8 bits from the sle4442 & stores value in 'rd_data'  */

/*****************************************************************************/

static char read_data()

{    uchar data rd_data=0;

    uchar data sdio_value;

    uchar data count;

    sdio=1;

    for(count=0;count<8;count++)

    {

      rd_data=rd_data>>1;

      sclk=1;

      Delay(1);

      sdio_value=sdio;

      sclk=0;

      Delay(1);

      if(sdio_value==1)rd_data|=0x80;

      else{rd_data&=0x7f;}

    }

      return(rd_data);

}





void ic_break()

{

      sclk=0;

      Delay(1);

      rst=1;

      _nop_();

      _nop_();

      _nop_();

      rst=0;

}





/*******************************************************/

/*9. reads 32 bit ISO 

stasndard response to reset      */ 

/*******************************************************/

unsigned long ISO_no_read()

{uchar data count1; 

unsigned long *ret_data;

unsigned char xdata ISO[4];            //存放复位响应数据

     ret_data=&ISO;

    sdio=1;    rst=1; 

    Delay(1); 

    clock();

    Delay(1);

    rst=0; 

    for (count1=0;count1<4;count1++)

         {ISO[count1]=read_data();}

    rst=1;_nop_(); _nop_(); _nop_();

    rst=0; 

    return (*ret_data);

}



//读命令

//uchar comm_type; 30h,34h,31h;

//uchar read_start_addr; comm_type=30h:00-0xff;comm_type=34h:00-0xff;

uchar rd_main_ram(uchar *data_save_addr,uchar read_start_addr,uint read_bytes)

{uint data i;

     ic_start();

    out_byte(RD_MAIN_RAM);

    out_byte(read_start_addr);

    out_byte(read_start_addr);

    ic_stop();

//    read_data_temp[0]=read_bytes;

    for(i=0;i<read_bytes;i++)

        {*data_save_addr++=read_data();}

    ic_break();

    return (1);

}

//ic_card 在处理模式时进行监测是否处理完毕,最大延时255个时钟

void proc_mode_chek()

{uint  data i;

    for(i=0;i<512;i++)

        {if (sdio!=0)

            { i=511;}

         else{clock();}    

        }

}



//写命令子程序

//uchar comm_type; 38h,3ch,39h,33h;

//uchar read_start_addr; comm_type=30h:00-0xff;comm_type=34h:00-0xff;

void  write_eepram(uchar comm_type,uchar write_start_addr,uchar write_data)

{

    ic_start();

    out_byte(comm_type);

    out_byte(write_start_addr);

    out_byte(write_data);

    ic_stop();

    if

(comm_type==0x38||comm_type==0x39||comm_type==0x3c||comm_type==0x33)

        {proc_mode_chek();}

}



//写主存储器的数据,

//start_addr:从主存储器写数据的首地址

//*data_addr:要写的数据的首地址

//uint wr_bytes:要写的字节数

void wr_main_ram(uchar start_addr,(后面的省略...)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -