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

📄 at88scxx.c

📁 Atmel公司推出了最新的加密芯片AT88SC0104C~25616C系列
💻 C
📖 第 1 页 / 共 3 页
字号:

if ((pw_select&0x0f)==0x00)
   for(j=0;j<3;j++)
      {pw[4+j]=PW_WRITE0[j];}
else if ((pw_select&0x0f)==0x01)
   for(j=0;j<3;j++)
      {pw[4+j]=PW_WRITE1[j];}
else if ((pw_select&0x0f)==0x02)
   for(j=0;j<3;j++)
      {pw[4+j]=PW_WRITE2[j];}
else if ((pw_select&0x0f)==0x03)
   for(j=0;j<3;j++)
      {pw[4+j]=PW_WRITE3[j];}
else if ((pw_select&0x0f)==0x04)
   for(j=0;j<3;j++)
      {pw[4+j]=PW_WRITE4[j];}
else if ((pw_select&0x0f)==0x05)
   for(j=0;j<3;j++)
      {pw[4+j]=PW_WRITE5[j];}
else if ((pw_select&0x0f)==0x06)
   for(j=0;j<3;j++)
      {pw[4+j]=PW_WRITE6[j];}
else
   for(j=0;j<3;j++)
      {pw[4+j]=PW_WRITE7[j];}

for(j=0;j<3;j++)
   {
   GPA_CLOCK(pw[4+j],0x05);
   pw[4+j]=GPA[0];
   }
pw[0]=0xba;
pw[1]=pw_select&0x0f;
pw[2]=0x00;
pw[3]=0x03;
write(pw);
Wait_For_AckPolling();

pw[0]=0XB6;
pw[1]=0X00;
pw[2]=pw_select&0x0f;
pw[2]=pw[2]*0x08;
pw[2]=pw[2]+0xb0;
pw[3]=0x01;
read(pw);
Wait_For_AckPolling();

GPA_CLOCK(0x00,0x05);
GPA_CLOCK(pw[2],0x01);
GPA_CLOCK(0x00,0x05);
GPA_CLOCK(0x01,0x01);
pw[4]=pw[4]^GPA[0];
GPA_CLOCK(pw[4],0x01);
GPA_CLOCK(0x00,0x05);

return pw[4];
}

//******************verify_read_pw********************************
//可以用本函数校验读密码,但只开放读权限
//校验读密码组主函数,正确校验了读密码后只开放读
//pw_select:密码套数选择
//PAC:密码校验错误计数器.PAC=0xff表示认证通过,PAC!=0xff表示认证未通过或无器件
//****************************************************************
/*unsigned char verify_read_password(unsigned char pw_select)
{
unsigned char j;
unsigned char idata pw[7];
if ((pw_select&0x0f)==0x00)
   {for(j=0;j<3;j++)
   {pw[4+j]=PW_READ0[j];}}//{*(p+42+j)=PW_WRITE0[j];}}
else if ((pw_select&0x0f)==0x01)
   for(j=0;j<3;j++)
   {pw[4+j]=PW_READ1[j];}
else if ((pw_select&0x0f)==0x02)
   for(j=0;j<3;j++)
   {pw[4+j]=PW_READ2[j];}
else if ((pw_select&0x0f)==0x03)
   for(j=0;j<3;j++)
   {pw[4+j]=PW_READ3[j];}
else if ((pw_select&0x0f)==0x04)
   for(j=0;j<3;j++)
   {pw[4+j]=PW_READ4[j];}
else if ((pw_select&0x0f)==0x05)
   for(j=0;j<3;j++)
   {pw[4+j]=PW_READ5[j];}
else if ((pw_select&0x0f)==0x06)
   for(j=0;j<3;j++)
   {pw[4+j]=PW_READ6[j];}
else
   for(j=0;j<3;j++)
   {pw[4+j]=PW_READ7[j];}

for(j=0;j<3;j++)
{
GPA_CLOCK(pw[4+j],0x05);//GPA[0]=pw[4+j];GPA_CLOCK(0x05);
pw[4+j]=GPA[0];//*(p+42+j)=*(p+11);
}
pw[0]=0xba;//*(p+38)=0xba; //
pw[1]=pw_select&0x0f;//*(p+39)=*(p+1)&0x0f;
pw[1]=pw[1]+0x10;
pw[2]=0x00;//*(p+40)=0x00;
pw[3]=0x03;//*(p+41)=0x03;
write(pw);
delay_ms(); delay_ms();delay_ms();

pw[0]=0XB6;
pw[1]=0X00;
pw[2]=pw_select&0x0f;
pw[2]=pw[2]*0x08;
pw[2]=pw[2]+0xb4;
pw[3]=0x01;
read(pw);

GPA_CLOCK(0x00,0x05);//GPA[0]=0x00;GPA_CLOCK(5);
GPA_CLOCK(pw[2],0x01);//GPA[0]=pw[2];GPA_CLOCK(1);
GPA_CLOCK(0x00,0x05);//GPA[0]=0x00;GPA_CLOCK(5);
GPA_CLOCK(0x01,0x01);//GPA[0]=0x01;GPA_CLOCK(1);

pw[4]=pw[4]^GPA[0];
GPA_CLOCK(pw[4],0x01);//GPA[0]=pw[4];GPA_CLOCK(1);
GPA_CLOCK(0x00,0x05);//GPA[0]=0x00;GPA_CLOCK(5);

return pw[4];
}*/

//*******************set_user_zone************************
//选择用户区
//zone:用户区序号
//**********************************************************
void set_user_zone(unsigned char zone)
{
unsigned char zon[4];

GPA_CLOCK(zone,0x01);
zon[0]=0xb4;
zon[1]=0x03;
zon[2]=zone;
zon[3]=0x00;
write(zon);
Wait_For_AckPolling();
}
//**************************read_user_zone**************************
//读出用户区密文数据,并解出明文数据
//rd_high_addr 用户区高字节地址
//rd_low_addr  用户区低字节地址
//rd_number    读取密文数据及解出明文数据的个数
//解密出的明文数据存放在rwdata[0x04]=>rwdata[0x13]
//******************************************************************
void read_user_zone(unsigned char rd_high_addr,unsigned char rd_low_addr,unsigned char rd_number)
{
unsigned char j;

rwdata[0]=0xb2;
rwdata[1]=rd_high_addr;
rwdata[2]=rd_low_addr;
rwdata[3]=rd_number;
read(rwdata);
Wait_For_AckPolling();

//初始化解密
GPA_CLOCK(0x00,0x05);
GPA_CLOCK(rd_low_addr,0x01);
GPA_CLOCK(0x00,0x05);
GPA_CLOCK(rd_number,0x01);

for(j=0;j<rd_number;j++)
   {
   rwdata[4+j]=rwdata[4+j]^GPA[0];
   GPA_CLOCK(rwdata[4+j],0x01);
   GPA_CLOCK(0x00,0x05);
   }
}

//**************************read_config_zone**************************
//读出用户区密文数据,并解出明文数据
//rd_high_addr 用户区高字节地址
//rd_low_addr  用户区低字节地址
//rd_number    读取密文数据及解出明文数据的个数
//解密出的明文数据存放在rwdata[0x04]=>rwdata[0x13]
//******************************************************************
void read_config_zone(unsigned char rd_high_addr,unsigned char rd_low_addr,unsigned char rd_number)
{
unsigned char j;

rwdata[0]=0xb6;
rwdata[1]=rd_high_addr;
rwdata[2]=rd_low_addr;
rwdata[3]=rd_number;
read(rwdata);
Wait_For_AckPolling();

//初始化解密
GPA_CLOCK(0x00,0x05);
GPA_CLOCK(rd_low_addr,0x01);
GPA_CLOCK(0x00,0x05);
GPA_CLOCK(rd_number,0x01);

for(j=0;j<rd_number;j++)
   {
   if(rd_low_addr>=0xb0)
     {rwdata[4+j]=rwdata[4+j]^GPA[0];}
   GPA_CLOCK(rwdata[4+j],0x01);
   GPA_CLOCK(0x00,0x05);
   }
}

//*************************encrypto_data*******************************
//对明文数据进行加密
//encryptodatanumber加密数据的个数
//需加密的明文数据存放在 rwdata[4]至rwdata[0x13]
//*********************************************************************
void encrypto_data(unsigned char encryptodatanumber)
{

unsigned char j;
unsigned char temp;
for(j=0;j<encryptodatanumber;j++)
   {
   GPA_CLOCK(0x00,0x05);
   temp=rwdata[4+j];
   rwdata[4+j]=rwdata[4+j]^GPA[0];
   GPA_CLOCK(temp,0x01);
   }
}

//***************send checksum********************
//功能:发送校验和到器件(以密文形式写入数据后,需发送校验和)
//**************************************************
void send_checksum()
{
unsigned char dat6[6];

dat6[0]=0xb4;
dat6[1]=0x02;
dat6[2]=0x00;
dat6[3]=0x02;

GPA_CLOCK(0x00,0x0f);
dat6[4]=GPA[0];
GPA_CLOCK(0x00,0x05);
dat6[5]=GPA[0];

write(dat6);
}
//************************write_user_zone*********************************
//功能:把已加密了的密文数据写到器件
//wr_high_addr 用户区高字节地址
//wr_low_addr  用户区低字节地址
//wr_number    写入数据的个数
//将存放在 rwdata[4]至rwdata[0x13]明文数据写入器件
////////////////////////////////////////////
void write_user_zone(unsigned char wr_high_addr,unsigned char wr_low_addr,unsigned char wr_number)
{
GPA_CLOCK(0x00,0x05);
GPA_CLOCK(wr_low_addr,0x01);
GPA_CLOCK(0x00,0x05);
GPA_CLOCK(wr_number,0x01);

rwdata[0]=0xb0;
rwdata[1]=wr_high_addr;
rwdata[2]=wr_low_addr;
rwdata[3]=wr_number;
encrypto_data(wr_number);
write(rwdata);
delay_ms();delay_ms();delay_ms();delay_ms();delay_ms();
send_checksum();
Wait_For_AckPolling();
}

//************************write_user_zone*********************************
//功能:把已加密了的密文数据写到器件
//wr_high_addr 用户区高字节地址
//wr_low_addr  用户区低字节地址
//wr_number    写入数据的个数
//将存放在 rwdata[4]至rwdata[0x13]明文数据写入器件
////////////////////////////////////////////
void write_config_zone(unsigned char wr_high_addr,unsigned char wr_low_addr,unsigned char wr_number)
{
unsigned char j;
unsigned char temp;
GPA_CLOCK(0x00,0x05);
GPA_CLOCK(wr_low_addr,0x01);
GPA_CLOCK(0x00,0x05);
GPA_CLOCK(wr_number,0x01);

rwdata[0]=0xb4;
rwdata[1]=wr_high_addr;
rwdata[2]=wr_low_addr;
rwdata[3]=wr_number;
//encrypto_data(wr_number);
for(j=0;j<wr_number;j++)
   {
   GPA_CLOCK(0x00,0x05);
   temp=rwdata[4+j];
   if(wr_low_addr>=0xb0)
     {rwdata[4+j]=rwdata[4+j]^GPA[0];}
   GPA_CLOCK(temp,0x01);
   }

write(rwdata);
delay_ms();delay_ms();delay_ms();delay_ms();delay_ms();
send_checksum();
Wait_For_AckPolling();
}


//****************明文读写部分******************************
//****************verify_sc_plaintext****************************
//功能:校验安全密码(传输密码),该密码位置在write7_password
//在器件熔丝未断前,校验安全密码成功后,可以对器件配置区,用户区的随意读写
//sc_firsr_byte  密码的第1个字节数据
//sc_second_byte 密码的第2个字节数据
//sc_third_byte  密码的第3个字节数据
//如verify_sc_plaintext(0xDD,0x42,0x97)
//0xDD,0x42,0x97分别为密码的第123个字节数据
//*****************************************************************
unsigned char verify_sc_plaintext(unsigned char sc_first_byte,unsigned char sc_second_byte,unsigned char sc_third_byte)
{
unsigned char scdata[7];
scdata[0]=0xBA;
scdata[1]=0x07;
scdata[2]=0x00;
scdata[3]=0x03;
scdata[4]=sc_first_byte;
scdata[5]=sc_second_byte;
scdata[6]=sc_third_byte;
write(scdata);

scdata[0]=0xb6;///读回PAC_WR7
scdata[1]=0x00;
scdata[2]=0xE8;
scdata[3]=0x01;
read(scdata);
return scdata[4];
}

//************************set_user_zone_plaintext***********************
//选择用户区(明文)
//zonep:用户区序号
//*********************************************************************
void set_user_zone_plaintext(unsigned char zonep)
{
unsigned char zon[4];
zon[0]=0xb4;
zon[1]=0x03;
zon[2]=zonep;
zon[3]=0x00;
write(zon);
}

//**************************read_paintext************************************
//读操作(明文)
//rd_cmd:0xb2 读用户区 /0xb6 读配置区  /0xb6 0x01 0x00 0x01 读熔丝
//A1    :高字节地址
//A2    :地字节地址
//N     :读取数据个数
//*******************************************************************************
void read_paintext(unsigned char rd_cmd,unsigned char A1,unsigned char A2,unsigned char N)
{
rwdata[0]=rd_cmd;//0xb2 或 0xb6
rwdata[1]=A1;    //A1
rwdata[2]=A2;    //A2
rwdata[3]=N;     //N
read(rwdata);
}

//**************************write_paintext************************************
//写操作(明文)
//rd_cmd:0xb0 写用户区 /0xb4 写配置区  /0xb4 0x01 ID 0x00  写熔丝
//A1    :高字节地址
//A2    :地字节地址
//N     :写数据个数
//注意:烧断熔丝时只能从ID=0x06=>0x04=>0x00
//*******************************************************************************
void write_paintext(unsigned char wr_cmd,unsigned char A1,unsigned char A2,unsigned char N)
{
rwdata[0]=wr_cmd;//0xb0 或 0xb4
rwdata[1]=A1;    //A1
rwdata[2]=A2;    //A2
rwdata[3]=N;     //N
write(rwdata);
}


⌨️ 快捷键说明

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