📄 ic4442.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 + -