main.s
来自「文档里面的代码是可以正常使用的」· S 代码 · 共 3,673 行 · 第 1/5 页
S
3,673 行
ori R16,8
rcall _spi_transfer_8
.dbline 414
; }
rjmp L166
L165:
.dbline 416
; else
; {
.dbline 417
; spi_transfer_8(msg_buffer[5]);
lds R16,_msg_buffer+5
rcall _spi_transfer_8
.dbline 418
; }
L166:
.dbline 420
;
; 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 421
; 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 424
;
; //Check if we can do polling
; if(msg_buffer[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 R2,z+0
lds R3,_msg_buffer+8
cp R3,R2
breq L169
.dbline 425
; {
.dbline 426
; 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 427
; }
rjmp L170
L169:
.dbline 430
; //If not switch the mode hard waiting
; else
; {
.dbline 431
; mode = (mode&(~0x0E)) | 0x02;
mov R24,R14
andi R24,241
ori R24,2
mov R14,R24
.dbline 432
; }
L170:
.dbline 436
;
; //Different polling methods
; //Hard waiting
; if((mode&0x0E) == 0x02)
mov R24,R14
andi R24,14
cpi R24,2
brne L172
.dbline 437
; {
.dbline 438
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
rcall _wait_ms
.dbline 439
; }
rjmp L173
L172:
.dbline 441
; //Data polling
; else if((mode&0x0E) == 0x04)
mov R24,R14
andi R24,14
cpi R24,4
brne L175
.dbline 442
; {
L177:
.dbline 443
; do{
.dbline 446
; //If we have an uneven byte read the
; //high byte
; if(i&1)
sbrs R12,0
rjmp L180
.dbline 447
; {
.dbline 448
; spi_transfer_8(msg_buffer[7]|(1<<3));
lds R16,_msg_buffer+7
ori R16,8
rcall _spi_transfer_8
.dbline 449
; }
rjmp L181
L180:
.dbline 451
; else
; {
.dbline 452
; spi_transfer_8(msg_buffer[7]);
lds R16,_msg_buffer+7
rcall _spi_transfer_8
.dbline 453
; }
L181:
.dbline 454
; spi_transfer_16(polling_address);
movw R30,R28
ldd R16,z+2
ldd R17,z+3
rcall _spi_transfer_16
.dbline 455
; tmp=spi_transfer_8(0x00);
clr R16
rcall _spi_transfer_8
std y+13,R16
.dbline 456
L178:
.dbline 456
; }while(tmp==msg_buffer[8]);
lds R2,_msg_buffer+8
ldd R0,y+13
cp R0,R2
breq L177
.dbline 457
; }
rjmp L176
L175:
.dbline 459
; //RDY/BSY polling
; else if((mode&0x0E) == 0x08)
mov R24,R14
andi R24,14
cpi R24,8
brne L185
.dbline 460
; {
L187:
.dbline 461
L188:
.dbline 461
; 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 L187
.dbline 462
; }
rjmp L186
L185:
.dbline 466
; //If something was not correct with the given mode do
; //hard waiting. Should never reach this point
; else
; {
.dbline 467
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
rcall _wait_ms
.dbline 468
; }
L186:
L176:
L173:
.dbline 471
;
; //increment (word) address only when we have an uneven (byte) address
; if(i&1) address++;
sbrs R12,0
rjmp L191
.dbline 471
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
L191:
.dbline 472
L162:
.dbline 407
movw R24,R12
adiw R24,1
movw R12,R24
L164:
.dbline 407
cp R12,R10
cpc R13,R11
brsh X16
rjmp L161
X16:
.dbline 473
; }
; }
rjmp L160
L159:
.dbline 476
; //Page Mode
; else
; {
.dbline 477
; for(i=0;i<block_size;i++)
clr R12
clr R13
rjmp L196
L193:
.dbline 478
; {
.dbline 481
; //If we have an uneven byte programm the
; //high byte
; if(i&1)
sbrs R12,0
rjmp L197
.dbline 482
; {
.dbline 483
; spi_transfer_8(msg_buffer[5]|(1<<3));
lds R16,_msg_buffer+5
ori R16,8
rcall _spi_transfer_8
.dbline 484
; }
rjmp L198
L197:
.dbline 486
; else
; {
.dbline 487
; spi_transfer_8(msg_buffer[5]);
lds R16,_msg_buffer+5
rcall _spi_transfer_8
.dbline 488
; }
L198:
.dbline 490
;
; 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 491
; 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 494
;
; //Check if we can do polling
; if(msg_buffer[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 R2,z+0
lds R3,_msg_buffer+8
cp R3,R2
brne X17
rjmp L201
X17:
.dbline 495
; {
.dbline 499
; //We have to check if we have an uneven byte.
; //Set the polling address to a byte address
; //so that we can poll the right location
; polling_address = (address&0xFFFF)*2;
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
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
rcall empy32u
movw R30,R28
std z+2,R16
std z+3,R17
std z+4,R18
std z+5,R19
.dbline 500
; if(i&1) polling_address++;
sbrs R12,0
rjmp L204
.dbline 500
ldi R20,1
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
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+2,R2
std z+3,R3
std z+4,R4
std z+5,R5
L204:
.dbline 501
; }
L201:
.dbline 504
;
; //increment (word) address only when we have an uneven (byte) address
; if(i&1) address++;
sbrs R12,0
rjmp L206
.dbline 504
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
L206:
.dbline 505
L194:
.dbline 477
movw R24,R12
adiw R24,1
movw R12,R24
L196:
.dbline 477
cp R12,R10
cpc R13,R11
brsh X18
rjmp L193
X18:
.dbline 508
; }
;
; //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 L208
.dbline 509
; {
.dbline 510
; spi_transfer_8(msg_buffer[6]);
lds R16,_msg_buffer+6
rcall _spi_transfer_8
.dbline 511
; 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 512
; spi_transfer_8(0);
clr R16
rcall _spi_transfer_8
.dbline 515
;
; //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 L211
.dbline 516
; {
.dbline 517
; mode = (mode&(~0x70)) | 0x10;
mov R24,R14
andi R24,143
ori R24,16
mov R14,R24
.dbline 518
; }
L211:
.dbline 522
;
; //Different polling methods
; //Hard waiting
; if((mode&0x70) == 0x10)
mov R24,R14
andi R24,112
cpi R24,16
brne L213
.dbline 523
; {
.dbline 524
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
rcall _wait_ms
.dbline 525
; }
rjmp L214
L213:
.dbline 527
; //Data polling
; else if((mode&0x70) == 0x20)
mov R24,R14
andi R24,112
cpi R24,32
breq X19
rjmp L216
X19:
.dbline 528
; {
L218:
.dbline 529
; do{
.dbline 532
; //If we have an uneven byte read the
; //high byte
; if(polling_address%2)
ldi R20,1
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
and R2,R20
and R3,R21
and R4,R22
and R5,R23
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq L221
.dbline 533
; {
.dbline 534
; spi_transfer_8(msg_buffer[7]|(1<<3));
lds R16,_msg_buffer+7
ori R16,8
rcall _spi_transfer_8
.dbline 535
; }
rjmp L222
L221:
.dbline 537
; else
; {
.dbline 538
; spi_transfer_8(msg_buffer[7]);
lds R16,_msg_buffer+7
rcall _spi_transfer_8
.dbline 539
; }
L222:
.dbline 540
; spi_transfer_16(polling_address/2);
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
lsr R5
ror R4
ror R3
ror R2
movw R16,R2
rcall _spi_transfer_16
.dbline 541
; tmp=spi_transfer_8(0x00);
clr R16
rcall _spi_transfer_8
std y+13,R16
.dbline 542
L219:
.dbline 542
; }while(tmp==msg_buffer[8]);
lds R2,_msg_buffer+8
ldd R0,y+13
cp R0,R2
brne X20
rjmp L218
X20:
.dbline 543
; }
rjmp L217
L216:
.dbline 545
; //RDY/BSY polling
; else if((mode&0x70) == 0x40)
mov R24,R14
andi R24,112
cpi R24,64
brne L226
.dbline 546
; {
L228:
.dbline 547
L229:
.dbline 547
; 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 L228
.dbline 548
; }
rjmp L227
L226:
.dbline 552
; //If something was not correct with the given mode do
; //hard waiting. Should never reach this point
; else
; {
.dbline 553
; wait_ms(msg_buffer[4]);
lds R16,_msg_buffer+4
clr R17
rcall _wait_ms
.dbline 554
; }
L227:
L217:
L214:
.dbline 555
; }
L208:
.dbline 556
; }
L160:
.dbline 558
;
; num_bytes = 2;
ldi R24,2
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 559
; msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
ldi R24,19
sts _msg_buffer,R24
.dbline 560
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 561
; }
rjmp L155
L154:
.dbline 565
; //////////////////////////////////////
; //CMD_READ_FLASH_ISP
; //////////////////////////////////////
; else if(cmd==CMD_READ_FLASH_ISP)
ldd R24,y+12
cpi R24,20
breq X21
rjmp L233
X21:
.dbline 566
; {
.dbline 567
; block_size = ((unsigned int)msg_buffer[1])<<8;
lds R10,_msg_buffer+1
clr R11
mov R11,R10
clr R10
.dbline 568
; block_size |= msg_buffer[2];
lds R2,_msg_buffer+2
clr R3
or R10,R2
or R11,R3
.dbline 569
; tmp = msg_buffer[3];
lds R2,_msg_buffer+3
std y+13,R2
.dbline 571
;
; for(i=0;i<block_size;i++)
clr R12
clr R13
rjmp L241
L238:
.dbline 572
; {
.dbline 574
; //Select Low or High-Byte
; if(i&1)
sbrs R12,0
rjmp L242
.dbline 575
; {
.dbline 576
; spi_transfer_8(tmp|(1<<3));
ldd R16,y+13
ori R16,8
rcall _spi_transfer_8
.dbline 577
; }
rjmp L243
L242:
.dbline 579
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?