📄 spi.lst
字号:
__text_start:
__start:
0069 E5CF LDI R28,0x5F
006A E0D4 LDI R29,4
006B BFCD OUT 0x3D,R28
006C BFDE OUT 0x3E,R29
006D 51C0 SUBI R28,0x10
006E 40D0 SBCI R29,0
006F EA0A LDI R16,0xAA
0070 8308 STD Y+0,R16
0071 2400 CLR R0
0072 E0EC LDI R30,0xC
0073 E0F1 LDI R31,1
0074 E011 LDI R17,1
0075 30EC CPI R30,0xC
0076 07F1 CPC R31,R17
0077 F011 BEQ 0x007A
0078 9201 ST R0,Z+
0079 CFFB RJMP 0x0075
007A 8300 STD Z+0,R16
007B E2E6 LDI R30,0x26
007C E0F0 LDI R31,0
007D E6A0 LDI R26,0x60
007E E0B0 LDI R27,0
007F E010 LDI R17,0
0080 3DE2 CPI R30,0xD2
0081 07F1 CPC R31,R17
0082 F021 BEQ 0x0087
0083 95C8 LPM
0084 9631 ADIW R30,1
0085 920D ST R0,X+
0086 CFF9 RJMP 0x0080
0087 D268 RCALL _main
_exit:
0088 CFFF RJMP _exit
FILE: E:\ICC\SPI\SPI.c
(0001) #include <iom8v.h>
(0002) #include "uart.h"
(0003) #include "mytype.h"
(0004) #include "spi.h"
(0005)
(0006)
(0007) extern uint8 table[];
(0008)
(0009) void Spi_init(void)
(0010) {
(0011) DDR1=((1<<WP)|(1<<SO)|(1<<SCLK)|(1<<CS));
_Spi_init:
0089 E28E LDI R24,0x2E
008A BB87 OUT 0x17,R24
(0012) SPCR=((1<<SPE)|(1<<MSTR)|(1<<SPR0));
008B E581 LDI R24,0x51
008C B98D OUT 0x0D,R24
(0013) WP_1;
008D 9AC1 SBI 0x18,1
008E 9508 RET
(0014) }
(0015)
(0016) void Spi_MT(uint8 data)
(0017) {
(0018) SPDR=data;
_Spi_MT:
data --> R16
008F B90F OUT 0x0F,R16
(0019) while(!(SPSR&(1<<SPIF)));
0090 9B77 SBIS 0x0E,7
0091 CFFE RJMP 0x0090
0092 9508 RET
(0020) }
(0021)
(0022) uint8 Spi_MR()
(0023) {
(0024) uint8 data;
(0025) data=SPDR;
_Spi_MR:
data --> R16
0093 B10F IN R16,0x0F
(0026) SPDR=data;
0094 B90F OUT 0x0F,R16
(0027) while(!(SPSR&(1<<SPIF)));
0095 9B77 SBIS 0x0E,7
0096 CFFE RJMP 0x0095
(0028) //Prints("Get data Readdata...",1);
(0029) //Send_abyte(table[SPDR/16]);
(0030) //Send_abyte(table[SPDR/16]);
(0031) return SPDR;
0097 B10F IN R16,0x0F
0098 9508 RET
_Uart_init:
0099 E188 LDI R24,0x18
009A B98A OUT 0x0A,R24
009B E189 LDI R24,0x19
009C B989 OUT 0x09,R24
009D 2422 CLR R2
009E BC20 OUT 0x20,R2
009F E886 LDI R24,0x86
00A0 BD80 OUT 0x20,R24
00A1 9508 RET
_Send_abyte:
abyte --> R16
00A2 9B5D SBIS 0x0B,5
00A3 CFFE RJMP _Send_abyte
00A4 B90C OUT 0x0C,R16
00A5 9508 RET
_Receive_abyte:
00A6 9B5F SBIS 0x0B,7
00A7 CFFE RJMP _Receive_abyte
00A8 B10C IN R16,0x0C
00A9 9508 RET
_Prints:
i --> R20
enter --> R22
string --> R10
00AA D2BE RCALL push_gset3
00AB 2F62 MOV R22,R18
00AC 0158 MOVW R10,R16
00AD 2744 CLR R20
00AE C009 RJMP 0x00B8
00AF 9B5D SBIS 0x0B,5
00B0 CFFE RJMP 0x00AF
00B1 2FE4 MOV R30,R20
00B2 27FF CLR R31
00B3 0DEA ADD R30,R10
00B4 1DFB ADC R31,R11
00B5 8020 LDD R2,Z+0
00B6 B82C OUT 0x0C,R2
00B7 9543 INC R20
00B8 2FE4 MOV R30,R20
00B9 27FF CLR R31
00BA 0DEA ADD R30,R10
00BB 1DFB ADC R31,R11
00BC 8020 LDD R2,Z+0
00BD 2022 TST R2
00BE F781 BNE 0x00AF
00BF 2366 TST R22
00C0 F021 BEQ 0x00C5
00C1 E00A LDI R16,0xA
00C2 DFDF RCALL _Send_abyte
00C3 E00D LDI R16,0xD
00C4 DFDD RCALL _Send_abyte
00C5 D299 RCALL pop_gset3
00C6 9508 RET
_Read_abyte:
address0 --> R20
address1 --> R22
address2 --> R10
data --> R12
address --> Y+8
00C7 D257 RCALL push_arg4
00C8 D29E RCALL push_gset4
FILE: E:\ICC\SPI\flash.c
(0001) #include <iom8v.h>
(0002) #include "mytype.h"
(0003) #include "uart.h"
(0004) #include "spi.h"
(0005)
(0006) extern uint8 table[];
(0007) uint8 read_string[19]={0};//
(0008)
(0009) /***************************************************************************************
(0010) 读取一个字节
(0011) *****************************************************************************************/
(0012) uint8 Read_abyte(uint32 address)
(0013) {
(0014) uint8 data;
(0015) uint8 address2,address1,address0;
(0016) address2=(uint8)(address>>16);
00C9 01FE MOVW R30,R28
00CA 8420 LDD R2,Z+8
00CB 8431 LDD R3,Z+9
00CC 8442 LDD R4,Z+10
00CD 8453 LDD R5,Z+11
00CE 0112 MOVW R2,R4
00CF 2444 CLR R4
00D0 2455 CLR R5
00D1 2CA2 MOV R10,R2
(0017) address1=(uint8)(address>>8);
00D2 E088 LDI R24,0x8
00D3 E090 LDI R25,0
00D4 01FE MOVW R30,R28
00D5 8420 LDD R2,Z+8
00D6 8431 LDD R3,Z+9
00D7 8442 LDD R4,Z+10
00D8 8453 LDD R5,Z+11
00D9 938A ST R24,-Y
00DA 0181 MOVW R16,R2
00DB 0192 MOVW R18,R4
00DC D2A7 RCALL lsr32
00DD 2F60 MOV R22,R16
(0018) address0=(uint8)address;
00DE 01FE MOVW R30,R28
00DF 8420 LDD R2,Z+8
00E0 8431 LDD R3,Z+9
00E1 8442 LDD R4,Z+10
00E2 8453 LDD R5,Z+11
00E3 2D42 MOV R20,R2
(0019) while((Read_RDSR())&0x01);
00E4 D113 RCALL _Read_RDSR
00E5 FD00 SBRC R16,0
00E6 CFFD RJMP 0x00E4
(0020) CS_0;
00E7 98C2 CBI 0x18,2
(0021) Spi_MT(0x03);
00E8 E003 LDI R16,3
00E9 DFA5 RCALL _Spi_MT
(0022) Spi_MT(address2);
00EA 2D0A MOV R16,R10
00EB DFA3 RCALL _Spi_MT
(0023) Spi_MT(address1);
00EC 2F06 MOV R16,R22
00ED DFA1 RCALL _Spi_MT
(0024) Spi_MT(address0);
00EE 2F04 MOV R16,R20
00EF DF9F RCALL _Spi_MT
(0025) data=Spi_MR();
00F0 DFA2 RCALL _Spi_MR
00F1 2EC0 MOV R12,R16
(0026) CS_1;
00F2 9AC2 SBI 0x18,2
(0027) return data;
00F3 D26D RCALL pop_gset4
00F4 9624 ADIW R28,4
00F5 9508 RET
_Write_abyte:
address0 --> R20
address1 --> R22
address2 --> R10
write_data --> R12
address --> Y+8
00F6 D228 RCALL push_arg4
00F7 D26F RCALL push_gset4
00F8 84CC LDD R12,Y+12
(0028) }
(0029)
(0030) /***************************************************************************************
(0031) 写入一个字节
(0032) *****************************************************************************************/
(0033) void Write_abyte(uint32 address,uint8 write_data)
(0034) {
(0035) uint8 address2,address1,address0;
(0036) address2=(uint8)(address>>16);
00F9 01FE MOVW R30,R28
00FA 8420 LDD R2,Z+8
00FB 8431 LDD R3,Z+9
00FC 8442 LDD R4,Z+10
00FD 8453 LDD R5,Z+11
00FE 0112 MOVW R2,R4
00FF 2444 CLR R4
0100 2455 CLR R5
0101 2CA2 MOV R10,R2
(0037) address1=(uint8)(address>>8);
0102 E088 LDI R24,0x8
0103 E090 LDI R25,0
0104 01FE MOVW R30,R28
0105 8420 LDD R2,Z+8
0106 8431 LDD R3,Z+9
0107 8442 LDD R4,Z+10
0108 8453 LDD R5,Z+11
0109 938A ST R24,-Y
010A 0181 MOVW R16,R2
010B 0192 MOVW R18,R4
010C D277 RCALL lsr32
010D 2F60 MOV R22,R16
(0038) address0=(uint8)address;
010E 01FE MOVW R30,R28
010F 8420 LDD R2,Z+8
0110 8431 LDD R3,Z+9
0111 8442 LDD R4,Z+10
0112 8453 LDD R5,Z+11
0113 2D42 MOV R20,R2
(0039) while((Read_RDSR())&0x01);
0114 D0E3 RCALL _Read_RDSR
0115 FD00 SBRC R16,0
0116 CFFD RJMP 0x0114
(0040) WriteEN();
0117 D00F RCALL _WriteEN
(0041) CS_0;
0118 98C2 CBI 0x18,2
(0042) Spi_MT(0x02);
0119 E002 LDI R16,2
011A DF74 RCALL _Spi_MT
(0043) Spi_MT(address2);
011B 2D0A MOV R16,R10
011C DF72 RCALL _Spi_MT
(0044) Spi_MT(address1);
011D 2F06 MOV R16,R22
011E DF70 RCALL _Spi_MT
(0045) Spi_MT(address0);
011F 2F04 MOV R16,R20
0120 DF6E RCALL _Spi_MT
(0046) Spi_MT(write_data);
0121 2D0C MOV R16,R12
0122 DF6C RCALL _Spi_MT
(0047) CS_1;
0123 9AC2 SBI 0x18,2
0124 D23C RCALL pop_gset4
0125 9624 ADIW R28,4
0126 9508 RET
(0048) }
(0049) /***************************************************************************************
(0050) 写入写使能命令
(0051) *****************************************************************************************/
(0052) void WriteEN(void)
(0053) {
(0054) CS_0;
_WriteEN:
0127 98C2 CBI 0x18,2
(0055) Spi_MT(0x06);
0128 E006 LDI R16,6
0129 DF65 RCALL _Spi_MT
(0056) CS_1;
012A 9AC2 SBI 0x18,2
012B 9508 RET
(0057) }
(0058) /***************************************************************************************
(0059) 写入写禁止命令
(0060) *****************************************************************************************/
(0061) void WriteDisable(void)
(0062) {
(0063) CS_0;
_WriteDisable:
012C 98C2 CBI 0x18,2
(0064) Spi_MT(0x04);
012D E004 LDI R16,4
012E DF60 RCALL _Spi_MT
(0065) CS_1;
012F 9AC2 SBI 0x18,2
0130 9508 RET
_Sector_Erase:
address0 --> R20
address1 --> R22
address2 --> R10
address --> Y+6
0131 D1ED RCALL push_arg4
0132 D236 RCALL push_gset3
(0066) }
(0067) /***************************************************************************************
(0068) 写入段擦除使能命令
(0069) *****************************************************************************************/
(0070) void Sector_Erase(uint32 address)
(0071) {
(0072) uint8 address2,address1,address0;
(0073) address2=(uint8)(address>>16);
0133 01FE MOVW R30,R28
0134 8026 LDD R2,Z+6
0135 8037 LDD R3,Z+7
0136 8440 LDD R4,Z+8
0137 8451 LDD R5,Z+9
0138 0112 MOVW R2,R4
0139 2444 CLR R4
013A 2455 CLR R5
013B 2CA2 MOV R10,R2
(0074) address1=(uint8)(address>>8);
013C E088 LDI R24,0x8
013D E090 LDI R25,0
013E 01FE MOVW R30,R28
013F 8026 LDD R2,Z+6
0140 8037 LDD R3,Z+7
0141 8440 LDD R4,Z+8
0142 8451 LDD R5,Z+9
0143 938A ST R24,-Y
0144 0181 MOVW R16,R2
0145 0192 MOVW R18,R4
0146 D23D RCALL lsr32
0147 2F60 MOV R22,R16
(0075) address0=(uint8)address;
0148 01FE MOVW R30,R28
0149 8026 LDD R2,Z+6
014A 8037 LDD R3,Z+7
014B 8440 LDD R4,Z+8
014C 8451 LDD R5,Z+9
014D 2D42 MOV R20,R2
(0076) while((Read_RDSR())&0x01);
014E D0A9 RCALL _Read_RDSR
014F FD00 SBRC R16,0
0150 CFFD RJMP 0x014E
(0077) WriteEN();
0151 DFD5 RCALL _WriteEN
(0078) CS_0;
0152 98C2 CBI 0x18,2
(0079) Spi_MT(0xd8);
0153 ED08 LDI R16,0xD8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -