⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at45db041d.lst

📁 用ATMEGA16的硬件SPI驱动AT45DB041D
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -