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

📄 m16_vs1003_test.lst

📁 M16-Mp3.rar
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0006) //整理日期:2009.7.8
(0007) //
(0008) //------------------------------------------------------------------------
(0009) 
(0010) #include"sd.h"
(0011) 
(0012) 
(0013) //---------------------------------
(0014) //
(0015) //     SD卡接口初始化函数 
(0016) //
(0017) //---------------------------------
(0018) void SD_Port_Init(void)
(0019) {
(0020)  SD_CS_DDR |= 1<<SD_CS_BIT;
_SD_Port_Init:
     3A8 9AD1      SBI	0x1A,1
(0021)  SD_CS_PORT |= 1<<SD_CS_BIT;
     3A9 9AD9      SBI	0x1B,1
     3AA 9508      RET
_SD_SendCommand:
  retry                --> R22
  r1                   --> R20
  arg                  --> Y,+6
  cmd                  --> R10
     3AB 933A      ST	-Y,R19
     3AC 932A      ST	-Y,R18
     3AD 940E 0E0C CALL	push_xgsetF00C
     3AF 2EA0      MOV	R10,R16
(0022) }
(0023) 
(0024) 
(0025) 
(0026) //---------------------------------
(0027) //
(0028) // SD卡写寄存器函数 
(0029) // arg:命令
(0030) // cmd:命令号
(0031) //
(0032) //---------------------------------
(0033) uint8 SD_SendCommand(uint8 cmd, uint32 arg)
(0034) {
(0035) 	uint8 r1=1;
     3B0 E041      LDI	R20,1
(0036) 	uint8 retry=0;
     3B1 2766      CLR	R22
(0037) 	
(0038) 
(0039) 	SPI_SrByte(0xff);
     3B2 EF0F      LDI	R16,0xFF
     3B3 940E 0C45 CALL	_SPI_SrByte
(0040) 	SPI_CS_Assert;
     3B5 98D9      CBI	0x1B,1
(0041) 	while(r1--);
     3B6 2E24      MOV	R2,R20
     3B7 2433      CLR	R3
     3B8 5041      SUBI	R20,1
     3B9 2022      TST	R2
     3BA F7D9      BNE	0x03B6
(0042) 	
(0043) 	SPI_SrByte((cmd & 0x3f) | 0x40);	/* send command */
     3BB 2D0A      MOV	R16,R10
     3BC 730F      ANDI	R16,0x3F
     3BD 6400      ORI	R16,0x40
     3BE 940E 0C45 CALL	_SPI_SrByte
(0044) 	
(0045) 	SPI_SrByte(arg>>24);
     3C0 E188      LDI	R24,0x18
     3C1 E090      LDI	R25,0
     3C2 810E      LDD	R16,Y+6
     3C3 811F      LDD	R17,Y+7
     3C4 8528      LDD	R18,Y+8
     3C5 8539      LDD	R19,Y+9
     3C6 938A      ST	-Y,R24
     3C7 940E 0E6D CALL	lsr32
     3C9 940E 0C45 CALL	_SPI_SrByte
(0046) 	SPI_SrByte(arg>>16);
     3CB 802E      LDD	R2,Y+6
     3CC 803F      LDD	R3,Y+7
     3CD 8448      LDD	R4,Y+8
     3CE 8459      LDD	R5,Y+9
     3CF 0112      MOVW	R2,R4
     3D0 2444      CLR	R4
     3D1 2455      CLR	R5
     3D2 2D02      MOV	R16,R2
     3D3 940E 0C45 CALL	_SPI_SrByte
(0047) 	SPI_SrByte(arg>>8);
     3D5 E088      LDI	R24,0x8
     3D6 E090      LDI	R25,0
     3D7 810E      LDD	R16,Y+6
     3D8 811F      LDD	R17,Y+7
     3D9 8528      LDD	R18,Y+8
     3DA 8539      LDD	R19,Y+9
     3DB 938A      ST	-Y,R24
     3DC 940E 0E6D CALL	lsr32
     3DE 940E 0C45 CALL	_SPI_SrByte
(0048) 	SPI_SrByte(arg);
     3E0 810E      LDD	R16,Y+6
     3E1 940E 0C45 CALL	_SPI_SrByte
(0049) 	
(0050) 	SPI_SrByte(0x95);
     3E3 E905      LDI	R16,0x95
     3E4 940E 0C45 CALL	_SPI_SrByte
(0051) 	
(0052) 	SPI_SrByte(0xff);
     3E6 EF0F      LDI	R16,0xFF
     3E7 940E 0C45 CALL	_SPI_SrByte
     3E9 C007      RJMP	0x03F1
(0053) 	while((r1 = SPI_SrByte(0xff)) == 0xff)	/* wait response */
(0054) 		if(retry++ > 0xfe) break;				/* time out error */
     3EA 2E26      MOV	R2,R22
     3EB 2433      CLR	R3
     3EC 5F6F      SUBI	R22,0xFF
     3ED EF8E      LDI	R24,0xFE
     3EE 1582      CP	R24,R2
     3EF F408      BCC	0x03F1
     3F0 C007      RJMP	0x03F8
     3F1 EF0F      LDI	R16,0xFF
     3F2 940E 0C45 CALL	_SPI_SrByte
     3F4 2EA0      MOV	R10,R16
     3F5 2D4A      MOV	R20,R10
     3F6 3F0F      CPI	R16,0xFF
     3F7 F391      BEQ	0x03EA
(0055) 
(0056) 	SPI_CS_Deassert;
     3F8 9AD9      SBI	0x1B,1
(0057) 	SPI_SrByte(0xff);				// extra 8 CLK
     3F9 EF0F      LDI	R16,0xFF
     3FA 940E 0C45 CALL	_SPI_SrByte
(0058) 
(0059) 	return r1;								/* return state */
     3FC 2F04      MOV	R16,R20
     3FD 940E 0E13 CALL	pop_xgsetF00C
     3FF 9622      ADIW	R28,2
     400 9508      RET
_SD_Init:
  retry                --> R10
  r1                   --> R20
  i                    --> R22
     401 940E 0E0C CALL	push_xgsetF00C
     403 9722      SBIW	R28,2
(0060) }
(0061) 
(0062) 
(0063) //---------------------------------
(0064) //
(0065) //        SD卡初始化函数 
(0066) //
(0067) //---------------------------------
(0068) uint8 SD_Init(void)
(0069) {
(0070)     
(0071) 	uint8 i;
(0072) 	uint8 retry = 0;
     404 24AA      CLR	R10
(0073) 	uint8 r1 = 0;
     405 2744      CLR	R20
(0074) 	
(0075) 	SD_Port_Init();
     406 DFA1      RCALL	_SD_Port_Init
(0076) 	
(0077) 	SPI_CS_Assert;
     407 98D9      CBI	0x1B,1
(0078) 	delay_ms(1);
     408 E001      LDI	R16,1
     409 E010      LDI	R17,0
     40A E020      LDI	R18,0
     40B E030      LDI	R19,0
     40C 940E 0C4A CALL	_delay_ms
(0079) 	SPI_CS_Deassert;
     40E 9AD9      SBI	0x1B,1
(0080) 	delay_ms(1);
     40F E001      LDI	R16,1
     410 E010      LDI	R17,0
     411 E020      LDI	R18,0
     412 E030      LDI	R19,0
     413 940E 0C4A CALL	_delay_ms
(0081) 	
(0082) 	
(0083) 	SPI_Low();	
     415 940E 0C3C CALL	_SPI_Low
(0084) 	
(0085) 	do
(0086) 	{
(0087) 		for(i=0;i<10;i++) SPI_SrByte(0xff);
     417 2766      CLR	R22
     418 C004      RJMP	0x041D
     419 EF0F      LDI	R16,0xFF
     41A 940E 0C45 CALL	_SPI_SrByte
     41C 9563      INC	R22
     41D 306A      CPI	R22,0xA
     41E F3D0      BCS	0x0419
(0088) 		r1 = SD_SendCommand(0, 0);//发idle命令	//send idle command
     41F E080      LDI	R24,0
     420 E090      LDI	R25,0
     421 E0A0      LDI	R26,0
     422 E0B0      LDI	R27,0
     423 83A8      ST	Y,R26
     424 83B9      STD	Y+1,R27
     425 019C      MOVW	R18,R24
     426 2700      CLR	R16
     427 DF83      RCALL	_SD_SendCommand
     428 2F40      MOV	R20,R16
(0089) 		retry++;
     429 94A3      INC	R10
(0090) 		if(retry>0xfe) return 1;//超时退出		//time out
     42A EF8E      LDI	R24,0xFE
     42B 158A      CP	R24,R10
     42C F410      BCC	0x042F
     42D E001      LDI	R16,1
     42E C02C      RJMP	0x045B
(0091) 	} while(r1 != 0x01);	
     42F 3041      CPI	R20,1
     430 F731      BNE	0x0417
(0092) 
(0093) 
(0094) 	retry = 0;
     431 24AA      CLR	R10
(0095) 	do
(0096) 	{
(0097) 		r1 = SD_SendCommand(1, 0);//发active命令	//send active command
     432 E080      LDI	R24,0
     433 E090      LDI	R25,0
     434 E0A0      LDI	R26,0
     435 E0B0      LDI	R27,0
     436 83A8      ST	Y,R26
     437 83B9      STD	Y+1,R27
     438 019C      MOVW	R18,R24
     439 E001      LDI	R16,1
     43A DF70      RCALL	_SD_SendCommand
     43B 2F40      MOV	R20,R16
(0098) 		retry++;
     43C 94A3      INC	R10
(0099) 		if(retry>0xfe) return 1;//超时退出		//time out
     43D EF8E      LDI	R24,0xFE
     43E 158A      CP	R24,R10
     43F F410      BCC	0x0442
     440 E001      LDI	R16,1
     441 C019      RJMP	0x045B
(0100) 	} while(r1);
     442 2344      TST	R20
     443 F771      BNE	0x0432
(0101) 	
(0102) 	SPI_High();		/* Use High Speed SPI*/
     444 940E 0C41 CALL	_SPI_High
(0103) 	
(0104) 	r1 = SD_SendCommand(59, 0);//关crc		//disable CRC
     446 E080      LDI	R24,0
     447 E090      LDI	R25,0
     448 E0A0      LDI	R26,0
     449 E0B0      LDI	R27,0
     44A 83A8      ST	Y,R26
     44B 83B9      STD	Y+1,R27
     44C 019C      MOVW	R18,R24
     44D E30B      LDI	R16,0x3B
     44E DF5C      RCALL	_SD_SendCommand
(0105) 
(0106) 	r1 = SD_SendCommand(16, 512);//设扇区大小512	//set sector size to 512
     44F E080      LDI	R24,0
     450 E092      LDI	R25,2
     451 E0A0      LDI	R26,0
     452 E0B0      LDI	R27,0
     453 83A8      ST	Y,R26
     454 83B9      STD	Y+1,R27
     455 019C      MOVW	R18,R24
     456 E100      LDI	R16,0x10
     457 DF53      RCALL	_SD_SendCommand
     458 2EA0      MOV	R10,R16
     459 2D4A      MOV	R20,R10
(0107) 	return 0;//正常返回		//normal return
     45A 2700      CLR	R16
     45B 9622      ADIW	R28,2
     45C 940C 0E13 JMP	pop_xgsetF00C
_SD_ReadBlock:
  r1                   --> R12
  retry                --> R20
  i                    --> R20
  buffer               --> R10
  sector               --> Y,+10
     45E 940E 0D3D CALL	push_arg4
     460 940E 0E1A CALL	push_xgsetF03C
     462 9722      SBIW	R28,2
     463 84AE      LDD	R10,Y+14
     464 84BF      LDD	R11,Y+15
(0108) }
(0109) 
(0110) 
(0111) 
(0112) //---------------------------------------------
(0113) //
(0114) // SD卡扇区读取函数 
(0115) // sector:扇区号
(0116) // buffer:数据缓存
(0117) //
(0118) //---------------------------------------------
(0119) uint8 SD_ReadBlock(uint32 sector, uint8* buffer)
(0120) {
(0121) 	uint8 r1;
(0122) 	uint16 i;
(0123) 	uint16 retry=0;
     465 2744      CLR	R20
     466 2755      CLR	R21
(0124) 
(0125) 	SPI_High();		/* Use High Speed SPI*/
     467 940E 0C41 CALL	_SPI_High
(0126) 
(0127) 	r1 = SD_SendCommand(17, sector<<9);//读命令	//read command
     469 E089      LDI	R24,0x9
     46A E090      LDI	R25,0
     46B 850A      LDD	R16,Y+10
     46C 851B      LDD	R17,Y+11
     46D 852C      LDD	R18,Y+12
     46E 853D      LDD	R19,Y+13
     46F 938A      ST	-Y,R24
     470 940E 0E5A CALL	lsl32
     472 8328      ST	Y,R18
     473 8339      STD	Y+1,R19
     474 0198      MOVW	R18,R16
     475 E101      LDI	R16,0x11
     476 DF34      RCALL	_SD_SendCommand
     477 2EC0      MOV	R12,R16
(0128) 	
(0129) 	if(r1 != 0x00)
     478 2300      TST	R16
     479 F009      BEQ	0x047B
(0130) 		return r1;
     47A C02E      RJMP	0x04A9
(0131) 
(0132) 	SPI_CS_Assert;
     47B 98D9      CBI	0x1B,1
     47C C00B      RJMP	0x0488
(0133) 	//等数据的开始	//wait to start recieve data
(0134) 	while(SPI_SrByte(0xff) != 0xfe)
(0135) 	 if(retry++ > 0xfffe)
     47D 011A      MOVW	R2,R20
     47E 5F4F      SUBI	R20,0xFF
     47F 4F5F      SBCI	R21,0xFF
     480 EF8E      LDI	R24,0xFE
     481 EF9F      LDI	R25,0xFF
     482 1582      CP	R24,R2
     483 0593      CPC	R25,R3
     484 F418      BCC	0x0488
(0136) 		 {SPI_CS_Deassert;return 1;}
     485 9AD9      SBI	0x1B,1
     486 E001      LDI	R16,1
     487 C021      RJMP	0x04A9
     488 EF0F      LDI	R16,0xFF
     489 940E 0C45 CALL	_SPI_SrByte
     48B 2F60      MOV	R22,R16
     48C 3F0E      CPI	R16,0xFE
     48D F779      BNE	0x047D
(0137) 
(0138) 	for(i=0; i<512; i++)//读512个数据	//read 512 bytes
     48E 2744      CLR	R20
     48F 2755      CLR	R21
     490 C009      RJMP	0x049A
(0139) 	{
(0140) 		*buffer++ = SPI_SrByte(0xff);
     491 EF0F      LDI	R16,0xFF
     492 940E 0C45 CALL	_SPI_SrByte
     494 2EC0      MOV	R12,R16
     495 01F5      MOVW	R30,R10
     496 92C1      ST	Z+,R12
     497 015F      MOVW	R10,R30
     498 5F4F      SUBI	R20,0xFF
     499 4F5F      SBCI	R21,0xFF
     49A 3040      CPI	R20,0
     49B E0E2      LDI	R30,2
     49C 075E      CPC	R21,R30
     49D F398      BCS	0x0491
(0141) 	}
(0142) 
(0143) 	SPI_SrByte(0xff);//伪crc    //dummy crc
     49E EF0F      LDI	R16,0xFF
     49F 940E 0C45 CALL	_SPI_SrByte
(0144) 	SPI_SrByte(0xff);
     4A1 EF0F      LDI	R16,0xFF
     4A2 940E 0C45 CALL	_SPI_SrByte
(0145) 	
(0146) 	SPI_CS_Deassert;
     4A4 9AD9      SBI	0x1B,1
(0147) 	SPI_SrByte(0xff);// extra 8 CLK
     4A5 EF0F      LDI	R16,0xFF
     4A6 940E 0C45 CALL	_SPI_SrByte
(0148) 
(0149) 	return 0;
     4A8 2700      CLR	R16
     4A9 9622      ADIW	R28,2
     4AA 940E 0E23 CALL	pop_xgsetF03C
     4AC 9624      ADIW	R28,4
     4AD 9508      RET
_SD_WriteSingleBlock:
  r1                   --> R22
  retry                --> R20
  i                    --> R10
  buffer               --> Y,+12
  sector               --> Y,+8
     4AE 940E 0D3D CALL	push_arg4
     4B0 940E 0E0C CALL	push_xgsetF00C
     4B2 9722      SBIW	R28,2
(0150) }
(0151) 
(0152) 
(0153) //---------------------------------------------
(0154) //
(0155) // SD卡扇区写入函数 
(0156) // sector:扇区号
(0157) // buffer:数据缓存
(0158) //
(0159) //---------------------------------------------
(0160) uint8 SD_WriteSingleBlock(uint32 sector, uint8* buffer)
(0161) {
(0162) 	uint8 r1;
(0163) 	uint16 i;
(0164) 	uint16 retry=0;
     4B3 2744      CLR	R20
     4B4 2755      CLR	R21
(0165) 	

⌨️ 快捷键说明

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