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

📄 at88scxx.lst

📁 Atmel公司推出了最新的加密芯片AT88SC0104C~25616C系列
💻 LST
📖 第 1 页 / 共 4 页
字号:
 880          write(pw);
 881          delay_ms(); delay_ms();delay_ms();
 882          
 883          pw[0]=0XB6;
 884          pw[1]=0X00;
 885          pw[2]=pw_select&0x0f;
 886          pw[2]=pw[2]*0x08;
 887          pw[2]=pw[2]+0xb4;
 888          pw[3]=0x01;
 889          read(pw);
 890          
 891          GPA_CLOCK(0x00,0x05);//GPA[0]=0x00;GPA_CLOCK(5);
 892          GPA_CLOCK(pw[2],0x01);//GPA[0]=pw[2];GPA_CLOCK(1);
 893          GPA_CLOCK(0x00,0x05);//GPA[0]=0x00;GPA_CLOCK(5);
 894          GPA_CLOCK(0x01,0x01);//GPA[0]=0x01;GPA_CLOCK(1);
 895          
 896          pw[4]=pw[4]^GPA[0];
 897          GPA_CLOCK(pw[4],0x01);//GPA[0]=pw[4];GPA_CLOCK(1);
 898          GPA_CLOCK(0x00,0x05);//GPA[0]=0x00;GPA_CLOCK(5);
 899          
 900          return pw[4];
 901          }*/
 902          
 903          //*******************set_user_zone************************
 904          //选择用户区
 905          //zone:用户区序号
 906          //**********************************************************
 907          void set_user_zone(unsigned char zone)
 908          {
 909   1      unsigned char zon[4];
 910   1      
 911   1      GPA_CLOCK(zone,0x01);
 912   1      zon[0]=0xb4;
C51 COMPILER V7.50   AT88SCXX                                                              02/19/2008 15:50:58 PAGE 16  

 913   1      zon[1]=0x03;
 914   1      zon[2]=zone;
 915   1      zon[3]=0x00;
 916   1      write(zon);
 917   1      Wait_For_AckPolling();
 918   1      }
 919          //**************************read_user_zone**************************
 920          //读出用户区密文数据,并解出明文数据
 921          //rd_high_addr 用户区高字节地址
 922          //rd_low_addr  用户区低字节地址
 923          //rd_number    读取密文数据及解出明文数据的个数
 924          //解密出的明文数据存放在rwdata[0x04]=>rwdata[0x13]
 925          //******************************************************************
 926          void read_user_zone(unsigned char rd_high_addr,unsigned char rd_low_addr,unsigned char rd_number)
 927          {
 928   1      unsigned char j;
 929   1      
 930   1      rwdata[0]=0xb2;
 931   1      rwdata[1]=rd_high_addr;
 932   1      rwdata[2]=rd_low_addr;
 933   1      rwdata[3]=rd_number;
 934   1      read(rwdata);
 935   1      Wait_For_AckPolling();
 936   1      
 937   1      //初始化解密
 938   1      GPA_CLOCK(0x00,0x05);
 939   1      GPA_CLOCK(rd_low_addr,0x01);
 940   1      GPA_CLOCK(0x00,0x05);
 941   1      GPA_CLOCK(rd_number,0x01);
 942   1      
 943   1      for(j=0;j<rd_number;j++)
 944   1         {
 945   2         rwdata[4+j]=rwdata[4+j]^GPA[0];
 946   2         GPA_CLOCK(rwdata[4+j],0x01);
 947   2         GPA_CLOCK(0x00,0x05);
 948   2         }
 949   1      }
 950          
 951          //**************************read_config_zone**************************
 952          //读出用户区密文数据,并解出明文数据
 953          //rd_high_addr 用户区高字节地址
 954          //rd_low_addr  用户区低字节地址
 955          //rd_number    读取密文数据及解出明文数据的个数
 956          //解密出的明文数据存放在rwdata[0x04]=>rwdata[0x13]
 957          //******************************************************************
 958          void read_config_zone(unsigned char rd_high_addr,unsigned char rd_low_addr,unsigned char rd_number)
 959          {
 960   1      unsigned char j;
 961   1      
 962   1      rwdata[0]=0xb6;
 963   1      rwdata[1]=rd_high_addr;
 964   1      rwdata[2]=rd_low_addr;
 965   1      rwdata[3]=rd_number;
 966   1      read(rwdata);
 967   1      Wait_For_AckPolling();
 968   1      
 969   1      //初始化解密
 970   1      GPA_CLOCK(0x00,0x05);
 971   1      GPA_CLOCK(rd_low_addr,0x01);
 972   1      GPA_CLOCK(0x00,0x05);
 973   1      GPA_CLOCK(rd_number,0x01);
 974   1      
C51 COMPILER V7.50   AT88SCXX                                                              02/19/2008 15:50:58 PAGE 17  

 975   1      for(j=0;j<rd_number;j++)
 976   1         {
 977   2         if(rd_low_addr>=0xb0)
 978   2           {rwdata[4+j]=rwdata[4+j]^GPA[0];}
 979   2         GPA_CLOCK(rwdata[4+j],0x01);
 980   2         GPA_CLOCK(0x00,0x05);
 981   2         }
 982   1      }
 983          
 984          //*************************encrypto_data*******************************
 985          //对明文数据进行加密
 986          //encryptodatanumber加密数据的个数
 987          //需加密的明文数据存放在 rwdata[4]至rwdata[0x13]
 988          //*********************************************************************
 989          void encrypto_data(unsigned char encryptodatanumber)
 990          {
 991   1      
 992   1      unsigned char j;
 993   1      unsigned char temp;
 994   1      for(j=0;j<encryptodatanumber;j++)
 995   1         {
 996   2         GPA_CLOCK(0x00,0x05);
 997   2         temp=rwdata[4+j];
 998   2         rwdata[4+j]=rwdata[4+j]^GPA[0];
 999   2         GPA_CLOCK(temp,0x01);
1000   2         }
1001   1      }
1002          
1003          //***************send checksum********************
1004          //功能:发送校验和到器件(以密文形式写入数据后,需发送校验和)
1005          //**************************************************
1006          void send_checksum()
1007          {
1008   1      unsigned char dat6[6];
1009   1      
1010   1      dat6[0]=0xb4;
1011   1      dat6[1]=0x02;
1012   1      dat6[2]=0x00;
1013   1      dat6[3]=0x02;
1014   1      
1015   1      GPA_CLOCK(0x00,0x0f);
1016   1      dat6[4]=GPA[0];
1017   1      GPA_CLOCK(0x00,0x05);
1018   1      dat6[5]=GPA[0];
1019   1      
1020   1      write(dat6);
1021   1      }
1022          //************************write_user_zone*********************************
1023          //功能:把已加密了的密文数据写到器件
1024          //wr_high_addr 用户区高字节地址
1025          //wr_low_addr  用户区低字节地址
1026          //wr_number    写入数据的个数
1027          //将存放在 rwdata[4]至rwdata[0x13]明文数据写入器件
1028          ////////////////////////////////////////////
1029          void write_user_zone(unsigned char wr_high_addr,unsigned char wr_low_addr,unsigned char wr_number)
1030          {
1031   1      GPA_CLOCK(0x00,0x05);
1032   1      GPA_CLOCK(wr_low_addr,0x01);
1033   1      GPA_CLOCK(0x00,0x05);
1034   1      GPA_CLOCK(wr_number,0x01);
1035   1      
1036   1      rwdata[0]=0xb0;
C51 COMPILER V7.50   AT88SCXX                                                              02/19/2008 15:50:58 PAGE 18  

1037   1      rwdata[1]=wr_high_addr;
1038   1      rwdata[2]=wr_low_addr;
1039   1      rwdata[3]=wr_number;
1040   1      encrypto_data(wr_number);
1041   1      write(rwdata);
1042   1      delay_ms();delay_ms();delay_ms();delay_ms();delay_ms();
1043   1      send_checksum();
1044   1      Wait_For_AckPolling();
1045   1      }
1046          
1047          //************************write_user_zone*********************************
1048          //功能:把已加密了的密文数据写到器件
1049          //wr_high_addr 用户区高字节地址
1050          //wr_low_addr  用户区低字节地址
1051          //wr_number    写入数据的个数
1052          //将存放在 rwdata[4]至rwdata[0x13]明文数据写入器件
1053          ////////////////////////////////////////////
1054          void write_config_zone(unsigned char wr_high_addr,unsigned char wr_low_addr,unsigned char wr_number)
1055          {
1056   1      unsigned char j;
1057   1      unsigned char temp;
1058   1      GPA_CLOCK(0x00,0x05);
1059   1      GPA_CLOCK(wr_low_addr,0x01);
1060   1      GPA_CLOCK(0x00,0x05);
1061   1      GPA_CLOCK(wr_number,0x01);
1062   1      
1063   1      rwdata[0]=0xb4;
1064   1      rwdata[1]=wr_high_addr;
1065   1      rwdata[2]=wr_low_addr;
1066   1      rwdata[3]=wr_number;
1067   1      //encrypto_data(wr_number);
1068   1      for(j=0;j<wr_number;j++)
1069   1         {
1070   2         GPA_CLOCK(0x00,0x05);
1071   2         temp=rwdata[4+j];
1072   2         if(wr_low_addr>=0xb0)
1073   2           {rwdata[4+j]=rwdata[4+j]^GPA[0];}
1074   2         GPA_CLOCK(temp,0x01);
1075   2         }
1076   1      
1077   1      write(rwdata);
1078   1      delay_ms();delay_ms();delay_ms();delay_ms();delay_ms();
1079   1      send_checksum();
1080   1      Wait_For_AckPolling();
1081   1      }
1082          
1083          
1084          //****************明文读写部分******************************
1085          //****************verify_sc_plaintext****************************
1086          //功能:校验安全密码(传输密码),该密码位置在write7_password
1087          //在器件熔丝未断前,校验安全密码成功后,可以对器件配置区,用户区的随意读写
1088          //sc_firsr_byte  密码的第1个字节数据
1089          //sc_second_byte 密码的第2个字节数据
1090          //sc_third_byte  密码的第3个字节数据
1091          //如verify_sc_plaintext(0xDD,0x42,0x97)
1092          //0xDD,0x42,0x97分别为密码的第123个字节数据
1093          //*****************************************************************
1094          unsigned char verify_sc_plaintext(unsigned char sc_first_byte,unsigned char sc_second_byte,unsigned char s
             -c_third_byte)
1095          {
1096   1      unsigned char scdata[7];
1097   1      scdata[0]=0xBA;
C51 COMPILER V7.50   AT88SCXX                                                              02/19/2008 15:50:58 PAGE 19  

1098   1      scdata[1]=0x07;
1099   1      scdata[2]=0x00;
1100   1      scdata[3]=0x03;
1101   1      scdata[4]=sc_first_byte;
1102   1      scdata[5]=sc_second_byte;
1103   1      scdata[6]=sc_third_byte;
1104   1      write(scdata);
1105   1      
1106   1      scdata[0]=0xb6;///读回PAC_WR7
1107   1      scdata[1]=0x00;
1108   1      scdata[2]=0xE8;
1109   1      scdata[3]=0x01;
1110   1      read(scdata);
1111   1      return scdata[4];
1112   1      }
1113          
1114          //************************set_user_zone_plaintext***********************
1115          //选择用户区(明文)
1116          //zonep:用户区序号
1117          //*********************************************************************
1118          void set_user_zone_plaintext(unsigned char zonep)
1119          {
1120   1      unsigned char zon[4];
1121   1      zon[0]=0xb4;
1122   1      zon[1]=0x03;
1123   1      zon[2]=zonep;
1124   1      zon[3]=0x00;
1125   1      write(zon);
1126   1      }
1127          
1128          //**************************read_paintext************************************
1129          //读操作(明文)
1130          //rd_cmd:0xb2 读用户区 /0xb6 读配置区  /0xb6 0x01 0x00 0x01 读熔丝
1131          //A1    :高字节地址
1132          //A2    :地字节地址
1133          //N     :读取数据个数
1134          //*******************************************************************************
1135          void read_paintext(unsigned char rd_cmd,unsigned char A1,unsigned char A2,unsigned char N)
1136          {
1137   1      rwdata[0]=rd_cmd;//0xb2 或 0xb6
1138   1      rwdata[1]=A1;    //A1
1139   1      rwdata[2]=A2;    //A2
1140   1      rwdata[3]=N;     //N
1141   1      read(rwdata);
1142   1      }
1143          
1144          //**************************write_paintext************************************
1145          //写操作(明文)
1146          //rd_cmd:0xb0 写用户区 /0xb4 写配置区  /0xb4 0x01 ID 0x00  写熔丝
1147          //A1    :高字节地址
1148          //A2    :地字节地址
1149          //N     :写数据个数
1150          //注意:烧断熔丝时只能从ID=0x06=>0x04=>0x00
1151          //*******************************************************************************
1152          void write_paintext(unsigned char wr_cmd,unsigned char A1,unsigned char A2,unsigned char N)
1153          {
1154   1      rwdata[0]=wr_cmd;//0xb0 或 0xb4
1155   1      rwdata[1]=A1;    //A1
1156   1      rwdata[2]=A2;    //A2
1157   1      rwdata[3]=N;     //N
1158   1      write(rwdata);
1159   1      }
C51 COMPILER V7.50   AT88SCXX                                                              02/19/2008 15:50:58 PAGE 20  

1160          
1161          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2925    ----
   CONSTANT SIZE    =     80    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     40     106
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  7 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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