main.s
来自「文档里面的代码是可以正常使用的」· S 代码 · 共 3,673 行 · 第 1/5 页
S
3,673 行
; else
; {
.dbline 580
; spi_transfer_8(tmp);
ldd R16,y+13
rcall _spi_transfer_8
.dbline 581
; }
L243:
.dbline 583
;
; spi_transfer_16(address&0xFFFF);
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R16,R2
rcall _spi_transfer_16
.dbline 584
; msg_buffer[i+2] = spi_transfer_8(0);
clr R16
rcall _spi_transfer_8
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
adiw R30,2
add R30,R24
adc R31,R25
std z+0,R16
.dbline 587
;
; //increment (word) address only when we have an uneven (byte) address
; if(i&1) address++;
sbrs R12,0
rjmp L244
.dbline 587
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts _address+1,R3
sts _address,R2
sts _address+2+1,R5
sts _address+2,R4
L244:
.dbline 588
L239:
.dbline 571
movw R24,R12
adiw R24,1
movw R12,R24
L241:
.dbline 571
cp R12,R10
cpc R13,R11
brsh X22
rjmp L238
X22:
.dbline 590
; }
;
; num_bytes = block_size+3;
movw R24,R10
adiw R24,3
std y+11,R25
std y+10,R24
.dbline 591
; msg_buffer[0] = CMD_READ_FLASH_ISP;
ldi R24,20
sts _msg_buffer,R24
.dbline 592
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 593
; msg_buffer[block_size+2] = STATUS_CMD_OK;
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R10
adiw R30,2
add R30,R24
adc R31,R25
std z+0,R2
.dbline 594
; }
rjmp L234
L233:
.dbline 598
; //////////////////////////////////////
; //CMD_PROGRAM_EEPROM_ISP
; //////////////////////////////////////
; else if(cmd==CMD_PROGRAM_EEPROM_ISP)
ldd R24,y+12
cpi R24,21
breq X23
rjmp L247
X23:
.dbline 599
; {
.dbline 600
; block_size = ((unsigned int)msg_buffer[1])<<8;
lds R10,_msg_buffer+1
clr R11
mov R11,R10
clr R10
.dbline 601
; block_size |= msg_buffer[2];
lds R2,_msg_buffer+2
clr R3
or R10,R2
or R11,R3
.dbline 602
; mode = msg_buffer[3];
lds R14,_msg_buffer+3
.dbline 605
;
; //Byte Mode
; if((mode&1) == 0)
sbrc R14,0
rjmp L252
.dbline 606
; {
.dbline 607
; for(i=0;i<block_size;i++)
clr R12
clr R13
rjmp L257
L254:
.dbline 608
; {
.dbline 609
; spi_transfer_8(msg_buffer[5]);
lds R16,_msg_buffer+5
rcall _spi_transfer_8
.dbline 610
; spi_transfer_16(address&0xFFFF);
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R16,R2
rcall _spi_transfer_16
.dbline 611
; spi_transfer_8(msg_buffer[i+10]);
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
adiw R30,10
add R30,R24
adc R31,R25
ldd R16,z+0
rcall _spi_transfer_8
.dbline 614
;
; //Check if we can do polling
; if((msg_buffer[i+10]!=msg_buffer[8])&&(msg_buffer[i+10]!=msg_buffer[9]))
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
adiw R30,10
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
lds R4,_msg_buffer+8
cp R2,R4
breq L259
lds R4,_msg_buffer+9
cp R2,R4
breq L259
.dbline 615
; {
.dbline 616
; polling_address = address&0xFFFF;
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R30,R28
std z+2,R2
std z+3,R3
std z+4,R4
std z+5,R5
.dbline 617
; }
rjmp L260
L259:
.dbline 620
; //If not switch the mode hard waiting
; else
; {
.dbline 621
; mode = (mode&(~0x0E)) | 0x02;
mov R24,R14
andi R24,241
ori R24,2
mov R14,R24
.dbline 622
; }
L260:
.dbline 626
;
; //Different polling methods
; //Hard waiting
; if((mode&0x0E) == 0x02)
mov R24,R14
andi R24,14
cpi R24,2
brne L263
.dbline 627
; {
.dbline 628
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
rcall _wait_ms
.dbline 629
; }
rjmp L264
L263:
.dbline 631
; //Data polling
; else if((mode&0x0E) == 0x04)
mov R24,R14
andi R24,14
cpi R24,4
brne L266
.dbline 632
; {
L268:
.dbline 633
; do{
.dbline 634
; spi_transfer_8(msg_buffer[7]);
lds R16,_msg_buffer+7
rcall _spi_transfer_8
.dbline 635
; spi_transfer_16(polling_address);
movw R30,R28
ldd R16,z+2
ldd R17,z+3
rcall _spi_transfer_16
.dbline 636
; tmp=spi_transfer_8(0x00);
clr R16
rcall _spi_transfer_8
std y+13,R16
.dbline 637
L269:
.dbline 637
; }while((tmp==msg_buffer[8])||(tmp==msg_buffer[9]));
lds R2,_msg_buffer+8
ldd R0,y+13
cp R0,R2
breq L268
lds R2,_msg_buffer+9
cp R0,R2
breq L268
.dbline 638
; }
rjmp L267
L266:
.dbline 640
; //RDY/BSY polling
; else if((mode&0x0E) == 0x08)
mov R24,R14
andi R24,14
cpi R24,8
brne L274
.dbline 641
; {
L276:
.dbline 642
L277:
.dbline 642
; while(spi_transfer_32(0xF0000000)&1);
ldi R16,0
ldi R17,0
ldi R18,0
ldi R19,240
rcall _spi_transfer_32
sbrc R16,0
rjmp L276
.dbline 643
; }
rjmp L275
L274:
.dbline 647
; //If something was not correct with the given mode do
; //hard waiting. Should never reach this point
; else
; {
.dbline 648
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
rcall _wait_ms
.dbline 649
; }
L275:
L267:
L264:
.dbline 652
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts _address+1,R3
sts _address,R2
sts _address+2+1,R5
sts _address+2,R4
.dbline 653
L255:
.dbline 607
movw R24,R12
adiw R24,1
movw R12,R24
L257:
.dbline 607
cp R12,R10
cpc R13,R11
brsh X24
rjmp L254
X24:
.dbline 654
;
; //increment address
; address++;
; }
; }
rjmp L253
L252:
.dbline 657
; //Page Mode
; else
; {
.dbline 658
; for(i=0;i<block_size;i++)
clr R12
clr R13
rjmp L283
L280:
.dbline 659
; {
.dbline 660
; spi_transfer_8(msg_buffer[5]);
lds R16,_msg_buffer+5
rcall _spi_transfer_8
.dbline 661
; spi_transfer_16(address&0xFFFF);
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R16,R2
rcall _spi_transfer_16
.dbline 662
; spi_transfer_8(msg_buffer[i+10]);
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
adiw R30,10
add R30,R24
adc R31,R25
ldd R16,z+0
rcall _spi_transfer_8
.dbline 665
;
; //Check if we can do polling
; if((msg_buffer[i+10]!=msg_buffer[8])&&(msg_buffer[i+10]!=msg_buffer[9]))
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R12
adiw R30,10
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
lds R4,_msg_buffer+8
cp R2,R4
breq L285
lds R4,_msg_buffer+9
cp R2,R4
breq L285
.dbline 666
; {
.dbline 667
; polling_address = address&0xFFFF;
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R30,R28
std z+2,R2
std z+3,R3
std z+4,R4
std z+5,R5
.dbline 668
; }
L285:
.dbline 671
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts _address+1,R3
sts _address,R2
sts _address+2+1,R5
sts _address+2,R4
.dbline 672
L281:
.dbline 658
movw R24,R12
adiw R24,1
movw R12,R24
L283:
.dbline 658
cp R12,R10
cpc R13,R11
brsh X25
rjmp L280
X25:
.dbline 675
;
; //increment (word) address only when we have an uneven (byte) address
; address++;
; }
;
; //If this page is complete the bit 7 of mode will be set and we programm the page
; if(mode&0x80)
sbrs R14,7
rjmp L289
.dbline 676
; {
.dbline 677
; spi_transfer_8(msg_buffer[6]);
lds R16,_msg_buffer+6
rcall _spi_transfer_8
.dbline 678
; spi_transfer_16(start_address&0xFFFF);
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R16,R2
rcall _spi_transfer_16
.dbline 679
; spi_transfer_8(0);
clr R16
rcall _spi_transfer_8
.dbline 682
;
; //If we have no valid polling address switch to simple wait mode
; if(polling_address==0)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L292
.dbline 683
; {
.dbline 684
; mode = (mode&(~0x70)) | 0x10;
mov R24,R14
andi R24,143
ori R24,16
mov R14,R24
.dbline 685
; }
L292:
.dbline 689
;
; //Different polling methods
; //Hard waiting
; if((mode&0x70) == 0x10)
mov R24,R14
andi R24,112
cpi R24,16
brne L294
.dbline 690
; {
.dbline 691
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
rcall _wait_ms
.dbline 692
; }
rjmp L295
L294:
.dbline 694
; //Data polling
; else if((mode&0x70) == 0x20)
mov R24,R14
andi R24,112
cpi R24,32
brne L297
.dbline 695
; {
L299:
.dbline 696
; do{
.dbline 699
; //If we have an uneven byte read the
; //high byte
; if(i&1)
sbrs R12,0
rjmp L302
.dbline 700
; {
.dbline 701
; spi_transfer_8(msg_buffer[7]|(1<<3));
lds R16,_msg_buffer+7
ori R16,8
rcall _spi_transfer_8
.dbline 702
; }
rjmp L303
L302:
.dbline 704
; else
; {
.dbline 705
; spi_transfer_8(msg_buffer[7]);
lds R16,_msg_buffer+7
rcall _spi_transfer_8
.dbline 706
; }
L303:
.dbline 707
; spi_transfer_16(polling_address);
movw R30,R28
ldd R16,z+2
ldd R17,z+3
rcall _spi_transfer_16
.dbline 708
; tmp=spi_transfer_8(0x00);
clr R16
rcall _spi_transfer_8
std y+13,R16
.dbline 709
L300:
.dbline 709
; }while(tmp==msg_buffer[8]);
lds R2,_msg_buffer+8
ldd R0,y+13
cp R0,R2
breq L299
.dbline 710
; }
rjmp L298
L297:
.dbline 712
; //RDY/BSY polling
; else if((mode&0x70) == 0x40)
mov R24,R14
andi R24,112
cpi R24,64
brne L307
.dbline 713
; {
L309:
.dbline 714
L310:
.dbline 714
; while(spi_transfer_32(0xF0000000)&1);
ldi R16,0
ldi R17,0
ldi R18,0
ldi R19,240
rcall _spi_transfer_32
sbrc R16,0
rjmp L309
.dbline 715
; }
rjmp L308
L307:
.dbline 719
; //If something was not correct with the given mode do
; //hard waiting. Should never reach this point
; else
; {
.dbline 720
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
rcall _wait_ms
.dbline 721
; }
L308:
L298:
L295:
.dbline 722
; }
L289:
.dbline 723
; }
L253:
.dbline 725
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 726
; msg_buffer[0] = CMD_PROGRAM_EEPROM_ISP;
ldi R24,21
sts _msg_buffer,R24
.dbline 727
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 728
; }
rjmp L248
L247:
.dbline 733
;
; //////////////////////////////////////
; //CMD_READ_EEPROM_ISP
; //////////////////////////////////////
; else if(cmd==CMD_READ_EEPROM_ISP)
ldd R24,y+12
cpi R24,22
breq X26
rjmp L314
X26:
.dbline 734
; {
.dbline 735
; block_size = ((unsigned int)msg_buffer[1])<<8;
lds R10,_msg_buffer+1
clr R11
mov R11,R10
clr R10
.dbline 736
; block_size |= msg_buffer[2];
lds R2,_msg_buffer+2
clr R3
or R10,R2
or R11,R3
.dbline 737
; tmp = msg_buffer[3];
lds R2,_msg_buffer+3
std y+13,R2
.dbline 739
;
; for(i=0;i<block_size;i++)
clr R12
clr R13
rjmp L322
L319:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?