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

📄 ic4442.c

📁 基于LPC915的SLE4442卡设计程序
💻 C
字号:
/*===================================================================================     
释放总线时,默认状态为:IC_DATIN-"1",IC_DATAOUT-"1",IC_SCL-"0",IC_RST-"0",IC_POW-"1"
1)RESET AND ANSWER-TO-RESET--->COMMAND MODE--->OUTGOING DATA MODE FOR READING,END WITH 
  AN ADDITIONAL PULSE TO SET I/O HIGH Z,WAITING FOR NEXT COMMAND--->COMMAND MODE--->                                         
1)RESET AND ANSWER-TO-RESET--->COMMAND MODE--->PROCESSING MODE FOR WRITING AND ERASING,
  CLOCK CONTINUOUSLY UNTIL I/O LEVEL FROM LOW TO HIGH--->COMMAND MODE---> 

=========================================================================*/        
#include "config.h"

#define   DEADLP_CONS   0x1FFF

/*IC_SLE4442 COMMANDS*/
#define   RDMEMY	    0x30                     /*READ MAIN MEMORY OUTGOING DATA(0-255)*/
#define   RDSECU	    0x31                     /*READ SECURITY MEMORY OUTGOING DATA(0-3)*/
#define   WRMEMY	    0x38                     /*UPDATE MAIN MEMORY PROCESSING(0-255)*/
#define   WRSECU	    0x39                     /*UPDATE SECURITY MEMORY PROCESSING(0-3)*/
#define   COMPAR	    0x33                     /*COMPARE VERIFICATION DATA PROCESSING*/

/*SEC4442_system information*/
#define   REFERENCE_DATA1    0x36
#define   REFERENCE_DATA2    0x35
#define   REFERENCE_DATA3    0x00

extern bit IC_ERR;

extern void delay_nus();						 // included in "ic64.c"

// ==============================================
void     ic_pulse()
{
    delay_nus();
    IC_SCL = 1;
    delay_nus();
    IC_SCL = 0;
    delay_nus();
}

//VCC  _|-----------------------------
//RST  __________|---------|__________
//SCL  ____________|-----|____________
/*[IC_4442]___卡上电后的首要操作*/
void     rst_and_answer()                   
{
    uint8 data i;   
 
    IC_RST = 1;
    ic_pulse();
    IC_RST = 0;
 
    for(i = 0; i<32; i++)   
    {
 		ic_pulse();	
    }
}

void     ic_start_4442()
{
	delay_nus();
    IC_SCL = 1;
    delay_nus();
    IC_SDA = 0;
    delay_nus();
    IC_SCL = 0;
}

void     ic_stop_4442()
{
	IC_SDA = 0;
    delay_nus();
    IC_SCL = 1;
    delay_nus();
    IC_SDA = 1; 
}

/*[IC_4442]___命令模式*/
void     ic_command(uint8 *p)
{
	uint8 data i;
	uint8 data j;
	uint8 data ch;
 
	ic_start_4442();
 
	for(i=0;i<3;i++)
    {
        ch = p[i]; 
        
        for(j = 0; j<8; j++)
        {
            IC_SDA = (bit)(ch & 0x01);
            ic_pulse();
            ch >>= 1;
        }
    }
	
	ic_stop_4442();
}

/*[IC_4442]___暂时中断IC操作*/
void     ic_break()
{
	delay_nus();
	IC_RST = 1;
	delay_nus();
	IC_RST = 0;
	delay_nus();	
}

/*读模式*/
void     outgoing_data(uint8 *p, uint8 dcnt)
{
	uint8 data i;
	uint8 data ch;
  
	ic_pulse();
 
	while(dcnt--)
    {
    	for(i = 0; i < 8; i++)
        {
        	ch >>= 1;
            if(IC_SDA)   ch |= 0x80;
            ic_pulse();
        }
        
        *p++ = ch;
    }
	
	ic_break();
}

/*[IC_4442]___擦除与写模式*/
void     processing()
{
	uint16 data i = 0;
 
  	do
    {
    	ic_pulse();
                
		if(i++ > DEADLP_CONS)  
  		{
			IC_ERR = 1;
			break;
		}
    }while(!IC_SDA);  
}

/*[IC_4442]___写操作首要操作_密码校验*/
void     psc_check()
{
	uint8 data buf[4];

// READ_SECU
	buf[0] = RDSECU;
	ic_command(buf);	
	outgoing_data(buf, 4);
 
// UPDATE EC(ERROR_COUNTER) 
	buf[0] &= 0x07;                              // 低三位有效
	
	if(buf[0] == 7)
	{   
    	buf[2] = 6;                              // 更改EC的一位
	}
	else if(buf[0] == 6)
	{
    	buf[2] = 4;                              // 更改EC的一位
	}
	else 
	{
	    IC_ERR=1;
 	}
	
	buf[0] = WRSECU;  
	buf[1] = 0;
	ic_command(buf);
	processing();
 
// COMPAR_SECU 
	buf[0] = COMPAR;
	buf[1] = 1;
	buf[2] = REFERENCE_DATA1;
	ic_command(buf);
	processing();

	buf[1] = 2;
	buf[2] = REFERENCE_DATA2;
	ic_command(buf);
	processing();

	buf[1] = 3;
	buf[2] = REFERENCE_DATA3;
	ic_command(buf);
	processing();	
 
// ERASE_EC
	buf[0] = WRSECU;
	buf[1] = 0;
	buf[2] = 0x07;                               // 全部为高
	ic_command(buf);
	processing();
 
// READ_SECU
	buf[0] = RDSECU;
	ic_command(buf);
	outgoing_data(buf, 4);

// CHECK_EC
	buf[0] &= 0x07;
	
	if(buf[0] != 0x07)     
	{
		IC_ERR=1;
	}
}

/**************读取指定地址的数据*****************/
void read4442(uint8 *p, uint8 addr, uint8 dcnt)
{
	uint8 data command4442[3];
	
	rst_and_answer();
	
	command4442[0] = RDMEMY;
    command4442[1] = addr;
    ic_command(command4442);
    
	outgoing_data(p, dcnt);
}

/**************写入指定地址的数据*****************/
void write4442(uint8 *p, uint8 addr, uint8 dcnt)
{
	uint8 data command4442[3];
    
	rst_and_answer();
	psc_check();
    
	command4442[0] = WRMEMY;
	command4442[1] = addr;

	while(dcnt--)
	{
		command4442[2] = *p++;
		ic_command(command4442);
		processing();
		command4442[1]++;
	}
}


⌨️ 快捷键说明

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