📄 spi.lst
字号:
0273 2711 CLR R17
0274 DE2D RCALL _Send_abyte
(0161) Send_abyte(table[address0/16]);
0275 E120 LDI R18,0x10
0276 E030 LDI R19,0
0277 2F06 MOV R16,R22
0278 2711 CLR R17
0279 D0AE RCALL div16s
027A 01F8 MOVW R30,R16
027B ED86 LDI R24,0xD6
027C E090 LDI R25,0
027D 0FE8 ADD R30,R24
027E 1FF9 ADC R31,R25
027F 8100 LDD R16,Z+0
0280 2711 CLR R17
0281 DE20 RCALL _Send_abyte
(0162) Send_abyte(table[address0%16]);
0282 E120 LDI R18,0x10
0283 E030 LDI R19,0
0284 2F06 MOV R16,R22
0285 2711 CLR R17
0286 D09D RCALL mod16s
0287 01F8 MOVW R30,R16
0288 ED86 LDI R24,0xD6
0289 E090 LDI R25,0
028A 0FE8 ADD R30,R24
028B 1FF9 ADC R31,R25
028C 8100 LDD R16,Z+0
028D 2711 CLR R17
028E DE13 RCALL _Send_abyte
(0163) Prints(" completed...",1);
028F E021 LDI R18,1
0290 E030 LDI R19,0
0291 EB0A LDI R16,0xBA
0292 E010 LDI R17,0
0293 DE16 RCALL _Prints
0294 D0CE RCALL pop_gset5
0295 9624 ADIW R28,4
0296 9508 RET
_Read_string:
address0 --> R10
address1 --> R12
address2 --> Y+0
i --> R14
n --> Y+15
address --> Y+11
0297 D087 RCALL push_arg4
0298 D0CC RCALL push_gset5
0299 9721 SBIW R28,1
(0164) }
(0165) /**************************************************************
(0166) 读入一串字节。
(0167) ****************************************************************/
(0168) void Read_string(uint32 address,uint32 n)
(0169) {
(0170) uint8 i;
(0171) uint8 address2,address1,address0;
(0172) address2=(uint8)(address>>16);
029A 01FE MOVW R30,R28
029B 8423 LDD R2,Z+11
029C 8434 LDD R3,Z+12
029D 8445 LDD R4,Z+13
029E 8456 LDD R5,Z+14
029F 0112 MOVW R2,R4
02A0 2444 CLR R4
02A1 2455 CLR R5
02A2 8228 STD Y+0,R2
(0173) address1=(uint8)(address>>8);
02A3 E088 LDI R24,0x8
02A4 E090 LDI R25,0
02A5 01FE MOVW R30,R28
02A6 8423 LDD R2,Z+11
02A7 8434 LDD R3,Z+12
02A8 8445 LDD R4,Z+13
02A9 8456 LDD R5,Z+14
02AA 938A ST R24,-Y
02AB 0181 MOVW R16,R2
02AC 0192 MOVW R18,R4
02AD D0D6 RCALL lsr32
02AE 2EC0 MOV R12,R16
(0174) address0=(uint8)address;
02AF 01FE MOVW R30,R28
02B0 8423 LDD R2,Z+11
02B1 8434 LDD R3,Z+12
02B2 8445 LDD R4,Z+13
02B3 8456 LDD R5,Z+14
02B4 2CA2 MOV R10,R2
(0175) while((Read_RDSR())&0x01);
02B5 DF42 RCALL _Read_RDSR
02B6 FD00 SBRC R16,0
02B7 CFFD RJMP 0x02B5
(0176) WriteEN();
02B8 DE6E RCALL _WriteEN
(0177) CS_0;
02B9 98C2 CBI 0x18,2
(0178) Spi_MT(0x03);
02BA E003 LDI R16,3
02BB DDD3 RCALL _Spi_MT
(0179) Spi_MT(address2);
02BC 8108 LDD R16,Y+0
02BD DDD1 RCALL _Spi_MT
(0180) Spi_MT(address1);
02BE 2D0C MOV R16,R12
02BF DDCF RCALL _Spi_MT
(0181) Spi_MT(address0);
02C0 2D0A MOV R16,R10
02C1 DDCD RCALL _Spi_MT
(0182) for(i=0;i<n;i++)
02C2 24EE CLR R14
02C3 C009 RJMP 0x02CD
(0183) {
(0184) read_string[i]=Spi_MR();
02C4 DDCE RCALL _Spi_MR
02C5 E680 LDI R24,0x60
02C6 E090 LDI R25,0
02C7 2DEE MOV R30,R14
02C8 27FF CLR R31
02C9 0FE8 ADD R30,R24
02CA 1FF9 ADC R31,R25
02CB 8300 STD Z+0,R16
02CC 94E3 INC R14
02CD 01FE MOVW R30,R28
02CE 8427 LDD R2,Z+15
02CF 8830 LDD R3,Z+16
02D0 8841 LDD R4,Z+17
02D1 8852 LDD R5,Z+18
02D2 2C6E MOV R6,R14
02D3 2477 CLR R7
02D4 2488 CLR R8
02D5 2499 CLR R9
02D6 1462 CP R6,R2
02D7 0473 CPC R7,R3
02D8 0484 CPC R8,R4
02D9 0495 CPC R9,R5
02DA F348 BCS 0x02C4
(0185) }
(0186) CS_1;
02DB 9AC2 SBI 0x18,2
02DC 9621 ADIW R28,1
02DD D085 RCALL pop_gset5
02DE 9624 ADIW R28,4
02DF 9508 RET
(0187) }
(0188) /**************************************************************
(0189) 写保护
(0190) ****************************************************************/
(0191) void Write_Protect()
(0192) {
(0193) while((Read_RDSR())&0x01);
_Write_Protect:
02E0 DF17 RCALL _Read_RDSR
02E1 FD00 SBRC R16,0
02E2 CFFD RJMP _Write_Protect
(0194) WriteEN();
02E3 DE43 RCALL _WriteEN
(0195) CS_0;
02E4 98C2 CBI 0x18,2
(0196) Spi_MT(0x02);
02E5 E002 LDI R16,2
02E6 DDA8 RCALL _Spi_MT
(0197) Spi_MT(0X9C);
02E7 E90C LDI R16,0x9C
02E8 DDA6 RCALL _Spi_MT
(0198) CS_1;
02E9 9AC2 SBI 0x18,2
(0199) Prints("Chip Write Protect...",1);
02EA E021 LDI R18,1
02EB E030 LDI R19,0
02EC E703 LDI R16,0x73
02ED E010 LDI R17,0
02EE DDBB RCALL _Prints
02EF 9508 RET
_main:
j --> Y+5
i --> Y+5
02F0 9724 SBIW R28,4
FILE: E:\ICC\SPI\main.c
(0001) #include <iom8v.h>
(0002) #include "mytype.h"
(0003) #include "flash.h"
(0004) #include "uart.h"
(0005) #include "spi.h"
(0006)
(0007)
(0008) uint8 table[16]="0123456789abcdef";
(0009) extern uint8 read_string[];
(0010)
(0011)
(0012) void main(void)
(0013) {
(0014) uint8 i,j;
(0015) WP_1;
02F1 9AC1 SBI 0x18,1
(0016) Spi_init();//SPI初始化。
02F2 DD96 RCALL _Spi_init
(0017) Uart_init();//串口初始化。
02F3 DDA5 RCALL _Uart_init
(0018) Prints("System starting...",1);
02F4 E021 LDI R18,1
02F5 E030 LDI R19,0
02F6 EF09 LDI R16,0xF9
02F7 E010 LDI R17,0
02F8 DDB1 RCALL _Prints
(0019)
(0020) Sector_Erase(0x000005);//擦除第一段。
02F9 E005 LDI R16,5
02FA E010 LDI R17,0
02FB E020 LDI R18,0
02FC E030 LDI R19,0
02FD DE33 RCALL _Sector_Erase
(0021) Write_string("Hello,I'm a flash!",0x000001,19);//写入一段字符串。
02FE E183 LDI R24,0x13
02FF 838A STD Y+2,R24
0300 E041 LDI R20,1
0301 E050 LDI R21,0
0302 E060 LDI R22,0
0303 E070 LDI R23,0
0304 8368 STD Y+0,R22
0305 8379 STD Y+1,R23
0306 019A MOVW R18,R20
0307 EE06 LDI R16,0xE6
0308 E010 LDI R17,0
0309 DEF7 RCALL _Write_string
(0022) Read_string(0x000001,18);//读取地址0x000001开始的18个字节。
030A E142 LDI R20,0x12
030B E050 LDI R21,0
030C E060 LDI R22,0
030D E070 LDI R23,0
030E 8348 STD Y+0,R20
030F 8359 STD Y+1,R21
0310 836A STD Y+2,R22
0311 837B STD Y+3,R23
0312 E001 LDI R16,1
0313 E010 LDI R17,0
0314 E020 LDI R18,0
0315 E030 LDI R19,0
0316 DF80 RCALL _Read_string
(0023) Prints(read_string,1);//读取数据发送到串口。
0317 E021 LDI R18,1
0318 E030 LDI R19,0
0319 E600 LDI R16,0x60
031A E010 LDI R17,0
031B DD8E RCALL _Prints
(0024) while(1);
FILE: <library>
031C CFFF RJMP 0x031C
031D 9624 ADIW R28,4
031E 9508 RET
push_arg4:
031F 933A ST R19,-Y
0320 932A ST R18,-Y
push_arg2:
0321 931A ST R17,-Y
0322 930A ST R16,-Y
0323 9508 RET
mod16s:
0324 9468 BSET 6
0325 92DA ST R13,-Y
0326 2ED1 MOV R13,R17
0327 C004 RJMP 0x032C
div16s:
0328 94E8 BCLR 6
0329 92DA ST R13,-Y
032A 2ED1 MOV R13,R17
032B 26D3 EOR R13,R19
032C FF17 SBRS R17,7
032D C004 RJMP 0x0332
032E 9510 COM R17
032F 9500 COM R16
0330 5F0F SUBI R16,0xFF
0331 4F1F SBCI R17,0xFF
0332 FF37 SBRS R19,7
0333 C004 RJMP 0x0338
0334 9530 COM R19
0335 9520 COM R18
0336 5F2F SUBI R18,0xFF
0337 4F3F SBCI R19,0xFF
0338 D00B RCALL xdiv16u
0339 FED7 SBRS R13,7
033A C004 RJMP 0x033F
033B 9510 COM R17
033C 9500 COM R16
033D 5F0F SUBI R16,0xFF
033E 4F1F SBCI R17,0xFF
033F 90D9 LD R13,Y+
0340 9508 RET
mod16u:
0341 9468 BSET 6
0342 C001 RJMP xdiv16u
div16u:
0343 94E8 BCLR 6
xdiv16u:
0344 92EA ST R14,-Y
0345 92FA ST R15,-Y
0346 938A ST R24,-Y
0347 24EE CLR R14
0348 24FF CLR R15
0349 E180 LDI R24,0x10
034A 0F00 LSL R16
034B 1F11 ROL R17
034C 1CEE ROL R14
034D 1CFF ROL R15
034E 16E2 CP R14,R18
034F 06F3 CPC R15,R19
0350 F018 BCS 0x0354
0351 1AE2 SUB R14,R18
0352 0AF3 SBC R15,R19
0353 9503 INC R16
0354 958A DEC R24
0355 F7A1 BNE 0x034A
0356 F416 BRTC 0x0359
0357 2D0E MOV R16,R14
0358 2D1F MOV R17,R15
0359 9189 LD R24,Y+
035A 90F9 LD R15,Y+
035B 90E9 LD R14,Y+
035C 9508 RET
pop_gset2:
035D E0E2 LDI R30,2
035E C012 RJMP pop
pop_gset3:
035F E0E4 LDI R30,4
0360 C010 RJMP pop
pop_gset4:
0361 E0E8 LDI R30,0x8
0362 C00E RJMP pop
pop_gset5:
0363 27EE CLR R30
0364 C00C RJMP pop
push_gset5:
0365 92FA ST R15,-Y
0366 92EA ST R14,-Y
push_gset4:
0367 92DA ST R13,-Y
0368 92CA ST R12,-Y
push_gset3:
0369 92BA ST R11,-Y
036A 92AA ST R10,-Y
push_gset2:
036B 937A ST R23,-Y
036C 936A ST R22,-Y
push_gset1:
036D 935A ST R21,-Y
036E 934A ST R20,-Y
036F 9508 RET
pop_gset1:
0370 E0E1 LDI R30,1
pop:
0371 9149 LD R20,Y+
0372 9159 LD R21,Y+
0373 FDE0 SBRC R30,0
0374 9508 RET
0375 9169 LD R22,Y+
0376 9179 LD R23,Y+
0377 FDE1 SBRC R30,1
0378 9508 RET
0379 90A9 LD R10,Y+
037A 90B9 LD R11,Y+
037B FDE2 SBRC R30,2
037C 9508 RET
037D 90C9 LD R12,Y+
037E 90D9 LD R13,Y+
037F FDE3 SBRC R30,3
0380 9508 RET
0381 90E9 LD R14,Y+
0382 90F9 LD R15,Y+
0383 9508 RET
lsr32:
0384 920F PUSH R0
0385 9009 LD R0,Y+
0386 2000 TST R0
0387 F031 BEQ 0x038E
0388 9536 LSR R19
0389 9527 ROR R18
038A 9517 ROR R17
038B 9507 ROR R16
038C 940A DEC R0
038D CFF8 RJMP 0x0386
038E 900F POP R0
038F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -