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

📄 m16_vs1003_test.lst

📁 AVR单片机系统开发经典实例部分源程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0778 9ADC      SBI	0x1B,4
    0779 9508      RET
FILE: C:\AVR\M\1\sd.c
(0001) 
(0002) #include"sd.h"
(0003) #include"Usart.h"
(0004) 
(0005) 
(0006) //---------------------------------
(0007) //
(0008) //     SD卡接口初始化函数 
(0009) //
(0010) //---------------------------------
(0011) void SD_Port_Init(void)
(0012) {
(0013)  SD_CS_DDR |= 1<<SD_CS_BIT;
_SD_Port_Init:
    077A 9AD1      SBI	0x1A,1
(0014)  SD_CS_PORT |= 1<<SD_CS_BIT;
    077B 9AD9      SBI	0x1B,1
    077C 9508      RET
_SD_SendCommand:
  retry                --> R22
  r1                   --> R20
  arg                  --> Y+6
  cmd                  --> R10
    077D 933A      ST	R19,-Y
    077E 932A      ST	R18,-Y
    077F 940E1426  CALL	push_gset3
    0781 2EA0      MOV	R10,R16
(0015) }
(0016) 
(0017) 
(0018) 
(0019) //---------------------------------
(0020) //
(0021) // SD卡写寄存器函数 
(0022) // arg:命令
(0023) // cmd:命令号
(0024) //
(0025) //---------------------------------
(0026) uint8 SD_SendCommand(uint8 cmd, uint32 arg)
(0027) {
(0028) 	uint8 r1=1;
    0782 E041      LDI	R20,1
(0029) 	uint8 retry=0;
    0783 2766      CLR	R22
(0030) 	
(0031) 
(0032) 	SPI_SrByte(0xff);
    0784 EF0F      LDI	R16,0xFF
    0785 940E08FF  CALL	_SPI_SrByte
(0033) 	SPI_CS_Assert;
    0787 98D9      CBI	0x1B,1
(0034) 	while(r1--);
    0788 2E24      MOV	R2,R20
    0789 2433      CLR	R3
    078A 5041      SUBI	R20,1
    078B 2022      TST	R2
    078C F7D9      BNE	0x0788
(0035) 	
(0036) 	SPI_SrByte((cmd & 0x3f) | 0x40);	/* send command */
    078D 2D0A      MOV	R16,R10
    078E 730F      ANDI	R16,0x3F
    078F 6400      ORI	R16,0x40
    0790 940E08FF  CALL	_SPI_SrByte
(0037) 	
(0038) 	SPI_SrByte(arg>>24);
    0792 E188      LDI	R24,0x18
    0793 E090      LDI	R25,0
    0794 01FE      MOVW	R30,R28
    0795 8026      LDD	R2,Z+6
    0796 8037      LDD	R3,Z+7
    0797 8440      LDD	R4,Z+8
    0798 8451      LDD	R5,Z+9
    0799 938A      ST	R24,-Y
    079A 0181      MOVW	R16,R2
    079B 0192      MOVW	R18,R4
    079C 940E1479  CALL	lsr32
    079E 940E08FF  CALL	_SPI_SrByte
(0039) 	SPI_SrByte(arg>>16);
    07A0 01FE      MOVW	R30,R28
    07A1 8026      LDD	R2,Z+6
    07A2 8037      LDD	R3,Z+7
    07A3 8440      LDD	R4,Z+8
    07A4 8451      LDD	R5,Z+9
    07A5 0112      MOVW	R2,R4
    07A6 2444      CLR	R4
    07A7 2455      CLR	R5
    07A8 2D02      MOV	R16,R2
    07A9 940E08FF  CALL	_SPI_SrByte
(0040) 	SPI_SrByte(arg>>8);
    07AB E088      LDI	R24,0x8
    07AC E090      LDI	R25,0
    07AD 01FE      MOVW	R30,R28
    07AE 8026      LDD	R2,Z+6
    07AF 8037      LDD	R3,Z+7
    07B0 8440      LDD	R4,Z+8
    07B1 8451      LDD	R5,Z+9
    07B2 938A      ST	R24,-Y
    07B3 0181      MOVW	R16,R2
    07B4 0192      MOVW	R18,R4
    07B5 940E1479  CALL	lsr32
    07B7 940E08FF  CALL	_SPI_SrByte
(0041) 	SPI_SrByte(arg);
    07B9 01FE      MOVW	R30,R28
    07BA 8106      LDD	R16,Z+6
    07BB 940E08FF  CALL	_SPI_SrByte
(0042) 	
(0043) 	SPI_SrByte(0x95);
    07BD E905      LDI	R16,0x95
    07BE 940E08FF  CALL	_SPI_SrByte
(0044) 	
(0045) 	SPI_SrByte(0xff);
    07C0 EF0F      LDI	R16,0xFF
    07C1 940E08FF  CALL	_SPI_SrByte
    07C3 C007      RJMP	0x07CB
(0046) 	while((r1 = SPI_SrByte(0xff)) == 0xff)	/* wait response */
(0047) 		if(retry++ > 0xfe) break;				/* time out error */
    07C4 2E26      MOV	R2,R22
    07C5 2433      CLR	R3
    07C6 5F6F      SUBI	R22,0xFF
    07C7 EF8E      LDI	R24,0xFE
    07C8 1582      CP	R24,R2
    07C9 F408      BCC	0x07CB
    07CA C006      RJMP	0x07D1
    07CB EF0F      LDI	R16,0xFF
    07CC 940E08FF  CALL	_SPI_SrByte
    07CE 2F40      MOV	R20,R16
    07CF 3F4F      CPI	R20,0xFF
    07D0 F399      BEQ	0x07C4
(0048) 
(0049) 	SPI_CS_Deassert;
    07D1 9AD9      SBI	0x1B,1
(0050) 	SPI_SrByte(0xff);				// extra 8 CLK
    07D2 EF0F      LDI	R16,0xFF
    07D3 940E08FF  CALL	_SPI_SrByte
(0051) 
(0052) 	return r1;								/* return state */
    07D5 2F04      MOV	R16,R20
    07D6 940E1419  CALL	pop_gset3
    07D8 9622      ADIW	R28,2
    07D9 9508      RET
_SD_Init:
  retry                --> R10
  r1                   --> R12
  i                    --> R14
    07DA 940E1422  CALL	push_gset5
    07DC 9722      SBIW	R28,2
(0053) }
(0054) 
(0055) 
(0056) //---------------------------------
(0057) //
(0058) //        SD卡初始化函数 
(0059) //
(0060) //---------------------------------
(0061) uint8 SD_Init(void)
(0062) {
(0063)     
(0064) 	uint8 i;
(0065) 	uint8 retry = 0;
    07DD 24AA      CLR	R10
(0066) 	uint8 r1 = 0;
    07DE 24CC      CLR	R12
(0067) 	
(0068) 	SD_Port_Init();
    07DF DF9A      RCALL	_SD_Port_Init
(0069) 	
(0070) 	SPI_CS_Assert;
    07E0 98D9      CBI	0x1B,1
(0071) 	delay_ms(1);
    07E1 E001      LDI	R16,1
    07E2 E010      LDI	R17,0
    07E3 E020      LDI	R18,0
    07E4 E030      LDI	R19,0
    07E5 940E1103  CALL	_delay_ms
(0072) 	SPI_CS_Deassert;
    07E7 9AD9      SBI	0x1B,1
(0073) 	delay_ms(1);
    07E8 E001      LDI	R16,1
    07E9 E010      LDI	R17,0
    07EA E020      LDI	R18,0
    07EB E030      LDI	R19,0
    07EC 940E1103  CALL	_delay_ms
(0074) 	
(0075) 	
(0076) 	SPI_Low();	
    07EE 940E08F6  CALL	_SPI_Low
(0077) 	
(0078) 	do
(0079) 	{
(0080) 		for(i=0;i<10;i++) SPI_SrByte(0xff);
    07F0 24EE      CLR	R14
    07F1 C004      RJMP	0x07F6
    07F2 EF0F      LDI	R16,0xFF
    07F3 940E08FF  CALL	_SPI_SrByte
    07F5 94E3      INC	R14
    07F6 2D8E      MOV	R24,R14
    07F7 308A      CPI	R24,0xA
    07F8 F3C8      BCS	0x07F2
(0081) 		r1 = SD_SendCommand(0, 0);//发idle命令	//send idle command
    07F9 E040      LDI	R20,0
    07FA E050      LDI	R21,0
    07FB E060      LDI	R22,0
    07FC E070      LDI	R23,0
    07FD 8368      STD	Y+0,R22
    07FE 8379      STD	Y+1,R23
    07FF 019A      MOVW	R18,R20
    0800 2700      CLR	R16
    0801 DF7B      RCALL	_SD_SendCommand
    0802 2EC0      MOV	R12,R16
(0082) 		retry++;
    0803 94A3      INC	R10
(0083) 		if(retry>0xfe) return 1;//超时退出		//time out
    0804 EF8E      LDI	R24,0xFE
    0805 158A      CP	R24,R10
    0806 F410      BCC	0x0809
    0807 E001      LDI	R16,1
    0808 C02C      RJMP	0x0835
(0084) 	} while(r1 != 0x01);	
    0809 2D8C      MOV	R24,R12
    080A 3081      CPI	R24,1
    080B F721      BNE	0x07F0
(0085) 
(0086) 
(0087) 	retry = 0;
    080C 24AA      CLR	R10
(0088) 	do
(0089) 	{
(0090) 		r1 = SD_SendCommand(1, 0);//发active命令	//send active command
    080D E040      LDI	R20,0
    080E E050      LDI	R21,0
    080F E060      LDI	R22,0
    0810 E070      LDI	R23,0
    0811 8368      STD	Y+0,R22
    0812 8379      STD	Y+1,R23
    0813 019A      MOVW	R18,R20
    0814 E001      LDI	R16,1
    0815 DF67      RCALL	_SD_SendCommand
    0816 2EC0      MOV	R12,R16
(0091) 		retry++;
    0817 94A3      INC	R10
(0092) 		if(retry>0xfe) return 1;//超时退出		//time out
    0818 EF8E      LDI	R24,0xFE
    0819 158A      CP	R24,R10
    081A F410      BCC	0x081D
    081B E001      LDI	R16,1
    081C C018      RJMP	0x0835
(0093) 	} while(r1);
    081D 20CC      TST	R12
    081E F771      BNE	0x080D
(0094) 	
(0095) 	SPI_High();		/* Use High Speed SPI*/
    081F 940E08FB  CALL	_SPI_High
(0096) 	
(0097) 	r1 = SD_SendCommand(59, 0);//关crc		//disable CRC
    0821 E040      LDI	R20,0
    0822 E050      LDI	R21,0
    0823 E060      LDI	R22,0
    0824 E070      LDI	R23,0
    0825 8368      STD	Y+0,R22
    0826 8379      STD	Y+1,R23
    0827 019A      MOVW	R18,R20
    0828 E30B      LDI	R16,0x3B
    0829 DF53      RCALL	_SD_SendCommand
(0098) 
(0099) 	r1 = SD_SendCommand(16, 512);//设扇区大小512	//set sector size to 512
    082A E040      LDI	R20,0
    082B E052      LDI	R21,2
    082C E060      LDI	R22,0
    082D E070      LDI	R23,0
    082E 8368      STD	Y+0,R22
    082F 8379      STD	Y+1,R23
    0830 019A      MOVW	R18,R20
    0831 E100      LDI	R16,0x10
    0832 DF4A      RCALL	_SD_SendCommand
    0833 2EC0      MOV	R12,R16
(0100) 	return 0;//正常返回		//normal return
    0834 2700      CLR	R16
    0835 9622      ADIW	R28,2
    0836 940E141F  CALL	pop_gset5
    0838 9508      RET
_SD_ReadBlock:
  r1                   --> R10
  retry                --> R22
  i                    --> R10
  buffer               --> R20
  sector               --> Y+8
    0839 940E132C  CALL	push_arg4
    083B 940E1426  CALL	push_gset3
    083D 9722      SBIW	R28,2
    083E 854C      LDD	R20,Y+12
    083F 855D      LDD	R21,Y+13
(0101) }
(0102) 
(0103) 
(0104) 
(0105) //---------------------------------------------
(0106) //
(0107) // SD卡扇区读取函数 
(0108) // sector:扇区号
(0109) // buffer:数据缓存
(0110) //
(0111) //---------------------------------------------
(0112) uint8 SD_ReadBlock(uint32 sector, uint8* buffer)
(0113) {
(0114) 	uint8 r1;
(0115) 	uint16 i;
(0116) 	uint16 retry=0;
    0840 2766      CLR	R22
    0841 2777      CLR	R23
(0117) 
(0118) 	SPI_High();		/* Use High Speed SPI*/
    0842 940E08FB  CALL	_SPI_High
(0119) 
(0120) 	r1 = SD_SendCommand(17, sector<<9);//读命令	//read command
    0844 E089      LDI	R24,0x9
    0845 E090      LDI	R25,0
    0846 01FE      MOVW	R30,R28
    0847 8420      LDD	R2,Z+8
    0848 8431      LDD	R3,Z+9
    0849 8442      LDD	R4,Z+10
    084A 8453      LDD	R5,Z+11
    084B 938A      ST	R24,-Y
    084C 0181      MOVW	R16,R2
    084D 0192      MOVW	R18,R4
    084E 940E1466  CALL	lsl32
    0850 8328      STD	Y+0,R18
    0851 8339      STD	Y+1,R19
    0852 0198      MOVW	R18,R16
    0853 E101      LDI	R16,0x11
    0854 DF28      RCALL	_SD_SendCommand
    0855 2EA0      MOV	R10,R16
(0121) 	
(0122) 	if(r1 != 0x00)
    0856 2300      TST	R16
    0857 F009      BEQ	0x0859
(0123) 		return r1;
    0858 C02E      RJMP	0x0887
(0124) 
(0125) 	SPI_CS_Assert;
    0859 98D9      CBI	0x1B,1
    085A C00B      RJMP	0x0866
(0126) 	//等数据的开始	//wait to start recieve data
(0127) 	while(SPI_SrByte(0xff) != 0xfe)
(0128) 	 if(retry++ > 0xfffe)
    085B 011B      MOVW	R2,R22
    085C 5F6F      SUBI	R22,0xFF
    085D 4F7F      SBCI	R23,0xFF
    085E EF8E      LDI	R24,0xFE
    085F EF9F      LDI	R25,0xFF
    0860 1582      CP	R24,R2
    0861 0593      CPC	R25,R3
    0862 F418      BCC	0x0866
(0129) 		 {SPI_CS_Deassert;return 1;}
    0863 9AD9      SBI	0x1B,1
    0864 E001      LDI	R16,1
    0865 C021      RJMP	0x0887
    0866 EF0F      LDI	R16,0xFF
    0867 940E08FF  CALL	_SPI_SrByte
    0869 3F0E      CPI	R16,0xFE
    086A F781      BNE	0x085B
(0130) 
(0131) 	for(i=0; i<512; i++)//读512个数据	//read 512 bytes
    086B 24AA      CLR	R10
    086C 24BB      CLR	R11
    086D C009      RJMP	0x0877
(0132) 	{
(0133) 		*buffer++ = SPI_SrByte(0xff);
    086E EF0F      LDI	R16,0xFF
    086F 940E08FF  CALL	_SPI_SrByte
    0871 01FA      MOVW	R30,R20
    0872 9301      ST	R16,Z+
    0873 01AF      MOVW	R20,R30
    0874 01C5      MOVW	R24,R10
    0875 9601      ADIW	R24,1
    0876 015C      MOVW	R10,R24
    0877 01C5      MOVW	R24,R10
    0878 3080      CPI	R24,0
    0879 E0E2      LDI	R30,2
    087A 079E      CPC	R25,R30
    087B F390      BCS	0x086E
(0134) 	}
(0135) 
(0136) 	SPI_SrByte(0xff);//伪crc    //dummy crc
    087C EF0F      LDI	R16,0xFF
    087D 940E08FF  CALL	_SPI_SrByte
(0137) 	SPI_SrByte(0xff);
    087F EF0F      LDI	R16,0xFF
    0880 940E08FF  CALL	_SPI_SrByte
(0138) 	
(0139) 	SPI_CS_Deassert;
    0882 9AD9      SBI	0x1B,1
(0140) 	SPI_SrByte(0xff);// extra 8 CLK
    0883 EF0F      LDI	R16,0xFF
    0884 940E08FF  CALL	_SPI_SrByte
(0141) 	 
(0142) 
(0143) 	return 0;
    0886 2700      CLR	R16
    0887 9622      ADIW	R28,2
    0888 940E1419  CALL	pop_gset3
    088A 9624      ADIW	R28,4
    088B 9508      RET
_SD_WriteSingleBlock:
  r1                   --> R20
  retry                -

⌨️ 快捷键说明

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