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

📄 at45db041d.lst

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