📄 attest.lst
字号:
0180 940E064A CALL pop_gset3
0182 9508 RET
_write_buffer:
i --> R20
size --> R22
data --> R10
addr --> R20
0183 940E066B CALL push_gset3
0185 0159 MOVW R10,R18
0186 01A8 MOVW R20,R16
0187 816E LDD R22,Y+6
0188 817F LDD R23,Y+7
(0147) }
(0148) //========================================================================
(0149) //将数据写入写缓冲区2 命令 0x87
(0150) void write_buffer(uint addr,uint *data,uint size)
(0151) {
(0152) uint i;
(0153) SELECT_CHIP;
0189 B388 IN R24,0x18
018A 7E8F ANDI R24,0xEF
018B BB88 OUT 0x18,R24
(0154) spi_write(BUFFER_2_WRITE);
018C E807 LDI R16,0x87
018D E010 LDI R17,0
018E DF63 RCALL _spi_write
(0155) spi_write(0x00); //写入缓冲区地址15位无关位
018F 2700 CLR R16
0190 2711 CLR R17
0191 DF60 RCALL _spi_write
(0156) spi_write((uint)(addr>>8)); //写入缓冲区地址
0192 018A MOVW R16,R20
0193 2F01 MOV R16,R17
0194 2711 CLR R17
0195 DF5C RCALL _spi_write
(0157) spi_write((uint)addr); //写入缓冲区地址 总共写了三个字节地址 24位 15位无关位
0196 018A MOVW R16,R20
0197 DF5A RCALL _spi_write
(0158) for(i=0;i<size;i++)
0198 2744 CLR R20
0199 2755 CLR R21
019A C00D RJMP 0x01A8
(0159) spi_write(data[i]); //写数据
019B E002 LDI R16,2
019C E010 LDI R17,0
019D 019A MOVW R18,R20
019E 940E0637 CALL empy16s
01A0 01F8 MOVW R30,R16
01A1 0DEA ADD R30,R10
01A2 1DFB ADC R31,R11
01A3 8100 LDD R16,Z+0
01A4 8111 LDD R17,Z+1
01A5 DF4C RCALL _spi_write
01A6 5F4F SUBI R20,0xFF
01A7 4F5F SBCI R21,0xFF
01A8 1746 CP R20,R22
01A9 0757 CPC R21,R23
01AA F380 BCS 0x019B
(0160)
(0161) UNSELECT_CHIP;
01AB 9AC4 SBI 0x18,4
01AC 940E064A CALL pop_gset3
01AE 9508 RET
_write_page_from_buffer:
buffer --> R22
page --> R20
01AF 940E0667 CALL push_gset2
01B1 01B9 MOVW R22,R18
01B2 01A8 MOVW R20,R16
(0162) }
(0163) //========================================================================
(0164) //将写缓冲区内容写入到主存储器中指定页
(0165) void write_page_from_buffer(uint page,uint buffer)
(0166) {
(0167) SELECT_CHIP;
01B3 B388 IN R24,0x18
01B4 7E8F ANDI R24,0xEF
01B5 BB88 OUT 0x18,R24
(0168)
(0169) if(buffer == DF_WRITE_BUFFER)
01B6 3061 CPI R22,1
01B7 E0E0 LDI R30,0
01B8 077E CPC R23,R30
01B9 F421 BNE 0x01BE
(0170) spi_write(B2_TO_MM_PAGE_PROG_WITH_ERASE); //0x86
01BA E806 LDI R16,0x86
01BB E010 LDI R17,0
01BC DF35 RCALL _spi_write
01BD C003 RJMP 0x01C1
(0171) else
(0172) spi_write(B1_TO_MM_PAGE_PROG_WITH_ERASE); //0x83
01BE E803 LDI R16,0x83
01BF E010 LDI R17,0
01C0 DF31 RCALL _spi_write
(0173) spi_write((uint)(page>>6)); //2个无关位,12位页地址 PA11~PA0 与10个无关位
01C1 E026 LDI R18,6
01C2 E030 LDI R19,0
01C3 018A MOVW R16,R20
01C4 940E0677 CALL lsr16
01C6 DF2B RCALL _spi_write
(0174) spi_write((uint)(page<<2));
01C7 018A MOVW R16,R20
01C8 0F00 LSL R16
01C9 1F11 ROL R17
01CA 0F00 LSL R16
01CB 1F11 ROL R17
01CC DF25 RCALL _spi_write
(0175) spi_write(0x00); // don't cares
01CD 2700 CLR R16
01CE 2711 CLR R17
01CF DF22 RCALL _spi_write
(0176)
(0177) UNSELECT_CHIP;
01D0 9AC4 SBI 0x18,4
(0178)
(0179) df_wait_busy();
01D1 DF26 RCALL _df_wait_busy
01D2 940E0647 CALL pop_gset2
01D4 9508 RET
(0180) }
(0181) //========================================================================
(0182) void df_write_close(void)
(0183) {
(0184) write_page_from_buffer(g_CurWritePage,DF_WRITE_BUFFER); //缓冲区内容写入到主存储器
_df_write_close:
01D5 E021 LDI R18,1
01D6 E030 LDI R19,0
01D7 91000140 LDS R16,_g_CurWritePage
01D9 91100141 LDS R17,_g_CurWritePage+1
01DB DFD3 RCALL _write_page_from_buffer
01DC 9508 RET
(0185) }
(0186) //========================================================================
(0187) void df_read_close(void)
(0188) {
(0189) ;//此处不做任何处理
_df_read_close:
01DD 9508 RET
_df_read:
temp --> R10
size --> R20
buf --> R22
01DE 940E066B CALL push_gset3
01E0 01A9 MOVW R20,R18
01E1 01B8 MOVW R22,R16
01E2 9722 SBIW R28,2
(0190) }
(0191) //========================================================================
(0192) void df_read(uint *buf,uint size)
(0193) {
(0194) uint temp;
(0195)
(0196) if((g_CurReadByte + size) > DF_PAGE_SIZE) //如果当前页未读取数据不够size字节
01E3 90200142 LDS R2,_g_CurReadByte
01E5 90300143 LDS R3,_g_CurReadByte+1
01E7 0E24 ADD R2,R20
01E8 1E35 ADC R3,R21
01E9 E180 LDI R24,0x10
01EA E092 LDI R25,2
01EB 1582 CP R24,R2
01EC 0593 CPC R25,R3
01ED F570 BCC 0x021C
(0197) {
(0198) //读当前页剩余数据
(0199) temp=DF_PAGE_SIZE - g_CurReadByte;
01EE 90200142 LDS R2,_g_CurReadByte
01F0 90300143 LDS R3,_g_CurReadByte+1
01F2 015C MOVW R10,R24
01F3 18A2 SUB R10,R2
01F4 08B3 SBC R11,R3
(0200) read_buffer(g_CurReadByte,buf,temp);
01F5 82B9 STD Y+1,R11
01F6 82A8 STD Y+0,R10
01F7 019B MOVW R18,R22
01F8 0181 MOVW R16,R2
01F9 D050 RCALL _read_buffer
(0201)
(0202) //装入下一页
(0203) load_page_to_buffer(++g_CurReadPage,DF_READ_BUFFER);
01FA 2722 CLR R18
01FB 2733 CLR R19
01FC 91800144 LDS R24,_g_CurReadPage
01FE 91900145 LDS R25,_g_CurReadPage+1
0200 9601 ADIW R24,1
0201 93900145 STS _g_CurReadPage+1,R25
0203 93800144 STS _g_CurReadPage,R24
0205 018C MOVW R16,R24
0206 DEC6 RCALL _load_page_to_buffer
(0204)
(0205) //从下一页读剩余数据
(0206) g_CurReadByte=size-temp;
0207 011A MOVW R2,R20
0208 182A SUB R2,R10
0209 083B SBC R3,R11
020A 92300143 STS _g_CurReadByte+1,R3
020C 92200142 STS _g_CurReadByte,R2
(0207) read_buffer(0,buf+temp,g_CurReadByte);
020E 8239 STD Y+1,R3
020F 8228 STD Y+0,R2
0210 E002 LDI R16,2
0211 E010 LDI R17,0
0212 0195 MOVW R18,R10
0213 940E0637 CALL empy16s
0215 0198 MOVW R18,R16
0216 0F26 ADD R18,R22
0217 1F37 ADC R19,R23
0218 2700 CLR R16
0219 2711 CLR R17
021A D02F RCALL _read_buffer
(0208) }
021B C02A RJMP 0x0246
(0209) else //如果当前页数据有size字节
(0210) {
(0211) read_buffer(g_CurReadByte,buf,size);
021C 8359 STD Y+1,R21
021D 8348 STD Y+0,R20
021E 019B MOVW R18,R22
021F 91000142 LDS R16,_g_CurReadByte
0221 91100143 LDS R17,_g_CurReadByte+1
0223 D026 RCALL _read_buffer
(0212) g_CurReadByte+=size;
0224 90200142 LDS R2,_g_CurReadByte
0226 90300143 LDS R3,_g_CurReadByte+1
0228 0E24 ADD R2,R20
0229 1E35 ADC R3,R21
022A 92300143 STS _g_CurReadByte+1,R3
022C 92200142 STS _g_CurReadByte,R2
(0213)
(0214) //如果当前页数据已全部读完
(0215) if(g_CurReadByte==DF_PAGE_SIZE)
022E 01C1 MOVW R24,R2
022F 3180 CPI R24,0x10
0230 E0E2 LDI R30,2
0231 079E CPC R25,R30
0232 F499 BNE 0x0246
(0216) {
(0217) load_page_to_buffer(++g_CurReadPage,DF_READ_BUFFER);
0233 2722 CLR R18
0234 2733 CLR R19
0235 91800144 LDS R24,_g_CurReadPage
0237 91900145 LDS R25,_g_CurReadPage+1
0239 9601 ADIW R24,1
023A 93900145 STS _g_CurReadPage+1,R25
023C 93800144 STS _g_CurReadPage,R24
023E 018C MOVW R16,R24
023F DE8D RCALL _load_page_to_buffer
(0218) g_CurReadByte=0;
0240 2422 CLR R2
0241 2433 CLR R3
0242 92300143 STS _g_CurReadByte+1,R3
0244 92200142 STS _g_CurReadByte,R2
(0219) }
(0220) }
0246 9622 ADIW R28,2
0247 940E064A CALL pop_gset3
0249 9508 RET
_read_buffer:
i --> R20
size --> R22
data --> R10
addr --> R20
024A 940E066B CALL push_gset3
024C 0159 MOVW R10,R18
024D 01A8 MOVW R20,R16
024E 816E LDD R22,Y+6
024F 817F LDD R23,Y+7
(0221) }
(0222) //========================================================================
(0223) //从读缓冲区读数据
(0224) void read_buffer(uint addr,uint *data,uint size)
(0225) {
(0226) uint i;
(0227)
(0228) SELECT_CHIP;
0250 B388 IN R24,0x18
0251 7E8F ANDI R24,0xEF
0252 BB88 OUT 0x18,R24
(0229)
(0230) spi_write(BUFFER_1_READ);
0253 ED01 LDI R16,0xD1
0254 E010 LDI R17,0
0255 DE9C RCALL _spi_write
(0231) spi_write(0x00);
0256 2700 CLR R16
0257 2711 CLR R17
0258 DE99 RCALL _spi_write
(0232) spi_write((uint)(addr>>8));
0259 018A MOVW R16,R20
025A 2F01 MOV R16,R17
025B 2711 CLR R17
025C DE95 RCALL _spi_write
(0233) spi_write((uint)addr);
025D 018A MOVW R16,R20
025E DE93 RCALL _spi_write
(0234) for(i=0;i<size;i++)
025F 2744 CLR R20
0260 2755 CLR R21
0261 C010 RJMP 0x0272
(0235) data[i]=spi_write(0);
0262 2700 CLR R16
0263 2711 CLR R17
0264 DE8D RCALL _spi_write
0265 0118 MOVW R2,R16
0266 E002 LDI R16,2
0267 E010 LDI R17,0
0268 019A MOVW R18,R20
0269 940E0637 CALL empy16s
026B 01F8 MOVW R30,R16
026C 0DEA ADD R30,R10
026D 1DFB ADC R31,R11
026E 8231 STD Z+1,R3
026F 8220 STD Z+0,R2
0270 5F4F SUBI R20,0xFF
0271 4F5F SBCI R21,0xFF
0272 1746 CP R20,R22
0273 0757 CPC R21,R23
0274 F368 BCS 0x0262
(0236)
(0237) UNSELECT_CHIP;
0275 9AC4 SBI 0x18,4
0276 940E064A CALL pop_gset3
0278 9508 RET
_Read_Page:
size --> Y+8
buf --> Y+6
page_address --> R20
page --> R22
0279 940E0667 CALL push_gset2
027B 01A9 MOVW R20,R18
027C 01B8 MOVW R22,R16
027D 9722 SBIW R28,2
(0238) }
(0239) //========================================================================
(0240) void Read_Page(uint page,uint page_address, uint *buf,uint size) //page 页地址, page_address 页内地址, buf 数据 , size 多少个字节
(0241) {
(0242) load_page_to_buffer(page,DF_READ_BUFFER); // 将主存储器指定的页内容读到缓冲区
027E 2722 CLR R18
027F 2733 CLR R19
0280 018B MOVW R16,R22
0281 DE4B RCALL _load_page_to_buffer
(0243) read_buffer(page_address,buf,size); //从读缓冲区读数据
0282 8408 LDD R0,Y+8
0283 8419 LDD R1,Y+9
0284 8219 STD Y+1,R1
0285 8208 STD Y+0,R0
0286 812E LDD R18,Y+6
0287 813F LDD R19,Y+7
0288 018A MOVW R16,R20
0289 DFC0 RCALL _read_buffer
028A 9622 ADIW R28,2
028B 940E0647 CALL pop_gset2
028D 9508 RET
_Write_page:
size --> Y+8
buf --> Y+6
page_address --> R22
page --> R20
028E 940E0667 CALL push_gset2
0290 01B9 MOVW R22,R18
0291 01A8 MOVW R20,R16
0292 9722 SBIW R28,2
(0244) }
(0245) //========================================================================
(0246) void Write_page(uint page, uint page_address, uint *buf,uint size) //page 页地址, page_address 页内地址, buf 数据 , size 多少个字节
(0247) {
(0248) load_page_to_buffer(page,DF_WRITE_BUFFER); // 将主存储器指定的页内容读到缓冲区
0293 E021 LDI R18,1
0294 E030 LDI R19,0
0295 018A MOVW R16,R20
0296 DE36 RCALL _load_page_to_buffer
(0249) write_buffer(page_address,buf,size); //将数据写入写缓冲区
0297 8408 LDD R0,Y+8
0298 8419 LDD R1,Y+9
0299 8219 STD Y+1,R1
029A 8208 STD Y+0,R0
029B 812E LDD R18,Y+6
029C 813F LDD R19,Y+7
029D 018B MOVW R16,R22
029E DEE4 RCALL _write_buffer
(0250) write_page_from_buffer(page,DF_WRITE_BUFFER); //将缓冲区内容写入到主存储器中指定页中
029F E021 LDI R18,1
02A0 E030 LDI R19,0
02A1 018A MOVW R16,R20
02A2 DF0C RCALL _write_page_from_buffer
02A3 9622 ADIW R28,2
02A4 940E0647 CALL pop_gset2
02A6 9508 RET
_Page_Scrape:
page --> R20
02A7 940E0650 CALL push_gset1
02A9 01A8 MOVW R20,R16
(0251) }
(0252) //========================================================================
(0253) void Page_Scrape(uint page) //page 要擦除的页
(0254) {
(0255) SELECT_CHIP;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -