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

📄 at45db041d.lst

📁 用ATMEGA16的硬件SPI驱动AT45DB041D
💻 LST
📖 第 1 页 / 共 5 页
字号:
     394 2433      CLR	R3
     395 2C23      MOV	R2,R3
     396 2433      CLR	R3
     397 FC27      SBRC	R2,7
     398 9430      COM	R3
     399 2D0C      MOV	R16,R12
     39A 0F00      LSL	R16
     39B 1F11      ROL	R17
     39C 2902      OR	R16,R2
     39D 2913      OR	R17,R3
     39E DD18      RCALL	_SPI_Write_Byte
(0588)   SPI_Write_Byte((unsigned char)BA);
     39F 2D0A      MOV	R16,R10
     3A0 DD16      RCALL	_SPI_Write_Byte
(0589)   //4 don’t care bytes
(0590)   for(i=0;i<4;i++)	SPI_Write_Byte(0xFF);
     3A1 2744      CLR	R20
     3A2 C003      RJMP	0x03A6
     3A3 EF0F      LDI	R16,0xFF
     3A4 DD12      RCALL	_SPI_Write_Byte
     3A5 9543      INC	R20
     3A6 3044      CPI	R20,4
     3A7 F3D8      BCS	0x03A3
(0591) 
(0592)   for(i=0;i<DataLen;i++)  rData[i] = SPI_Read_Byte(0xFF);//读取数据
     3A8 2744      CLR	R20
     3A9 C00A      RJMP	0x03B4
     3AA EF0F      LDI	R16,0xFF
     3AB DD23      RCALL	_SPI_Read_Byte
     3AC 2FE4      MOV	R30,R20
     3AD 27FF      CLR	R31
     3AE 800E      LDD	R0,Y+6
     3AF 801F      LDD	R1,Y+7
     3B0 0DE0      ADD	R30,R0
     3B1 1DF1      ADC	R31,R1
     3B2 8300      STD	Z+0,R16
     3B3 9543      INC	R20
     3B4 2E24      MOV	R2,R20
     3B5 2433      CLR	R3
     3B6 8408      LDD	R0,Y+8
     3B7 8419      LDD	R1,Y+9
     3B8 1420      CP	R2,R0
     3B9 0431      CPC	R3,R1
     3BA F378      BCS	0x03AA
(0593) 
(0594)   Disable_DFLASH();
     3BB DD20      RCALL	_Disable_DFLASH
     3BC 940C 0584 JMP	pop_xgset303C
_DF_Chip_Erase:
  Chip_Erase_Command   --> Y,+0
  i                    --> R20
     3BE 934A      ST	R20,-Y
     3BF 9724      SBIW	R28,4
(0595) }
(0596) /************************************************************
(0597) *擦除FLASH全部内容
(0598) *not affect sectors that are protected or locked down
(0599) ************************************************************/
(0600) void DF_Chip_Erase(void)
(0601) {
(0602)   unsigned char Chip_Erase_Command[4]={0xC7,0x94,0x80,0x9A};//整片擦除操作码
     3C0 E880      LDI	R24,0x80
     3C1 E090      LDI	R25,0
     3C2 01FE      MOVW	R30,R28
     3C3 E004      LDI	R16,4
     3C4 E010      LDI	R17,0
     3C5 93FA      ST	R31,-Y
     3C6 93EA      ST	R30,-Y
     3C7 939A      ST	R25,-Y
     3C8 938A      ST	R24,-Y
     3C9 940E 059E CALL	asgncblk
(0603)   unsigned char i;
(0604) 
(0605)   DF_Check_Busy_State();
     3CB DD2D      RCALL	_DF_Check_Busy_State
(0606)   Enable_DFLASH();
     3CC DD07      RCALL	_Enable_DFLASH
(0607) 
(0608)   for(i=0;i<4;i++)
     3CD 2744      CLR	R20
     3CE C008      RJMP	0x03D7
(0609)   {
(0610)      SPI_Write_Byte(Chip_Erase_Command[i]);
     3CF 01CE      MOVW	R24,R28
     3D0 2FE4      MOV	R30,R20
     3D1 27FF      CLR	R31
     3D2 0FE8      ADD	R30,R24
     3D3 1FF9      ADC	R31,R25
     3D4 8100      LDD	R16,Z+0
     3D5 DCE1      RCALL	_SPI_Write_Byte
     3D6 9543      INC	R20
     3D7 3044      CPI	R20,4
     3D8 F3B0      BCS	0x03CF
(0611)   }
(0612) 
(0613)   Disable_DFLASH();
     3D9 DD02      RCALL	_Disable_DFLASH
     3DA 9624      ADIW	R28,4
     3DB 9149      LD	R20,Y+
     3DC 9508      RET
(0614) }
(0615) /************************************************************
(0616) *DataFlash初始化(其实是初始化驱动FLASH用到的SPI)
(0617) ************************************************************/
(0618) void DataFlash_Init(void)
(0619) {
(0620)   SPI_Init();
_DataFlash_Init:
     3DD DCCF      RCALL	_SPI_Init
     3DE 9508      RET
(0621) }
(0622) /************************************************************
(0623) *FLASH复位
(0624) ************************************************************/
(0625) void DF_Reset(void)
(0626) {
(0627)   SPI_PORT&=~(1<<RESET);	//使能复位
_DF_Reset:
     3DF 98C3      CBI	0x18,3
(0628)   DF_Delay(100);
     3E0 E604      LDI	R16,0x64
     3E1 E010      LDI	R17,0
     3E2 DCAA      RCALL	_DF_Delay
(0629)   SPI_PORT|=(1<<RESET);     //禁止复位
     3E3 9AC3      SBI	0x18,3
(0630)   DF_Delay(100);
     3E4 E604      LDI	R16,0x64
     3E5 E010      LDI	R17,0
     3E6 DCA6      RCALL	_DF_Delay
     3E7 9508      RET
_Test_Flash_Buffer_to_Buffer:
  TestReadBuffer       --> Y,+14
  TestWriteBuffer      --> Y,+4
  i                    --> R20
     3E8 934A      ST	R20,-Y
     3E9 9768      SBIW	R28,0x18
(0631) }
(0632) /************************************************************
(0633) *Test DataFlash
(0634) ************************************************************/
(0635) //Test_Flash_Buffer_to_Buffer
(0636) void Test_Flash_Buffer_to_Buffer(void)
(0637) {
(0638)   unsigned char i;
(0639)   unsigned char TestWriteBuffer[10]={1,2,3,4,5,6,7,8,9,10};
     3EA E884      LDI	R24,0x84
     3EB E090      LDI	R25,0
     3EC 01FE      MOVW	R30,R28
     3ED 9634      ADIW	R30,4
     3EE E00A      LDI	R16,0xA
     3EF E010      LDI	R17,0
     3F0 93FA      ST	R31,-Y
     3F1 93EA      ST	R30,-Y
     3F2 939A      ST	R25,-Y
     3F3 938A      ST	R24,-Y
     3F4 940E 059E CALL	asgncblk
(0640)   unsigned char TestReadBuffer[10] ={0,0,0,0,0,0,0,0,0,0};
     3F6 E88E      LDI	R24,0x8E
     3F7 E090      LDI	R25,0
     3F8 01FE      MOVW	R30,R28
     3F9 963E      ADIW	R30,0xE
     3FA E00A      LDI	R16,0xA
     3FB E010      LDI	R17,0
     3FC 93FA      ST	R31,-Y
     3FD 93EA      ST	R30,-Y
     3FE 939A      ST	R25,-Y
     3FF 938A      ST	R24,-Y
     400 940E 059E CALL	asgncblk
(0641) 
(0642)   //写数据到Buffer中
(0643)   DF_Write_to_Buffer(Buffer1,0,TestWriteBuffer,10);
     402 E08A      LDI	R24,0xA
     403 E090      LDI	R25,0
     404 839B      STD	Y+3,R25
     405 838A      STD	Y+2,R24
     406 01CE      MOVW	R24,R28
     407 9604      ADIW	R24,4
     408 8399      STD	Y+1,R25
     409 8388      STD	Y+0,R24
     40A 2722      CLR	R18
     40B 2733      CLR	R19
     40C E001      LDI	R16,1
     40D DE7A      RCALL	_DF_Write_to_Buffer
(0644)   //从Buffer中读取数据
(0645)   DF_Read_from_Buffer(Buffer1,0,TestReadBuffer,10);
     40E E08A      LDI	R24,0xA
     40F E090      LDI	R25,0
     410 839B      STD	Y+3,R25
     411 838A      STD	Y+2,R24
     412 01CE      MOVW	R24,R28
     413 960E      ADIW	R24,0xE
     414 8399      STD	Y+1,R25
     415 8388      STD	Y+0,R24
     416 2722      CLR	R18
     417 2733      CLR	R19
     418 E001      LDI	R16,1
     419 DE97      RCALL	_DF_Read_from_Buffer
(0646)   
(0647)   for(i=0;i<10;i++)//把要写入的和读出的数据写入EEPROM用于比较
     41A 2744      CLR	R20
     41B C019      RJMP	0x0435
(0648)   {
(0649)     eeprom_write_byte((i+16*0),TestWriteBuffer[i]);
     41C 01CE      MOVW	R24,R28
     41D 9604      ADIW	R24,4
     41E 2FE4      MOV	R30,R20
     41F 27FF      CLR	R31
     420 0FE8      ADD	R30,R24
     421 1FF9      ADC	R31,R25
     422 8120      LDD	R18,Z+0
     423 2F04      MOV	R16,R20
     424 2711      CLR	R17
     425 940E 055C CALL	_eeprom_write_byte
(0650) 	eeprom_write_byte((i+16*1),TestReadBuffer[i]);
     427 01CE      MOVW	R24,R28
     428 960E      ADIW	R24,0xE
     429 2FE4      MOV	R30,R20
     42A 27FF      CLR	R31
     42B 0FE8      ADD	R30,R24
     42C 1FF9      ADC	R31,R25
     42D 8120      LDD	R18,Z+0
     42E 2F04      MOV	R16,R20
     42F 2711      CLR	R17
     430 5F00      SUBI	R16,0xF0
     431 4F1F      SBCI	R17,0xFF
     432 940E 055C CALL	_eeprom_write_byte
     434 9543      INC	R20
     435 304A      CPI	R20,0xA
     436 F328      BCS	0x041C
     437 9668      ADIW	R28,0x18
     438 9149      LD	R20,Y+
     439 9508      RET
_Test_Flash_Page_to_Page:
  TestReadBuffer       --> Y,+16
  TestWriteBuffer      --> Y,+6
  i                    --> R20
     43A 934A      ST	R20,-Y
     43B 976A      SBIW	R28,0x1A
(0651)   }
(0652) }
(0653) 
(0654) //Test_Flash_Page_to_Page
(0655) void Test_Flash_Page_to_Page(void)
(0656) {
(0657)   unsigned char i;
(0658)   unsigned char TestWriteBuffer[10]={10,9,8,7,6,5,4,3,2,1};
     43C E988      LDI	R24,0x98
     43D E090      LDI	R25,0
     43E 01FE      MOVW	R30,R28
     43F 9636      ADIW	R30,6
     440 E00A      LDI	R16,0xA
     441 E010      LDI	R17,0
     442 93FA      ST	R31,-Y
     443 93EA      ST	R30,-Y
     444 939A      ST	R25,-Y
     445 938A      ST	R24,-Y
     446 940E 059E CALL	asgncblk
(0659)   unsigned char TestReadBuffer[10] ={0,0,0,0,0,0,0,0,0,0};
     448 EA82      LDI	R24,0xA2
     449 E090      LDI	R25,0
     44A 01FE      MOVW	R30,R28
     44B 9670      ADIW	R30,0x10
     44C E00A      LDI	R16,0xA
     44D E010      LDI	R17,0
     44E 93FA      ST	R31,-Y
     44F 93EA      ST	R30,-Y
     450 939A      ST	R25,-Y
     451 938A      ST	R24,-Y
     452 940E 059E CALL	asgncblk
(0660)   
(0661)   //将数据写到内存中(自动先写到BUFFER1 OR BURRER2中再将数据写到内存中)
(0662)   Main_Memory_Page_Program_Through_Buffer(Buffer1,0,0,TestWriteBuffer,10);
     454 E08A      LDI	R24,0xA
     455 E090      LDI	R25,0
     456 839D      STD	Y+5,R25
     457 838C      STD	Y+4,R24
     458 01CE      MOVW	R24,R28
     459 9606      ADIW	R24,6
     45A 839B      STD	Y+3,R25
     45B 838A      STD	Y+2,R24
     45C 2422      CLR	R2
     45D 8228      STD	Y+0,R2
     45E 2722      CLR	R18
     45F 2733      CLR	R19
     460 E001      LDI	R16,1
     461 DEB3      RCALL	_Main_Memory_Page_Program_Through_Buffer
(0663)   //从内存中读取数据到数组rData中(直接读取数据不经过BUFFER1 OR BURRER2)
(0664)   DF_Main_Memory_Page_Read(0,0,TestReadBuffer,10);
     462 E08A      LDI	R24,0xA
     463 E090      LDI	R25,0
     464 839B      STD	Y+3,R25
     465 838A      STD	Y+2,R24
     466 01CE      MOVW	R24,R28
     467 9640      ADIW	R24,0x10
     468 8399      STD	Y+1,R25
     469 8388      STD	Y+0,R24
     46A 2722      CLR	R18
     46B 2700      CLR	R16
     46C 2711      CLR	R17
     46D DEDE      RCALL	_DF_Main_Memory_Page_Read
(0665)   
(0666)   for(i=0;i<10;i++)//把要写入的和读出的数据写入EEPROM用于比较
     46E 2744      CLR	R20
     46F C01B      RJMP	0x048B
(0667)   {
(0668)     eeprom_write_byte((i+16*2),TestWriteBuffer[i]);
     470 01CE      MOVW	R24,R28
     471 9606      ADIW	R24,6
     472 2FE4      MOV	R30,R20
     473 27FF      CLR	R31
     474 0FE8      ADD	R30,R24
     475 1FF9      ADC	R31,R25
     476 8120      LDD	R18,Z+0
     477 2F04      MOV	R16,R20
     478 2711      CLR	R17
     479 5E00      SUBI	R16,0xE0
     47A 4F1F      SBCI	R17,0xFF
     47B 940E 055C CALL	_eeprom_write_byte
(0669) 	eeprom_write_byte((i+16*3),TestReadBuffer[i]);
     47D 01CE      MOVW	R24,R28
     47E 9640      ADIW	R24,0x10
     47F 2FE4      MOV	R30,R20
     480 27FF      CLR	R31
     481 0FE8      ADD	R30,R24
     482 1FF9      ADC	R31,R25
     483 8120      LDD	R18,Z+0
     484 2F04      MOV	R16,R20
     485 2711      CLR	R17
     486 5D00      SUBI	R16,0xD0
     487 4F1F      SBCI	R17,0xFF
     488 940E 055C CALL	_eeprom_write_byte
     48A 9543      INC	R20
     48B 304A      CPI	R20,0xA
     48C F318      BCS	0x0470
     48D 966A      ADIW	R28,0x1A
     48E 9149      LD	R20,Y+
     48F 9508      RET
_Test_Flash_Buffer_Page_to_Page:
  TestReadBuffer       --> Y,+14
  TestWriteBuffer      --> Y,+4
  i                    --> R20
     490 934A      ST	R20,-Y
     491 9768      SBIW	R28,0x18
(0670)   }
(0671) }
(0672) 
(0673) //Test_Flash_Buffer_Page_to_Page
(0674) void Test_Flash_Buffer_Page_to_Page(void)
(0675) {
(0676)   unsigned char i;
(0677)   unsigned char TestWriteBuffer[10]={1,2,3,4,5,6,7,8,9,10};
     492 EA8C      LDI	R24,0xAC
     493 E090      LDI	R25,0
     494 01FE      MOVW	R30,R28
     495 9634      ADIW	R30,4
     496 E00A      LDI	R16,0xA
     497 E010      LDI	R17,0
     498 93FA      ST	R31,-Y
     499 93EA      ST	R30,-Y
     49A 939A      ST	R25,-Y
     49B 938A      ST	R24,-Y
     49C 940E 059E CALL	asgnc

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -