📄 at45db041d.lst
字号:
(0449) else SPI_Write_Byte(Read_Data_from_Buffer2);//0xD6 or 0xD3(lower frequency)
2BC ED06 LDI R16,0xD6
2BD DDF9 RCALL _SPI_Write_Byte
(0450)
(0451) //Page Size (264 Bytes)
(0452) //15 don't care bits + 9 addrress
(0453) SPI_Write_Byte(0xFF); //8 can't care bits
2BE EF0F LDI R16,0xFF
2BF DDF7 RCALL _SPI_Write_Byte
(0454) SPI_Write_Byte((unsigned char)(BFA>>8)); //7 can't care bits
2C0 0185 MOVW R16,R10
2C1 2F01 MOV R16,R17
2C2 2711 CLR R17
2C3 DDF3 RCALL _SPI_Write_Byte
(0455) SPI_Write_Byte((unsigned char)BFA); //address
2C4 2D0A MOV R16,R10
2C5 DDF1 RCALL _SPI_Write_Byte
(0456) SPI_Write_Byte(0xFF); //1 can't care byte (lower frequency 不用这个字节)
2C6 EF0F LDI R16,0xFF
2C7 DDEF RCALL _SPI_Write_Byte
(0457)
(0458) for(i=0;i<rDataLen;i++) rData[i] = SPI_Read_Byte(0xFF);//读取数据
2C8 2744 CLR R20
2C9 2755 CLR R21
2CA C00A RJMP 0x02D5
2CB EF0F LDI R16,0xFF
2CC DE02 RCALL _SPI_Read_Byte
2CD 01FA MOVW R30,R20
2CE 800C LDD R0,Y+4
2CF 801D LDD R1,Y+5
2D0 0DE0 ADD R30,R0
2D1 1DF1 ADC R31,R1
2D2 8300 STD Z+0,R16
2D3 5F4F SUBI R20,0xFF
2D4 4F5F SBCI R21,0xFF
2D5 800E LDD R0,Y+6
2D6 801F LDD R1,Y+7
2D7 1540 CP R20,R0
2D8 0551 CPC R21,R1
2D9 F388 BCS 0x02CB
(0459)
(0460) Disable_DFLASH();
2DA DE01 RCALL _Disable_DFLASH
2DB 940C 056E JMP pop_xgset300C
_DF_Write_Buffer_to_Page:
PA --> R10
BufferX --> R20
2DD 940E 0569 CALL push_xgset300C
2DF 0159 MOVW R10,R18
2E0 2F40 MOV R20,R16
(0461) }
(0462) /************************************************************
(0463) *把缓冲器(Buffer1或Buffer2)中的数据写到内存的页中(写整页)
(0464) *先擦除再写数据(硬件支持的带擦除写)
(0465) *BufferX :选择缓冲器(Buffer1或Buffer2)
(0466) *PA :内存中页的地址 0~2047
(0467) ************************************************************/
(0468) void DF_Write_Buffer_to_Page(unsigned char BufferX,unsigned int PA)
(0469) {
(0470) DF_Check_Busy_State();
2E1 DE17 RCALL _DF_Check_Busy_State
(0471)
(0472) Enable_DFLASH();
2E2 DDF1 RCALL _Enable_DFLASH
(0473)
(0474) if(BufferX == Buffer1) SPI_Write_Byte(Write_Buffer1_to_Page_whin_Erase);//0x83
2E3 3041 CPI R20,1
2E4 F419 BNE 0x02E8
2E5 E803 LDI R16,0x83
2E6 DDD0 RCALL _SPI_Write_Byte
2E7 C002 RJMP 0x02EA
(0475) else SPI_Write_Byte(Write_Buffer2_to_Page_whin_Erase);//0x86
2E8 E806 LDI R16,0x86
2E9 DDCD RCALL _SPI_Write_Byte
(0476)
(0477) //Page Size (264 Bytes)
(0478) //4 don't care bits + 11 address + 9 don't care bits
(0479) SPI_Write_Byte((unsigned char)(PA>>7));
2EA E027 LDI R18,7
2EB E030 LDI R19,0
2EC 0185 MOVW R16,R10
2ED 940E 058B CALL lsr16
2EF DDC7 RCALL _SPI_Write_Byte
(0480) SPI_Write_Byte((unsigned char)(PA<<1));
2F0 2D0A MOV R16,R10
2F1 0F00 LSL R16
2F2 1F11 ROL R17
2F3 DDC3 RCALL _SPI_Write_Byte
(0481) SPI_Write_Byte(0xFF); //8 don't care bits
2F4 EF0F LDI R16,0xFF
2F5 DDC1 RCALL _SPI_Write_Byte
(0482)
(0483) Disable_DFLASH();
2F6 DDE5 RCALL _Disable_DFLASH
2F7 940C 056E JMP pop_xgset300C
_DF_Read_Buffer_from_Page:
PA --> R10
BufferX --> R20
2F9 940E 0569 CALL push_xgset300C
2FB 0159 MOVW R10,R18
2FC 2F40 MOV R20,R16
(0484) }
(0485) /************************************************************
(0486) *读取内存的页(整页)的数据到缓冲器(Buffer1或Buffer2)中
(0487) *BufferX :选择缓冲器(Buffer1或Buffer2)
(0488) *PA :内存中页的地址 0~2047
(0489) ************************************************************/
(0490) void DF_Read_Buffer_from_Page(unsigned char BufferX,unsigned int PA)
(0491) {
(0492) DF_Check_Busy_State();
2FD DDFB RCALL _DF_Check_Busy_State
(0493)
(0494) Enable_DFLASH();
2FE DDD5 RCALL _Enable_DFLASH
(0495)
(0496) if(BufferX == Buffer1) SPI_Write_Byte(Read_Page_to_Buffer1);//0x53
2FF 3041 CPI R20,1
300 F419 BNE 0x0304
301 E503 LDI R16,0x53
302 DDB4 RCALL _SPI_Write_Byte
303 C002 RJMP 0x0306
(0497) else SPI_Write_Byte(Read_Page_to_Buffer2);//0x55
304 E505 LDI R16,0x55
305 DDB1 RCALL _SPI_Write_Byte
(0498)
(0499) //Page Size (264 Bytes)
(0500) //4 don't care bits + 11 address + 9 don't care bits
(0501) SPI_Write_Byte((unsigned char)(PA>>7));
306 E027 LDI R18,7
307 E030 LDI R19,0
308 0185 MOVW R16,R10
309 940E 058B CALL lsr16
30B DDAB RCALL _SPI_Write_Byte
(0502) SPI_Write_Byte((unsigned char)(PA<<1));
30C 2D0A MOV R16,R10
30D 0F00 LSL R16
30E 1F11 ROL R17
30F DDA7 RCALL _SPI_Write_Byte
(0503) SPI_Write_Byte(0xFF); //8 don't care bits
310 EF0F LDI R16,0xFF
311 DDA5 RCALL _SPI_Write_Byte
(0504)
(0505) Disable_DFLASH();
312 DDC9 RCALL _Disable_DFLASH
313 940C 056E JMP pop_xgset300C
_Main_Memory_Page_Program_Through_Buffer:
i --> R10
DataLen --> Y,+10
wData --> Y,+8
BA --> R10
PA --> R12
BufferX --> R20
315 940E 057D CALL push_xgset303C
317 0169 MOVW R12,R18
318 2F40 MOV R20,R16
319 80AE LDD R10,Y+6
(0506) }
(0507) /************************************************************
(0508) *将数据写到内存中(自动先写到BUFFER1 OR BURRER2中再将数据写到内存中)
(0509) *BufferX :选择自动先写入的缓冲器(Buffer1或Buffer2)
(0510) *PA :内存中的页地址0~2047
(0511) *BA :从页中的这个地址开始写数据,会自动转到下一页(0~263)
(0512) *当写到最后一页的最后一个地址时,会自动转到第一页开始写
(0513) *wData :要写入的数据
(0514) *DataLen :要写入的数据长度
(0515) ************************************************************/
(0516) void Main_Memory_Page_Program_Through_Buffer(unsigned char BufferX,
(0517) unsigned int PA,unsigned char BA,
(0518) unsigned char *wData,unsigned int DataLen)
(0519) {
(0520) unsigned char i;
(0521) DF_Check_Busy_State();
31A DDDE RCALL _DF_Check_Busy_State
(0522) Enable_DFLASH();
31B DDB8 RCALL _Enable_DFLASH
(0523)
(0524) if(BufferX == Buffer1) SPI_Write_Byte(Main_Memory_Page_Program_Through_Buffer1);//0x82
31C 3041 CPI R20,1
31D F419 BNE 0x0321
31E E802 LDI R16,0x82
31F DD97 RCALL _SPI_Write_Byte
320 C002 RJMP 0x0323
(0525) else SPI_Write_Byte(Main_Memory_Page_Program_Through_Buffer2);//0x85
321 E805 LDI R16,0x85
322 DD94 RCALL _SPI_Write_Byte
(0526)
(0527) //4 bits(don't care bits) + 11 bits(page address)+9(address in the page)
(0528) SPI_Write_Byte((unsigned char)(PA>>7));
323 E027 LDI R18,7
324 E030 LDI R19,0
325 0186 MOVW R16,R12
326 940E 058B CALL lsr16
328 DD8E RCALL _SPI_Write_Byte
(0529) SPI_Write_Byte((unsigned char)((PA<<1)|(BA>>8)));
329 2C2A MOV R2,R10
32A 2433 CLR R3
32B 2C23 MOV R2,R3
32C 2433 CLR R3
32D FC27 SBRC R2,7
32E 9430 COM R3
32F 2D0C MOV R16,R12
330 0F00 LSL R16
331 1F11 ROL R17
332 2902 OR R16,R2
333 2913 OR R17,R3
334 DD82 RCALL _SPI_Write_Byte
(0530) SPI_Write_Byte((unsigned char)BA);
335 2D0A MOV R16,R10
336 DD80 RCALL _SPI_Write_Byte
(0531)
(0532) for(i=0;i<DataLen;i++) SPI_Write_Byte(wData[i]);
337 24AA CLR R10
338 C009 RJMP 0x0342
339 2DEA MOV R30,R10
33A 27FF CLR R31
33B 8408 LDD R0,Y+8
33C 8419 LDD R1,Y+9
33D 0DE0 ADD R30,R0
33E 1DF1 ADC R31,R1
33F 8100 LDD R16,Z+0
340 DD76 RCALL _SPI_Write_Byte
341 94A3 INC R10
342 2C2A MOV R2,R10
343 2433 CLR R3
344 840A LDD R0,Y+10
345 841B LDD R1,Y+11
346 1420 CP R2,R0
347 0431 CPC R3,R1
348 F380 BCS 0x0339
(0533)
(0534) Disable_DFLASH();
349 DD92 RCALL _Disable_DFLASH
34A 940C 0584 JMP pop_xgset303C
_DF_Main_Memory_Page_Read:
i --> R20
DataLen --> Y,+8
rData --> Y,+6
BA --> R10
PA --> R12
34C 940E 057D CALL push_xgset303C
34E 2EA2 MOV R10,R18
34F 0168 MOVW R12,R16
(0535) }
(0536) /************************************************************
(0537) *从内存中读取数据到数组rData中(直接读取数据不经过BUFFER1 OR BURRER2)
(0538) *PA :内存中的页地址0~2047
(0539) *BA :从页中的这个地址开始读数据,会自动转到下一页(0~263)
(0540) *当读到最后一页的最后一个地址时,会自动转到第一页开始读取
(0541) *rData :存放读到的数据
(0542) *DataLen :要读取的数据长度
(0543) *与DF_Continuous_Array_Read一样的功能但与Buffer有关,但不改变Buffer中的数据
(0544) ************************************************************/
(0545) void DF_Main_Memory_Page_Read(unsigned int PA,unsigned char BA,
(0546) unsigned char *rData,unsigned int DataLen)
(0547) {
(0548) unsigned char i;
(0549) DF_Check_Busy_State();
350 DDA8 RCALL _DF_Check_Busy_State
(0550)
(0551) Enable_DFLASH();
351 DD82 RCALL _Enable_DFLASH
(0552)
(0553) SPI_Write_Byte(Main_Memory_Page_Read_Command);//0xD2
352 ED02 LDI R16,0xD2
353 DD63 RCALL _SPI_Write_Byte
(0554)
(0555) //4 bits(don't care bits) + 11 bits(page address)+9(address in the page)
(0556) SPI_Write_Byte((unsigned char)(PA>>7));
354 E027 LDI R18,7
355 E030 LDI R19,0
356 0186 MOVW R16,R12
357 940E 058B CALL lsr16
359 DD5D RCALL _SPI_Write_Byte
(0557) SPI_Write_Byte((unsigned char)((PA<<1)|(BA>>8)));
35A 2C2A MOV R2,R10
35B 2433 CLR R3
35C 2C23 MOV R2,R3
35D 2433 CLR R3
35E FC27 SBRC R2,7
35F 9430 COM R3
360 2D0C MOV R16,R12
361 0F00 LSL R16
362 1F11 ROL R17
363 2902 OR R16,R2
364 2913 OR R17,R3
365 DD51 RCALL _SPI_Write_Byte
(0558) SPI_Write_Byte((unsigned char)BA);
366 2D0A MOV R16,R10
367 DD4F RCALL _SPI_Write_Byte
(0559) //4 don’t care bytes
(0560) for(i=0;i<4;i++) SPI_Write_Byte(0xFF);
368 2744 CLR R20
369 C003 RJMP 0x036D
36A EF0F LDI R16,0xFF
36B DD4B RCALL _SPI_Write_Byte
36C 9543 INC R20
36D 3044 CPI R20,4
36E F3D8 BCS 0x036A
(0561)
(0562) for(i=0;i<DataLen;i++) rData[i] = SPI_Read_Byte(0xFF);//读取数据
36F 2744 CLR R20
370 C00A RJMP 0x037B
371 EF0F LDI R16,0xFF
372 DD5C RCALL _SPI_Read_Byte
373 2FE4 MOV R30,R20
374 27FF CLR R31
375 800E LDD R0,Y+6
376 801F LDD R1,Y+7
377 0DE0 ADD R30,R0
378 1DF1 ADC R31,R1
379 8300 STD Z+0,R16
37A 9543 INC R20
37B 2E24 MOV R2,R20
37C 2433 CLR R3
37D 8408 LDD R0,Y+8
37E 8419 LDD R1,Y+9
37F 1420 CP R2,R0
380 0431 CPC R3,R1
381 F378 BCS 0x0371
(0563)
(0564) Disable_DFLASH();
382 DD59 RCALL _Disable_DFLASH
383 940C 0584 JMP pop_xgset303C
_DF_Continuous_Array_Read:
i --> R20
DataLen --> Y,+8
rData --> Y,+6
BA --> R10
PA --> R12
385 940E 057D CALL push_xgset303C
387 2EA2 MOV R10,R18
388 0168 MOVW R12,R16
(0565) }
(0566) /************************************************************
(0567) *从内存中读取数据到数组rData中(直接读取数据不经过BUFFER1 OR BURRER2)
(0568) *PA :内存中的页地址0~2047
(0569) *BA :从页中的这个地址开始读数据,会自动转到下一页(0~263)
(0570) *当读到最后一页的最后一个地址时,会自动转到第一页开始读取
(0571) *rData :存放读到的数据
(0572) *DataLen :要读取的数据长度
(0573) *与DF_Main_Memory_Page_Read一样的功能但与Buffer无关
(0574) ************************************************************/
(0575) void DF_Continuous_Array_Read(unsigned int PA,unsigned char BA,
(0576) unsigned char *rData,unsigned int DataLen)
(0577) {
(0578) unsigned char i;
(0579) DF_Check_Busy_State();
389 DD6F RCALL _DF_Check_Busy_State
(0580)
(0581) Enable_DFLASH();
38A DD49 RCALL _Enable_DFLASH
(0582)
(0583) SPI_Write_Byte(Continuous_Array_Read_Command);//0xE8
38B EE08 LDI R16,0xE8
38C DD2A RCALL _SPI_Write_Byte
(0584)
(0585) //4 bits(don't care bits) + 11 bits(page address)+9(address in the page)
(0586) SPI_Write_Byte((unsigned char)(PA>>7));
38D E027 LDI R18,7
38E E030 LDI R19,0
38F 0186 MOVW R16,R12
390 940E 058B CALL lsr16
392 DD24 RCALL _SPI_Write_Byte
(0587) SPI_Write_Byte((unsigned char)((PA<<1)|(BA>>8)));
393 2C2A MOV R2,R10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -