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

📄 at45db041d.lst

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