📄 otp.lst
字号:
268 2 p_read++;
269 2 tempw=*p_read;
270 2
271 2 for(iw=0; iw<8; iw++)
272 2 {
273 3 if(tempw&0x80)
274 3 send_1bit(1);
275 3 else
276 3 send_1bit(0);
277 3 tempw=tempw<<1;
278 3 }
279 2
280 2 send_1bit(0); //send low dummy clock
281 2 p_read++;
282 2
283 2 }
284 1
285 1 /*******write 0xffff at last unit as end*************/
286 1 for(iw=0; iw<18; iw++)
287 1 {
288 2 if(iw==17)
289 2 send_1bit(0);
290 2 else
291 2 send_1bit(1);
292 2 }
293 1
294 1 VPP_CTRL=1;
295 1 DelayXus(); //???
296 1 DelayXus();
297 1
298 1 }
299
300 void otp_write(uchar page)
301 {
302 1 I2cReset();
303 1 start();
C51 COMPILER V8.02 OTP 12/19/2007 17:51:25 PAGE 6
304 1 //void main_command(bit rw, uchar command_adrh, uchar command_adrl)
305 1 main_command(1, 64*page/256, 64*page%256);
306 1 write_data(&EpBuf[0], 64);
307 1 stop();
308 1
309 1
310 1
311 1 }
312
313 void write_configue()
314 {
315 1 I2cReset();
316 1 start();
317 1 smart_command(1, 0x3f, 0xff);
318 1 EpBuf[0]=0x20|EpBuf[0]; //加密位先不写
319 1 write_data(&EpBuf[0], 1);
320 1 stop();
321 1 }
322
323
324 void read_configue()
325 {
326 1 I2cReset();
327 1 start();
328 1 smart_command(0, 0x3f, 0Xff);
329 1 read_data(&EpBuf[0]);
330 1 stop();
331 1
332 1 }
333
334 void otp_read_usb(uchar page) //母片读取
335 {
336 1 uchar io;
337 1 I2cReset();
338 1 start();
339 1 main_command(0, 32*page/256, 32*page%256);
340 1 for(io=0; io<64; io=io+2)
341 1 {
342 2 read_data(&EpBuf[io]);
343 2 }
344 1 stop();
345 1
346 1 }
347
348 void otp_read(uchar page) //母片读取
349 {
350 1 uchar io;
351 1 I2cReset();
352 1 start();
353 1 main_command(0, 64*page/256, 64*page%256);
354 1 for(io=0; io<128; io=io+2)
355 1 {
356 2 read_data(&EpBuf[io]);
357 2 }
358 1 stop();
359 1
360 1 }
361
362 //1,AAAAAA,rw,1,AAAAAAAA,0,if x=0, showing read, else showing write
363 void smart_command(bit rw, uchar command_adrh, uchar command_adrl)
364 {
365 1 uchar count;
C51 COMPILER V8.02 OTP 12/19/2007 17:51:25 PAGE 7
366 1 send_1bit(1); //show main mode
367 1 for(count=0;count<6;count++) /*要传送的数据长度为6位*/
368 1 {
369 2 if((command_adrh<<count)&0x20)
370 2 send_1bit(1);
371 2 else
372 2 send_1bit(0);
373 2 }
374 1
375 1 if(rw==0) //根据RW选择读写模式
376 1 send_1bit(0);
377 1 else
378 1 send_1bit(1);
379 1
380 1 send_1bit(1); //high dummy clock
381 1 for(count=0; count<8; count++)
382 1 {
383 2 if((command_adrl<<count)&0x80) /*要传送的数据长度为8位*/
384 2 send_1bit(1);
385 2 else
386 2 send_1bit(0);
387 2 }
388 1
389 1 send_1bit(0); //low dummy clock
390 1
391 1 }
392
393
394
395
396
397 void buzzer_3(void)
398 {
399 1 bit i=EA;
400 1 EA=0;
401 1 BZ_IO=0;
402 1 DelayNms(125);
403 1 BZ_IO=1;
404 1 DelayNms(125);
405 1
406 1 BZ_IO=0;
407 1 DelayNms(125);
408 1 BZ_IO=1;
409 1 DelayNms(125);
410 1
411 1 BZ_IO=0;
412 1 DelayNms(125);
413 1 BZ_IO=1;
414 1 DelayNms(125);
415 1 LED=1; //LED_OFF
416 1 EA=i;
417 1
418 1 }
419
420
421 void buzzer_1(void)
422 {
423 1 bit i=EA;
424 1 EA=0;
425 1 BZ_IO=0;
426 1 DelayNms(250);
427 1 BZ_IO=1;
C51 COMPILER V8.02 OTP 12/19/2007 17:51:25 PAGE 8
428 1 LED=0; //LED_ON
429 1 EA=i;
430 1 }
431
432 void buzzer_2(void)
433 {
434 1 bit i=EA;
435 1 EA=0;
436 1 BZ_IO=0;
437 1 DelayNms(125);
438 1 BZ_IO=1;
439 1 DelayNms(125);
440 1 BZ_IO=0;
441 1 DelayNms(125);
442 1 BZ_IO=1;
443 1 LED=1; //LED_OFF
444 1 EA=i;
445 1 }
446
447 void write_page(uint page, uchar *p_buf)
448 {
449 1 uchar i;
450 1 uint adr;
451 1 CE_FLS =0;
452 1 adr=128*page; //start address
453 1 XBYTE[0x5555]=0xaa;
454 1 XBYTE[0x2aaa]=0x55;
455 1 XBYTE[0x5555]=0xa0;
456 1 for(i=0; i<128; i++)
457 1 { XBYTE[adr]=*p_buf;
458 2 adr++;
459 2 p_buf++;
460 2 }
461 1 DelayNms(15); //???
462 1 }
463
464 void download_otp(void)
465 {
466 1 uchar ib, temp1, temp2;
467 1 uint adr;
468 1 if(!PIN_TEST())
469 1 {
470 2 buzzer_3();
471 2 buzzer_3();
472 2 return;
473 2 }
474 1 for(ib=0; ib<mcu_size[otp_type]*16; ib++)
475 1 {
476 2 otp_read(ib);
477 2 P1=P1^0x01;
478 2 write_page(ib, &EpBuf[0]);
479 2 }
480 1
481 1
482 1
483 1 read_configue(); //read config and save them start at 0x8000
484 1
485 1 CE_FLS = 0;
486 1 temp1=XBYTE[0X8002]; //get mcu_type
487 1 temp2=XBYTE[0X8003];
488 1
489 1 adr=0x8000;
C51 COMPILER V8.02 OTP 12/19/2007 17:51:25 PAGE 9
490 1 XBYTE[0x5555]=0xaa;
491 1 XBYTE[0x2aaa]=0x55;
492 1 XBYTE[0x5555]=0xa0;
493 1 XBYTE[adr++]=EpBuf[0]&0xdf; //默认选择加密
494 1 XBYTE[adr++]=EpBuf[1];
495 1 XBYTE[adr++]=temp1;
496 1 XBYTE[adr++]=temp2;
497 1 for(ib=0; ib<124; ib++)
498 1 {
499 2 XBYTE[adr++]=0xff;
500 2 }
501 1 DelayNms(15);
502 1
503 1 verify_otp(); //校验
504 1
505 1 }
506
507 unsigned int cal_checksum() //
508 {
509 1 unsigned int i, chksum;
510 1 chksum=0x0000;
511 1 CE_FLS = 0;
512 1
513 1 for(i=0; i<mcu_size[otp_type]*1024; i++)
514 1 {
515 2 chksum=XWORD[i]+chksum;
516 2 nop; nop;
517 2 }
518 1
519 1 return chksum;
520 1
521 1 }
522
523
524 unsigned char blank_check(void)
525 {
526 1 uchar ib, jb;
527 1 if(!PIN_TEST())
528 1 {
529 2 buzzer_3();
530 2 buzzer_3();
531 2 return 2;
532 2 }
533 1
534 1 pulse_read();
535 1 for(ib=0; ib<mcu_size[otp_type]*16; ib++)
536 1 {
537 2 otp_read(ib);
538 2 for(jb=0; jb<128; jb=jb+2)
539 2 {
540 3 if(EpBuf[jb]!=0x3f||EpBuf[jb+1]!=0xff)
541 3 {
542 4
543 4 buzzer_3();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -