📄 at45db041d.lst
字号:
(0174) void DF_Manufacturer_and_Device_ID(unsigned char *ID)
(0175) {
(0176) unsigned char i;
(0177)
(0178) DF_Check_Busy_State();
10C DFEC RCALL _DF_Check_Busy_State
(0179)
(0180) Enable_DFLASH();
10D DFC6 RCALL _Enable_DFLASH
(0181)
(0182) SPI_Write_Byte(Device_ID_Opcode);
10E E90F LDI R16,0x9F
10F DFA7 RCALL _SPI_Write_Byte
(0183)
(0184) for(i=0;i<4;i++)
110 2744 CLR R20
111 C008 RJMP 0x011A
(0185) {
(0186) ID[i] = SPI_Read_Byte(0);
112 2700 CLR R16
113 DFBB RCALL _SPI_Read_Byte
114 2FE4 MOV R30,R20
115 27FF CLR R31
116 0DEA ADD R30,R10
117 1DFB ADC R31,R11
118 8300 STD Z+0,R16
119 9543 INC R20
11A 3044 CPI R20,4
11B F3B0 BCS 0x0112
(0187) }
(0188)
(0189) Disable_DFLASH();
11C DFBF RCALL _Disable_DFLASH
11D 940C 056E JMP pop_xgset300C
_Test_Manufacturer_ID:
Test_Buf --> Y,+0
11F 9724 SBIW R28,4
(0190) }
(0191) /************************************************************
(0192) *测试FLASH产家ID,正常返回1,否则返回0
(0193) ************************************************************/
(0194) unsigned char Test_Manufacturer_ID(void)
(0195) {
(0196) unsigned char Test_Buf[4];
(0197) DF_Manufacturer_and_Device_ID(Test_Buf);
120 018E MOVW R16,R28
121 DFE7 RCALL _DF_Manufacturer_and_Device_ID
(0198) if(Test_Buf[0]!=0x1F) return 0; //产家ID不为0x1F则返回0
122 8188 LDD R24,Y+0
123 318F CPI R24,0x1F
124 F011 BEQ 0x0127
125 2700 CLR R16
126 C001 RJMP 0x0128
(0199)
(0200) return 1;//正确返回 1
127 E001 LDI R16,1
128 9624 ADIW R28,4
129 9508 RET
(0201) }
(0202) /************************************************************
(0203) *使FLASH进入Deep_Power_Down
(0204) ************************************************************/
(0205) void DF_Deep_Power_Down(void)
(0206) {
(0207) DF_Check_Busy_State();
_DF_Deep_Power_Down:
12A DFCE RCALL _DF_Check_Busy_State
(0208) Enable_DFLASH();
12B DFA8 RCALL _Enable_DFLASH
(0209) SPI_Write_Byte(0xB9);//写Deep Power-down操作码
12C EB09 LDI R16,0xB9
12D DF89 RCALL _SPI_Write_Byte
(0210) Disable_DFLASH();
12E DFAD RCALL _Disable_DFLASH
12F 9508 RET
(0211) }
(0212) /************************************************************
(0213) *使FLASH退出Deep_Power_Down
(0214) ************************************************************/
(0215) void DF_Resume_from_Deep_Power_Down(void)
(0216) {
(0217) DF_Check_Busy_State();
_DF_Resume_from_Deep_Power_Down:
130 DFC8 RCALL _DF_Check_Busy_State
(0218) Enable_DFLASH();
131 DFA2 RCALL _Enable_DFLASH
(0219) SPI_Write_Byte(0xAB);//写Resume from Deep Power-down操作码
132 EA0B LDI R16,0xAB
133 DF83 RCALL _SPI_Write_Byte
(0220) Disable_DFLASH();
134 DFA7 RCALL _Disable_DFLASH
135 9508 RET
_DF_Enable_Sector_Protection:
Enable_Sector_Protection_Command --> Y,+0
i --> R20
136 934A ST R20,-Y
137 9724 SBIW R28,4
(0221) }
(0222) /************************************************************
(0223) *使能扇区保护
(0224) ************************************************************/
(0225) void DF_Enable_Sector_Protection(void)
(0226) {
(0227) unsigned char Enable_Sector_Protection_Command[4]={0x3D,0x2A,0x7F,0xA9}; //使能扇区保护操作码
138 E584 LDI R24,0x54
139 E090 LDI R25,0
13A 01FE MOVW R30,R28
13B E004 LDI R16,4
13C E010 LDI R17,0
13D 93FA ST R31,-Y
13E 93EA ST R30,-Y
13F 939A ST R25,-Y
140 938A ST R24,-Y
141 940E 059E CALL asgncblk
(0228) unsigned char i;
(0229)
(0230) DF_Check_Busy_State();
143 DFB5 RCALL _DF_Check_Busy_State
(0231) Enable_DFLASH();
144 DF8F RCALL _Enable_DFLASH
(0232) for(i=0;i<4;i++)
145 2744 CLR R20
146 C008 RJMP 0x014F
(0233) {
(0234) SPI_Write_Byte(Enable_Sector_Protection_Command[i]);//写使能扇区保护操作码
147 01CE MOVW R24,R28
148 2FE4 MOV R30,R20
149 27FF CLR R31
14A 0FE8 ADD R30,R24
14B 1FF9 ADC R31,R25
14C 8100 LDD R16,Z+0
14D DF69 RCALL _SPI_Write_Byte
14E 9543 INC R20
14F 3044 CPI R20,4
150 F3B0 BCS 0x0147
(0235) }
(0236) Disable_DFLASH();
151 DF8A RCALL _Disable_DFLASH
152 9624 ADIW R28,4
153 9149 LD R20,Y+
154 9508 RET
_DF_Disable_Sector_Protection:
Disable_Sector_Protection_Command --> Y,+0
i --> R20
155 934A ST R20,-Y
156 9724 SBIW R28,4
(0237) }
(0238) /************************************************************
(0239) *禁止扇区保护
(0240) ************************************************************/
(0241) void DF_Disable_Sector_Protection(void)
(0242) {
(0243) unsigned char Disable_Sector_Protection_Command[4]={0x3D,0x2A,0x7F,0x9A};//禁止扇区保护操作码
157 E588 LDI R24,0x58
158 E090 LDI R25,0
159 01FE MOVW R30,R28
15A E004 LDI R16,4
15B E010 LDI R17,0
15C 93FA ST R31,-Y
15D 93EA ST R30,-Y
15E 939A ST R25,-Y
15F 938A ST R24,-Y
160 940E 059E CALL asgncblk
(0244) unsigned char i;
(0245)
(0246) DF_Check_Busy_State();
162 DF96 RCALL _DF_Check_Busy_State
(0247) Enable_DFLASH();
163 DF70 RCALL _Enable_DFLASH
(0248) for(i=0;i<4;i++)
164 2744 CLR R20
165 C008 RJMP 0x016E
(0249) {
(0250) SPI_Write_Byte(Disable_Sector_Protection_Command[i]);//写禁止扇区保护操作码
166 01CE MOVW R24,R28
167 2FE4 MOV R30,R20
168 27FF CLR R31
169 0FE8 ADD R30,R24
16A 1FF9 ADC R31,R25
16B 8100 LDD R16,Z+0
16C DF4A RCALL _SPI_Write_Byte
16D 9543 INC R20
16E 3044 CPI R20,4
16F F3B0 BCS 0x0166
(0251) }
(0252) Disable_DFLASH();
170 DF6B RCALL _Disable_DFLASH
171 9624 ADIW R28,4
172 9149 LD R20,Y+
173 9508 RET
_DF_Erase_Sector_Protection_Register:
Erase_Sector_Protection_Command --> Y,+0
i --> R20
174 934A ST R20,-Y
175 9724 SBIW R28,4
(0253) }
(0254) /************************************************************
(0255) *擦除扇区保护
(0256) ************************************************************/
(0257) void DF_Erase_Sector_Protection_Register(void)
(0258) {
(0259) unsigned char Erase_Sector_Protection_Command[4]={0x3D,0x2A,0x7F,0xCF};//擦除扇区保护操作码
176 E58C LDI R24,0x5C
177 E090 LDI R25,0
178 01FE MOVW R30,R28
179 E004 LDI R16,4
17A E010 LDI R17,0
17B 93FA ST R31,-Y
17C 93EA ST R30,-Y
17D 939A ST R25,-Y
17E 938A ST R24,-Y
17F 940E 059E CALL asgncblk
(0260) unsigned char i;
(0261)
(0262) DF_Check_Busy_State();
181 DF77 RCALL _DF_Check_Busy_State
(0263) Enable_DFLASH();
182 DF51 RCALL _Enable_DFLASH
(0264) for(i=0;i<4;i++)
183 2744 CLR R20
184 C008 RJMP 0x018D
(0265) {
(0266) SPI_Write_Byte(Erase_Sector_Protection_Command[i]);//写擦除扇区保护操作码
185 01CE MOVW R24,R28
186 2FE4 MOV R30,R20
187 27FF CLR R31
188 0FE8 ADD R30,R24
189 1FF9 ADC R31,R25
18A 8100 LDD R16,Z+0
18B DF2B RCALL _SPI_Write_Byte
18C 9543 INC R20
18D 3044 CPI R20,4
18E F3B0 BCS 0x0185
(0267) }
(0268) Disable_DFLASH();
18F DF4C RCALL _Disable_DFLASH
190 9624 ADIW R28,4
191 9149 LD R20,Y+
192 9508 RET
_DF_Program_Sector_Protection_Register:
Program_Sector_Protection_Command --> Y,+0
i --> R20
Sector_Protection_Register --> R10
193 940E 0569 CALL push_xgset300C
195 0158 MOVW R10,R16
196 9724 SBIW R28,4
(0269) }
(0270) /************************************************************
(0271) *设置扇区保护
(0272) *注意:会改变BUFFER1中的内容
(0273) *Sector_Protection_Register:数组中的0~7字节对对应0~7个扇区(0xFF:写保护)(0x00:擦除保护)
(0274)
(0275) The Sector Protection Register can be reprogrammed while the sector protection enabled or dis-
(0276) abled. Being able to reprogram the Sector Protection Register with the sector protection enabled
(0277) allows the user to temporarily disable the sector protection to an individual sector rather than
(0278) disabling sector protection completely
(0279) ************************************************************/
(0280) void DF_Program_Sector_Protection_Register(unsigned char *Sector_Protection_Register)
(0281) {
(0282) unsigned char Program_Sector_Protection_Command[4]={0x3D,0x2A,0x7F,0xFC};//设置扇区保护操作码
197 E680 LDI R24,0x60
198 E090 LDI R25,0
199 01FE MOVW R30,R28
19A E004 LDI R16,4
19B E010 LDI R17,0
19C 93FA ST R31,-Y
19D 93EA ST R30,-Y
19E 939A ST R25,-Y
19F 938A ST R24,-Y
1A0 940E 059E CALL asgncblk
(0283) unsigned char i;
(0284)
(0285) DF_Check_Busy_State();
1A2 DF56 RCALL _DF_Check_Busy_State
(0286) Enable_DFLASH();
1A3 DF30 RCALL _Enable_DFLASH
(0287) for(i=0;i<4;i++)
1A4 2744 CLR R20
1A5 C008 RJMP 0x01AE
(0288) {
(0289) SPI_Write_Byte(Program_Sector_Protection_Command[i]);//写设置扇区保护操作码
1A6 01CE MOVW R24,R28
1A7 2FE4 MOV R30,R20
1A8 27FF CLR R31
1A9 0FE8 ADD R30,R24
1AA 1FF9 ADC R31,R25
1AB 8100 LDD R16,Z+0
1AC DF0A RCALL _SPI_Write_Byte
1AD 9543 INC R20
1AE 3044 CPI R20,4
1AF F3B0 BCS 0x01A6
(0290) }
(0291) for(i=0;i<8;i++)
1B0 2744 CLR R20
1B1 C007 RJMP 0x01B9
(0292) {
(0293) SPI_Write_Byte(Sector_Protection_Register[i]);//写设置扇区保护数据
1B2 2FE4 MOV R30,R20
1B3 27FF CLR R31
1B4 0DEA ADD R30,R10
1B5 1DFB ADC R31,R11
1B6 8100 LDD R16,Z+0
1B7 DEFF RCALL _SPI_Write_Byte
1B8 9543 INC R20
1B9 3048 CPI R20,0x8
1BA F3B8 BCS 0x01B2
(0294) }
(0295) Disable_DFLASH();
1BB DF20 RCALL _Disable_DFLASH
1BC 9624 ADIW R28,4
1BD 940C 056E JMP pop_xgset300C
_DF_Read_Sector_Protection_Register:
Read_Sector_Protection_Register_Command --> Y,+0
i --> R20
Sector_Protection_Register --> R10
1BF 940E 0569 CALL push_xgset300C
1C1 0158 MOVW R10,R16
1C2 9724 SBIW R28,4
(0296) }
(0297) /************************************************************
(0298) *读取扇区保护寄存器内容(返回8个字节,对应8个扇区的情况)
(0299) ---------------------------------------
(0300) |Sector Number |0 (0a, 0b) |1 to 7 |
(0301) ---------------------------------------
(0302) |Protected | | FFH |
(0303) ---------------- See PDF -----------
(0304) |Unprotected | | 00H |
(0305) ---------------------------------------
(0306) ************************************************************/
(0307) void DF_Read_Sector_Protection_Register(unsigned char *Sector_Protection_Register)
(0308) {
(0309) unsigned char Read_Sector_Protection_Register_Command[4]={0x32,0,0,0};
1C3 E684 LDI R24,0x64
1C4 E090 LDI R25,0
1C5 01FE MOVW R30,R28
1C6 E004 LDI R16,4
1C7 E010 LDI R17,0
1C8 93FA ST R31,-Y
1C9 93EA ST R30,-Y
1CA 939A ST R25,-Y
1CB 938A ST R24,-Y
1CC 940E 059E CALL asgncblk
(0310) unsigned char i;
(0311)
(0312) DF_Check_Busy_State();
1CE DF2A RCALL _DF_Check_Busy_State
(0313) Enable_DFLASH();
1CF DF04 RCALL _Enable_DFLASH
(0314)
(0315) for(i=0;i<4;i++)//write
1D0 2744 CLR R20
1D1 C008 RJMP 0x01DA
(0316) {
(0317) SPI_Write_Byte(Read_Sector_Protection_Register_Command[i]);
1D2 01CE MOVW R24,R28
1D3 2FE4 MOV R30,R20
1D4 27FF CLR R31
1D5 0FE8 ADD R30,R24
1D6 1FF9 ADC R31,R25
1D7 8100 LDD R16,Z+0
1D8 DEDE RCALL _SPI_Write_Byte
1D9 9543 INC R20
1DA 3044 CPI R20,4
1DB F3B0 BCS 0x01D2
(0318) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -