📄 at88scxx.lst
字号:
C51 COMPILER V7.50 AT88SCXX 02/19/2008 15:50:58 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE AT88SCXX
OBJECT MODULE PLACED IN D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #include<intrins.h>
3 #define _Nop()_nop_() // 延时1us
4 sbit SDA=P1^3; // 定义SDA
5 sbit SCL=P1^2; // 定义SCL
6 sbit pwr=P3^5; // 供电
7
8 unsigned char GPA[20]; //GPA 单元使用频率高,应直接寻址
9
10 unsigned char rwdata[0x14];//min=0x04(不读写) max=0x0c(读最大字节数为0x20H,写最大为0x10H)
11 //前4字节用做命令,数据存放在rwdata[0x04]=>rwdata[0x13]
12 //参数也可分配成0x0C,但后面一次只能读写8字节数据
13 //所有从器件解密出的数据和写入器件的数据暂放在此
14
15 //******************请填写GC************************************
16 //GC_TABLE:
17 unsigned char code GC0[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//GC0
18 unsigned char code GC1[]={0x00,0x00,0x06,0x09,0x02,0x06,0x16,0x00};//GC1
19 unsigned char code GC2[]={0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};//GC2
20 unsigned char code GC3[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//GC3
21
22 //******************请填写PASSWORD************************************
23 //PASSWORD_TABLE:
24 unsigned char code PW_WRITE0[]={0x80,0x00,0x00};//WRITE PASSWORD 0
25 unsigned char code PW_READ0[]= {0x00,0x00,0x00};//READ PASSWORD 0
26 unsigned char code PW_WRITE1[]={0x11,0x00,0x11};//WRITE PASSWORD 1
27 unsigned char code PW_READ1[]= {0x00,0x00,0x00};//READ PASSWORD 1
28 unsigned char code PW_WRITE2[]={0x00,0x00,0x00};//WRITE PASSWORD 2
29 unsigned char code PW_READ2[]= {0x00,0x00,0x00};//READ PASSWORD 2
30 unsigned char code PW_WRITE3[]={0x00,0x00,0x00};//WRITE PASSWORD 3
31 unsigned char code PW_READ3[]= {0x00,0x00,0x00};//READ PASSWORD 3
32 unsigned char code PW_WRITE4[]={0x22,0x22,0x22};//WRITE PASSWORD 4
33 unsigned char code PW_READ4[]= {0x22,0x22,0x22};//READ PASSWORD 4
34 unsigned char code PW_WRITE5[]={0x00,0x00,0x00};//WRITE PASSWORD 5
35 unsigned char code PW_READ5[]= {0x00,0x00,0x00};//READ PASSWORD 5
36 unsigned char code PW_WRITE6[]={0x00,0x00,0x00};//WRITE PASSWORD 6
37 unsigned char code PW_READ6[]= {0x00,0x00,0x00};//READ PASSWORD 6
38 unsigned char code PW_WRITE7[]={0xdd,0x42,0x97};//WRITE PASSWORD 7
39 unsigned char code PW_READ7[]= {0x00,0x00,0x00};//READ PASSWORD 7
40
41
42 void SMSTART(void);//功能:启动I2C
43 void SMSTOP(void); //功能:停止I2C
44 void delay_ms(); //功能:延时1ms
45 void IIC_Initial(void);//上电后初始化IIC
46
47 void Wait_For_AckPolling(void);
48 //功能:检查所发送的命令是否已被执行
49 //只有当AckPolling_return=1或bytecounter=0时,该程序才退出
50
51 void GPA_CLOCK(unsigned char Datain,unsigned char times);
52 //GPA函数
53 //入口:Data_in
54 //出口:GPA[0]:GPA_byte
55 //参数:times GPA函数计算的次数
C51 COMPILER V7.50 AT88SCXX 02/19/2008 15:50:58 PAGE 2
56
57 void read(rd);
58 //功能:对at88scxx I2C读操作函数
59 //本程序中以read(rwdata)调用;
60 //入口:rwdata数组
61 //出口:rwdata数组
62 //rd数组长度可改
63 //cmd_send_counter发送命令次数,超出8次,本函数退出,并认为I2C线路上无器件
64
65 void write(SDATA);
66 //功能:对at88scxx I2C写操作函数
67 //本程序中以write(rwdata)调用;
68 //入口:rwdata数组
69 //出口:rwdata数组
70 //rd数组长度可改
71 //cmd_send_counter发送命令次数,超出8次,本函数退出,并认为I2C线路上无器件
72
73
74 unsigned char AUTHENTICATION(unsigned char GC_select);
75 //双向认证函数
76 //入口:GC_select:选择密钥套数
77 //出口:AAC: 认证结果
78 //过程:
79 //1.从器件读出CIx,产生随机数Q0,计算密钥;计算出Q1,将Q0、Q1发送给器件,计算出新的CIx,SKx
80 //2.用读回的CIx与计算出的CIx比较
81 //3.用计算出的SKx替代GCx,重复1过程
82 //AAC:认证错误计数器.AAC!=0xff表示双向认证未通过或无器件
83 //需产生随机数则应在程序里修改
84
85
86 unsigned char verify_write_password(unsigned char pw_select);
87 //校验写密码组主函数,正确校验了写密码后开放读写
88 //pw_select:密码套数选择
89 //PAC:密码校验错误计数器.PAC!=0xff表示认证未通过或无器件
90
91 void set_user_zone(unsigned char zone);
92 //选择用户区
93 //zone:用户区序号
94
95 void read_user_zone(unsigned char rd_high_addr,unsigned char rd_low_addr,unsigned char rd_number);
96 //读出用户区密文数据,并解出明文数据
97 //rd_high_addr 用户区高字节地址
98 //rd_low_addr 用户区低字节地址
99 //rd_number 读取密文数据及解出明文数据的个数
100 //解密出的明文数据存放在rwdata[0x04]=>rwdata[0x13]
101
102 void read_config_zone(unsigned char rd_high_addr,unsigned char rd_low_addr,unsigned char rd_number);
103 //当rd_low_addr往后不应滚动到0xb0
104 //如想读 0xb0<rd_low_addr<0xef 单元则应重新调用
105
106 void encrypto_data(unsigned char encryptodatanumber);
107 //对明文数据进行加密
108 //encryptodatanumber加密数据的个数
109 //需加密的明文数据存放在 rwdata[4]至rwdata[0x13]
110
111 void write_user_zone(unsigned char wr_high_addr,unsigned char wr_low_addr,unsigned char wr_number);
112 //功能:把已加密了的密文数据写到器件
113 //wr_high_addr 用户区高字节地址
114 //wr_low_addr 用户区低字节地址
115 //wr_number 写入数据的个数
116 //将存放在 rwdata[4]至rwdata[0x13]明文数据写入器件
117
C51 COMPILER V7.50 AT88SCXX 02/19/2008 15:50:58 PAGE 3
118 void send_checksum();
119 //功能:发送校验和到器件(以密文形式写入数据后,需发送校验和)
120
121 void write_config_zone(unsigned char wr_high_addr,unsigned char wr_low_addr,unsigned char wr_number);
122 //当rd_low_addr往后不应滚动到0xb0
123 //如想读 0xb0<rd_low_addr<0xef 单元则应重新调用
124 //熔丝断后不可写
125
126 //****************明文读写部分******************************
127 unsigned char verify_sc_plaintext(unsigned char sc_first_byte,unsigned char sc_second_byte,unsigned char s
-c_third_byte);
128 //功能:校验安全密码(传输密码),该密码位置在write7_password
129 //在器件熔丝未断前,校验安全密码成功后,可以对器件配置区,用户区的随意读写
130 //sc_firsr_byte 密码的第1个字节数据
131 //sc_second_byte 密码的第2个字节数据
132 //sc_third_byte 密码的第3个字节数据
133 //如verify_sc_plaintext(0xDD,0x42,0x97)
134 //0xDD,0x42,0x97分别为密码的第123个字节数据
135
136 void set_user_zone_plaintext(unsigned char zonep);
137 //选择用户区(明文)
138 //zonep:用户区序号
139
140 void read_paintext(unsigned char rd_cmd,unsigned char A1,unsigned char A2,unsigned char N);
141 //读操作(明文)
142 //rd_cmd:0xb2 读用户区 /0xb6 读配置区 /0xb6 0x01 0x00 0x01 读熔丝
143 //A1 :高字节地址
144 //A2 :地字节地址
145 //N :读取数据个数
146
147 void write_paintext(unsigned char wr_cmd,unsigned char A1,unsigned char A2,unsigned char N);
148 //写操作(明文)
149 //rd_cmd:0xb0 写用户区 /0xb4 写配置区 /0xb4 0x01 ID 0x00 写熔丝
150 //A1 :高字节地址
151 //A2 :地字节地址
152 //N :写数据个数
153 //注意:烧断熔丝时只能从ID=0x06=>0x04=>0x00
154
155
156 ////////////////////////////////////////
157 void main()
158 {
159 1 unsigned char j;
160 1 unsigned char AAC; //AAC=0xFF则表明校验GCx正确
161 1 unsigned char PAC; //PAC=0xFF则表明校验PWx正确
162 1 pwr=0; //上电
163 1 AAC=0;
164 1 PAC=0;
165 1 IIC_Initial();
166 1 //goto MTZ_Test;
167 1 //goto Set_AAC_PAC_FF;
168 1 //goto RW_Config_User_Zone_Plaintext;
169 1 //goto RW_User_Zone_Encryptoed;
170 1 //goto RW_Config_Zone_Encryptoed;
171 1 ////////////////////密文读写部分////////////////////////////////////////
172 1 RW_User_Zone_Encryptoed:
173 1
174 1 AAC=AUTHENTICATION(0x02); //0x02使用02套密钥/
175 1 PAC=verify_write_password(0x04);//0x04使用04套密码,只读可用verify_read_password(pw_select)
176 1 set_user_zone(0x00); //0x00进入00H用户区
177 1 read_user_zone(0x00,0x00,0x10); //解密出的明文数据存放在rwdata[0x04]=>rwdata[0x13]
178 1 //read_user_zone(rd_high_addr,rd_low_addr,rd_number)
C51 COMPILER V7.50 AT88SCXX 02/19/2008 15:50:58 PAGE 4
179 1 //rd_high_addr:对于0104恒为0x00
180 1 //rd_low_addr:读0104用户区的首地址
181 1 //rd_number:读出的数据字节数
182 1 //如read_user_zone(0x00,0x00,0x10)则读解0104下0x00H-0x0fH单元
183 1 read_user_zone(0x00,0x10,0x10);
184 1
185 1 for(j=0x04;j<0x0c;j++)
186 1 {rwdata[j]=0x85;}
187 1 for(j=0x0c;j<0x14;j++)
188 1 {rwdata[j]=0x66;} //明文数据存放在 rwdata[4]至rwdata[0x13]
189 1 write_user_zone(0x00,0x00,0x10);//write_user_zone(wr_high_addr,wr_low_addr,wr_number)
190 1
191 1 for(j=0x04;j<0x0c;j++)
192 1 {rwdata[j]=0x28;}
193 1 for(j=0x0c;j<0x14;j++)
194 1 {rwdata[j]=0x66;} //明文数据存放在 rwdata[4]至rwdata[0x13]
195 1 write_user_zone(0x00,0x10,0x10);//write_user_zone(wr_high_addr,wr_low_addr,wr_number)
196 1 //wr_high_addr:对于0104恒为0x00
197 1 //wr_number:写入0104的数据字节数
198 1 //如write_user_zone(0x00,0x00,0x10)则把数据写到0104下0x00H-0x0fH单元
199 1
200 1 set_user_zone(0x00); //再调用命令操作防止写数据掉电丢失
201 1 pwr=1; //芯片下电,释放SDA SCL,RAM单元以做其他用
202 1 while(1);
203 1
204 1 ////////////////密文方式读写配置区///////////////////////////////////////////
205 1 RW_Config_Zone_Encryptoed:
206 1
207 1 AAC=AUTHENTICATION(0x02); //0x02使用02套密钥/
208 1 PAC=verify_write_password(0x07);//0x07使用07套密码,开放所有权限
209 1 for(j=0x04;j<0x0c;j++)
210 1 {rwdata[j]=0x28;}
211 1 for(j=0x0c;j<0x14;j++)
212 1 {rwdata[j]=0x66;}
213 1 write_config_zone(0x00,0x40,0x10);//熔丝断后不可写
214 1 read_config_zone(0x00,0x40,0x10);
215 1
216 1 for(j=0x04;j<0x0c;j++)
217 1 {rwdata[j]=0x18;}
218 1 for(j=0x0c;j<0x14;j++)
219 1 {rwdata[j]=0x16;}
220 1 write_config_zone(0x00,0xb0,0x10); //low_addr+ wr_number不应超过B0,若要读写 0xb0后应另起一行
221 1 read_config_zone(0x00,0xb0,0x10);
222 1
223 1 for(j=0x04;j<0x0c;j++)
224 1 {rwdata[j]=0x58;}
225 1 for(j=0x0c;j<0x14;j++)
226 1 {rwdata[j]=0x56;}
227 1 write_config_zone(0x00,0xb0,0x10); //low_addr+ wr_number不应超过B0,若要读写 0xb0后应另起一行
228 1 read_config_zone(0x00,0xb0,0x10);
229 1
230 1 while(1);
231 1
232 1
233 1 //////////////////明文读写部分,可执行F1算法/////////////////////////////
234 1 /////////////////////////////////////////////////////////////
235 1 MTZ_Test:
236 1 rwdata[4]=0x88;
237 1 rwdata[5]=0x66; //明文写
238 1 write_paintext(0xb4,0x00,0x0a,0x02); //write_paintext(0xb0 或 0xb4,A1,A2,N)
239 1 read_paintext(0xb6,0x00,0x0a,0x02); //明文读
240 1 //读回rwdata[4]=0x85;rwdata[5]=0x66;则表明通讯测试成功
C51 COMPILER V7.50 AT88SCXX 02/19/2008 15:50:58 PAGE 5
241 1 while(1);
242 1
243 1 ///////////////////////////////////////////////////////////
244 1 Set_AAC_PAC_FF://恢复设置 ACC PAC
245 1 rwdata[4]=0xff;
246 1 write_paintext(0xb4,0x00,0x70,0x04); //write_paintext(0xb0 或 0xb4,A1,A2,N)
247 1 read_paintext(0xb6,0x00,0x70,0x10); //明文读
248 1 rwdata[4]=0xff;
249 1 write_paintext(0xb4,0x00,0xd0,0x01); //write_paintext(0xb0 或 0xb4,A1,A2,N)
250 1 read_paintext(0xb6,0x00,0xd0,0x01); //明文读
251 1 while(1);
252 1
253 1 ////////////////////////////////////////////////////////////
254 1 RW_Config_User_Zone_Plaintext://明文读写配置区或用户区或熔丝
255 1 PAC=verify_sc_plaintext(0xDD,0x42,0x97);//校验SC
256 1 set_user_zone_plaintext(0x03); //选区
257 1 read_paintext(0xb2,0x00,0x00,0x10); //明文读
258 1 //read_paintext(0xb2 或 0xb6,A1,A2,N)
259 1 rwdata[4]=0x85;
260 1 rwdata[5]=0x66; //明文写
261 1 rwdata[6]=0x28;
262 1 rwdata[7]=0x66;
263 1 write_paintext(0xb0,0x00,0x00,0x04); //write_paintext(0xb0 或 0xb4,A1,A2,N)
264 1 //如以明文写用户区,则AR PR应为0xFF
265 1 read_paintext(0xb2,0x00,0x00,0x10); //明文读
266 1 while(1);
267 1
268 1 }
*** WARNING C280 IN LINE 172 OF D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.C: 'RW_User_Zone_Encryptoed': unreference
-d label
*** WARNING C280 IN LINE 205 OF D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.C: 'RW_Config_Zone_Encryptoed': unreferen
-ced label
*** WARNING C280 IN LINE 235 OF D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.C: 'MTZ_Test': unreferenced label
*** WARNING C280 IN LINE 244 OF D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.C: 'Set_AAC_PAC_FF': unreferenced label
*** WARNING C280 IN LINE 254 OF D:\AT88SCXX\出售的~1\SC-RWP~2\C程序~1\AT88SCXX.C: 'RW_Config_User_Zone_Plaintext': unref
-erenced label
269
270 //******************delay_ms*********************************
271 //功能:延时1ms
272 //*****************************************************************
273 void delay_ms()
274 {
275 1 unsigned char j;
276 1 for(j=0x00;j<255;j++)
277 1 {
278 2 _Nop();_Nop();_Nop();
279 2 }
280 1 }
281
282 //***********************IIC_Initial***********************************
283 //功能:上电后初始化IIC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -