📄 at45db041d.lst
字号:
(0319) for(i=0;i<8;i++)//read
1DC 2744 CLR R20
1DD C008 RJMP 0x01E6
(0320) {
(0321) Sector_Protection_Register[i] = SPI_Read_Byte(0);
1DE 2700 CLR R16
1DF DEEF RCALL _SPI_Read_Byte
1E0 2FE4 MOV R30,R20
1E1 27FF CLR R31
1E2 0DEA ADD R30,R10
1E3 1DFB ADC R31,R11
1E4 8300 STD Z+0,R16
1E5 9543 INC R20
1E6 3048 CPI R20,0x8
1E7 F3B0 BCS 0x01DE
(0322) }
(0323) Disable_DFLASH();
1E8 DEF3 RCALL _Disable_DFLASH
1E9 9624 ADIW R28,4
1EA 940C 056E JMP pop_xgset300C
_DF_Cancel_Sector_Protection:
Sector_Protection_Register_for_Write --> Y,+8
j --> R20
Sector_Protection_Register_for_Read --> Y,+0
i --> R22
1EC 940E 0573 CALL push_xgsetF000
1EE 9760 SBIW R28,0x10
(0324) }
(0325) /************************************************************
(0326) *取消所有扇区保护
(0327) *返回1表示成功取消扇区所以保护
(0328) ************************************************************/
(0329) unsigned char DF_Cancel_Sector_Protection(void)
(0330) {
(0331) unsigned char Sector_Protection_Register_for_Write[8]={0,0,0,0,0,0,0,0};//写入0为去保护
1EF E688 LDI R24,0x68
1F0 E090 LDI R25,0
1F1 01FE MOVW R30,R28
1F2 9638 ADIW R30,0x8
1F3 E008 LDI R16,0x8
1F4 E010 LDI R17,0
1F5 93FA ST R31,-Y
1F6 93EA ST R30,-Y
1F7 939A ST R25,-Y
1F8 938A ST R24,-Y
1F9 940E 059E CALL asgncblk
(0332) unsigned char Sector_Protection_Register_for_Read[8]={1,1,1,1,1,1,1,1};//防止默认值为0
1FB E780 LDI R24,0x70
1FC E090 LDI R25,0
1FD 01FE MOVW R30,R28
1FE E008 LDI R16,0x8
1FF E010 LDI R17,0
200 93FA ST R31,-Y
201 93EA ST R30,-Y
202 939A ST R25,-Y
203 938A ST R24,-Y
204 940E 059E CALL asgncblk
(0333) unsigned int i;
(0334) unsigned char j=1;
206 E041 LDI R20,1
(0335) //使能扇区保护
(0336) DF_Enable_Sector_Protection();
207 DF2E RCALL _DF_Enable_Sector_Protection
(0337) //设置扇区保护
(0338)
(0339) DF_Program_Sector_Protection_Register(Sector_Protection_Register_for_Write);
208 018E MOVW R16,R28
209 5F08 SUBI R16,0xF8
20A 4F1F SBCI R17,0xFF
20B DF87 RCALL _DF_Program_Sector_Protection_Register
(0340) //读取扇区保护寄存器内容
(0341) DF_Read_Sector_Protection_Register(Sector_Protection_Register_for_Read);
20C 018E MOVW R16,R28
20D DFB1 RCALL _DF_Read_Sector_Protection_Register
(0342) //判断扇区保护寄存器内容
(0343) for(i=0;i<8;i++)
20E 2766 CLR R22
20F 2777 CLR R23
210 C00A RJMP 0x021B
(0344) {
(0345) if(Sector_Protection_Register_for_Read[i]!=0) j++;
211 01CE MOVW R24,R28
212 01FB MOVW R30,R22
213 0FE8 ADD R30,R24
214 1FF9 ADC R31,R25
215 8020 LDD R2,Z+0
216 2022 TST R2
217 F009 BEQ 0x0219
218 9543 INC R20
219 5F6F SUBI R22,0xFF
21A 4F7F SBCI R23,0xFF
21B 3068 CPI R22,0x8
21C E0E0 LDI R30,0
21D 077E CPC R23,R30
21E F390 BCS 0x0211
(0346) }
(0347) //禁止扇区保护
(0348) DF_Disable_Sector_Protection();
21F DF35 RCALL _DF_Disable_Sector_Protection
(0349)
(0350) return j;
220 2F04 MOV R16,R20
221 9660 ADIW R28,0x10
222 940C 0578 JMP pop_xgsetF000
_DF_Program_Sector_Lockdown:
Sector_Lockdown_Command --> Y,+0
i --> R20
Sector_Addr --> Y,+5
224 940E 0564 CALL push_arg4
226 934A ST R20,-Y
227 9724 SBIW R28,4
(0351) }
(0352) /************************************************************
(0353) *设置扇区锁(被锁后不能再次解锁)
(0354) *被设置的扇区就只能读不能写
(0355) *非一般情况不要使用(除非数据不用再改)
(0356) *Sector_Addr :地址在哪个扇区中就会锁上那个扇区
(0357) ************************************************************/
(0358) void DF_Program_Sector_Lockdown(unsigned long Sector_Addr)
(0359) {
(0360) //unsigned char Sector_Lockdown_Command=[4]={0x3D,0x2A,0x7F,0x30};//加锁操作码
(0361) unsigned char Sector_Lockdown_Command[4]={0x00,0x00,0x00,0x00};//防止写到,这里乱写
228 E788 LDI R24,0x78
229 E090 LDI R25,0
22A 01FE MOVW R30,R28
22B E004 LDI R16,4
22C E010 LDI R17,0
22D 93FA ST R31,-Y
22E 93EA ST R30,-Y
22F 939A ST R25,-Y
230 938A ST R24,-Y
231 940E 059E CALL asgncblk
(0362) unsigned char i;
(0363)
(0364) DF_Check_Busy_State();
233 DEC5 RCALL _DF_Check_Busy_State
(0365) Enable_DFLASH();
234 DE9F RCALL _Enable_DFLASH
(0366)
(0367) for(i=0;i<4;i++)//write
235 2744 CLR R20
236 C008 RJMP 0x023F
(0368) {
(0369) SPI_Write_Byte(Sector_Lockdown_Command[i]);
237 01CE MOVW R24,R28
238 2FE4 MOV R30,R20
239 27FF CLR R31
23A 0FE8 ADD R30,R24
23B 1FF9 ADC R31,R25
23C 8100 LDD R16,Z+0
23D DE79 RCALL _SPI_Write_Byte
23E 9543 INC R20
23F 3044 CPI R20,4
240 F3B0 BCS 0x0237
(0370) }
(0371)
(0372) //write address
(0373) SPI_Write_Byte((unsigned char)(Sector_Addr>>16));
241 802D LDD R2,Y+5
242 803E LDD R3,Y+6
243 804F LDD R4,Y+7
244 8458 LDD R5,Y+8
245 0112 MOVW R2,R4
246 2444 CLR R4
247 2455 CLR R5
248 2D02 MOV R16,R2
249 DE6D RCALL _SPI_Write_Byte
(0374) SPI_Write_Byte((unsigned char)(Sector_Addr>>8));
24A E088 LDI R24,0x8
24B E090 LDI R25,0
24C 810D LDD R16,Y+5
24D 811E LDD R17,Y+6
24E 812F LDD R18,Y+7
24F 8538 LDD R19,Y+8
250 938A ST R24,-Y
251 940E 0592 CALL lsr32
253 DE63 RCALL _SPI_Write_Byte
(0375) SPI_Write_Byte((unsigned char)Sector_Addr);
254 810D LDD R16,Y+5
255 DE61 RCALL _SPI_Write_Byte
(0376)
(0377) Disable_DFLASH();
256 DE85 RCALL _Disable_DFLASH
257 9624 ADIW R28,4
258 9149 LD R20,Y+
259 9624 ADIW R28,4
25A 9508 RET
_DF_Read_Sector_Lockdown_Register:
Read_Sector_Lockdown_Register --> Y,+0
i --> R20
Sector_Lockdown_Register --> R10
25B 940E 0569 CALL push_xgset300C
25D 0158 MOVW R10,R16
25E 9724 SBIW R28,4
(0378) }
(0379) /************************************************************
(0380) *读取扇区加锁寄存器(返回8个扇区的加锁寄存器值)
(0381) *如果有读到不为0的表示已被加锁
(0382) *(0扇区的高四位为0也表示没加锁,其它扇区一定要全为O)
(0383) ************************************************************/
(0384) void DF_Read_Sector_Lockdown_Register(unsigned char *Sector_Lockdown_Register)
(0385) {
(0386) unsigned char Read_Sector_Lockdown_Register[4]={0x35,0x00,0x00,0x00};
25F E78C LDI R24,0x7C
260 E090 LDI R25,0
261 01FE MOVW R30,R28
262 E004 LDI R16,4
263 E010 LDI R17,0
264 93FA ST R31,-Y
265 93EA ST R30,-Y
266 939A ST R25,-Y
267 938A ST R24,-Y
268 940E 059E CALL asgncblk
(0387) unsigned char i;
(0388)
(0389) DF_Check_Busy_State();
26A DE8E RCALL _DF_Check_Busy_State
(0390) Enable_DFLASH();
26B DE68 RCALL _Enable_DFLASH
(0391)
(0392) for(i=0;i<4;i++)//write
26C 2744 CLR R20
26D C008 RJMP 0x0276
(0393) {
(0394) SPI_Write_Byte(Read_Sector_Lockdown_Register[i]);
26E 01CE MOVW R24,R28
26F 2FE4 MOV R30,R20
270 27FF CLR R31
271 0FE8 ADD R30,R24
272 1FF9 ADC R31,R25
273 8100 LDD R16,Z+0
274 DE42 RCALL _SPI_Write_Byte
275 9543 INC R20
276 3044 CPI R20,4
277 F3B0 BCS 0x026E
(0395) }
(0396) for(i=0;i<8;i++)//read
278 2744 CLR R20
279 C008 RJMP 0x0282
(0397) {
(0398) Sector_Lockdown_Register[i] = SPI_Read_Byte(0);
27A 2700 CLR R16
27B DE53 RCALL _SPI_Read_Byte
27C 2FE4 MOV R30,R20
27D 27FF CLR R31
27E 0DEA ADD R30,R10
27F 1DFB ADC R31,R11
280 8300 STD Z+0,R16
281 9543 INC R20
282 3048 CPI R20,0x8
283 F3B0 BCS 0x027A
(0399) }
(0400) Disable_DFLASH();
284 DE57 RCALL _Disable_DFLASH
285 9624 ADIW R28,4
286 940C 056E JMP pop_xgset300C
_DF_Write_to_Buffer:
i --> R20
wDataSize --> Y,+6
wData --> Y,+4
BFA --> R10
BufferX --> R20
288 940E 0569 CALL push_xgset300C
28A 0159 MOVW R10,R18
28B 2F40 MOV R20,R16
(0401) }
(0402) /************************************************************
(0403) *写数据到缓冲器(Buffer1或Buffer2)(缓冲器大小为264 bytes)
(0404) *BufferX :选择缓冲器(Buffer1或Buffer2)
(0405) *BFA :Buffer内存地址 0~263
(0406) *wData :要写入的数据
(0407) *wDataSize :要写入的数据长度(1~264)
(0408) ************************************************************/
(0409) void DF_Write_to_Buffer(unsigned char BufferX,unsigned int BFA,
(0410) unsigned char *wData,unsigned int wDataSize)
(0411) {
(0412) unsigned int i;
(0413)
(0414) DF_Check_Busy_State(); //check busy bit
28C DE6C RCALL _DF_Check_Busy_State
(0415)
(0416) Enable_DFLASH();
28D DE46 RCALL _Enable_DFLASH
(0417)
(0418) if(BufferX == Buffer1) SPI_Write_Byte(Write_Data_to_Buffer1);//0x84
28E 3041 CPI R20,1
28F F419 BNE 0x0293
290 E804 LDI R16,0x84
291 DE25 RCALL _SPI_Write_Byte
292 C002 RJMP 0x0295
(0419) else SPI_Write_Byte(Write_Data_to_Buffer2);//0x87
293 E807 LDI R16,0x87
294 DE22 RCALL _SPI_Write_Byte
(0420)
(0421) //Page Size (264 Bytes)
(0422) //15 don't care bits + 9 addrress
(0423) SPI_Write_Byte(0xFF); //8 can't care bits
295 EF0F LDI R16,0xFF
296 DE20 RCALL _SPI_Write_Byte
(0424) SPI_Write_Byte((unsigned char)(BFA>>8)); //7 can't care bits + 1 bit address
297 0185 MOVW R16,R10
298 2F01 MOV R16,R17
299 2711 CLR R17
29A DE1C RCALL _SPI_Write_Byte
(0425) SPI_Write_Byte((unsigned char)BFA); //address
29B 2D0A MOV R16,R10
29C DE1A RCALL _SPI_Write_Byte
(0426)
(0427) for(i=0;i<wDataSize;i++) SPI_Write_Byte(wData[i]);//写入数据
29D 2744 CLR R20
29E 2755 CLR R21
29F C009 RJMP 0x02A9
2A0 01FA MOVW R30,R20
2A1 800C LDD R0,Y+4
2A2 801D LDD R1,Y+5
2A3 0DE0 ADD R30,R0
2A4 1DF1 ADC R31,R1
2A5 8100 LDD R16,Z+0
2A6 DE10 RCALL _SPI_Write_Byte
2A7 5F4F SUBI R20,0xFF
2A8 4F5F SBCI R21,0xFF
2A9 800E LDD R0,Y+6
2AA 801F LDD R1,Y+7
2AB 1540 CP R20,R0
2AC 0551 CPC R21,R1
2AD F390 BCS 0x02A0
(0428)
(0429) Disable_DFLASH();
2AE DE2D RCALL _Disable_DFLASH
2AF 940C 056E JMP pop_xgset300C
_DF_Read_from_Buffer:
i --> R20
rDataLen --> Y,+6
rData --> Y,+4
BFA --> R10
BufferX --> R20
2B1 940E 0569 CALL push_xgset300C
2B3 0159 MOVW R10,R18
2B4 2F40 MOV R20,R16
(0430) }
(0431) /************************************************************
(0432) *读取缓冲器(Buffer1或Buffer2)(缓冲器大小为264 bytes)中的数据
(0433) *BufferX :选择缓冲器(Buffer1或Buffer2)
(0434) *BFA :Buffer内存地址 0~263
(0435) *wData :存放读到的数据
(0436) *wDataSize :要写入的数据长度(1~264)
(0437) *注意:高速和低速发的操作码和要发送的数据长度不同
(0438) ************************************************************/
(0439) void DF_Read_from_Buffer(unsigned char BufferX,unsigned int BFA,
(0440) unsigned char *rData,unsigned int rDataLen)
(0441) {
(0442) unsigned int i;
(0443)
(0444) DF_Check_Busy_State(); //check busy bit
2B5 DE43 RCALL _DF_Check_Busy_State
(0445)
(0446) Enable_DFLASH();
2B6 DE1D RCALL _Enable_DFLASH
(0447)
(0448) if(BufferX == Buffer1) SPI_Write_Byte(Read_Data_from_Buffer1);//0xD4 or 0xD1(lower frequency)
2B7 3041 CPI R20,1
2B8 F419 BNE 0x02BC
2B9 ED04 LDI R16,0xD4
2BA DDFC RCALL _SPI_Write_Byte
2BB C002 RJMP 0x02BE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -