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

📄 sd.s

📁 AVR单片机做的MP3
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module sd.c
	.area text(rom, con, rel)
	.dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
	.dbfunc e SPI_ReadByte _SPI_ReadByte fc
	.even
_SPI_ReadByte::
	.dbline -1
	.dbline 9
; #include<iom16v.h>
; #include<main.h>
; #include<sd.h>
; 
; 
; extern uint8 BUFFER[512];
; 
; uint8 SPI_ReadByte(void)
; {
	.dbline 10
;    SPDR = 0xFF;
	ldi R24,255
	out 0xf,R24
L2:
	.dbline 11
L3:
	.dbline 11
;    while (!(SPSR & 0x80)); 
	sbis 0xe,7
	rjmp L2
	.dbline 12
;    return SPDR;
	in R16,0xf
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SPI_TransferByte _SPI_TransferByte fV
;           cmp1 -> R16
	.even
_SPI_TransferByte::
	.dbline -1
	.dbline 15
; }
; void SPI_TransferByte(uint8 cmp1)  
; {   
	.dbline 16
;  SPDR=cmp1;
	out 0xf,R16
L6:
	.dbline 17
L7:
	.dbline 17
;  while(!(SPSR&(1<<SPIF)));    
	sbis 0xe,7
	rjmp L6
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbsym r cmp1 16 c
	.dbend
	.dbfunc e SD_Port_Init _SD_Port_Init fV
	.even
_SD_Port_Init::
	.dbline -1
	.dbline 22
; } 
; 
; void SD_Port_Init(void)
; //****************************************************************************
; {
	.dbline 23
;         SD_PORT        |=  (1<<SD_SS);//(1<<SD_SCK)
	sbi 0x18,4
	.dbline 24
;         SD_DDR         |=  (1<<SD_SCK)|(1<<SD_MOSI)|(1<<SD_SS);
	in R24,0x17
	ori R24,176
	out 0x17,R24
	.dbline 25
;         SD_DDR         &= ~(1<<SD_MISO);
	cbi 0x17,6
	.dbline 26
; 		SD_Disable();
	sbi 0x18,4
	.dbline -2
L9:
	.dbline 0 ; func end
	ret
	.dbend
	.area lit(rom, con, rel)
L11:
	.byte 64,0
	.byte 0,0
	.byte 0,149
	.area text(rom, con, rel)
	.dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
	.dbfunc e SD_Init _SD_Init fc
;          retry -> R20
;            CMD -> y+0
;           temp -> R22
;              i -> R10
	.even
_SD_Init::
	rcall push_gset3
	sbiw R28,6
	.dbline -1
	.dbline 33
; }
; 
; //****************************************************************************
; //Routine for Init MMC/SD card(SPI-MODE)
; uint8 SD_Init(void)
; //****************************************************************************
; {
	.dbline 37
;         uint8 retry,temp;
;         uint8 i;
; 
;        uint8 CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};
	ldi R24,<L11
	ldi R25,>L11
	movw R30,R28
	ldi R16,6
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 38
;    SD_Port_Init(); //Init SPI port  
	rcall _SD_Port_Init
	.dbline 40
	clr R10
	rjmp L15
L12:
	.dbline 40
	nop
L13:
	.dbline 40
	inc R10
L15:
	.dbline 40
; 
;    for (i = 0; i < 200; i++) asm("nop"); //Wait MMC/SD ready...
	mov R24,R10
	cpi R24,200
	brlo L12
	.dbline 43
;    
;    //Active SPI bus at low speed 
;    SPCR=0x53; //SPI Master,MSB First 
	ldi R24,83
	out 0xd,R24
	.dbline 44
;    SPSR=0x00; //double speed disable,Fsck=Fosc/128 
	clr R2
	out 0xe,R2
	.dbline 46
; 
;    for (i = 0; i < 16; i++)
	clr R10
	rjmp L19
L16:
	.dbline 47
	ldi R16,255
	rcall _SPI_TransferByte
L17:
	.dbline 46
	inc R10
L19:
	.dbline 46
	mov R24,R10
	cpi R24,16
	brlo L16
	.dbline 50
;       SPI_TransferByte(0xff); //send 74 clock at least!!! 
; 	
;    //Send Command CMD0 to MMC/SD Card
;    SD_Enable();
	cbi 0x18,4
	.dbline 51
;    retry = 0;
	clr R20
L20:
	.dbline 53
;    do
;    { //retry 200 times to send CMD0 command 
	.dbline 54
;      temp = Write_Command_SD(CMD);
	movw R16,R28
	rcall _Write_Command_SD
	mov R22,R16
	.dbline 55
;      if (retry++ == 200) 
	mov R2,R20
	clr R3
	subi R20,255    ; addi 1
	mov R24,R2
	cpi R24,200
	brne L23
	.dbline 56
;        return INIT_CMD0_ERROR;//CMD0 Error!
	ldi R16,1
	rjmp L10
L23:
	.dbline 57
;    }
L21:
	.dbline 58
;    while (temp != 1);
	cpi R22,1
	brne L20
	.dbline 61
;    
;    //Send Command CMD1 to MMC/SD-Card
;    CMD[0] = 0x41; //Command 1
	ldi R24,65
	std y+0,R24
	.dbline 62
;    CMD[5] = 0xFF;
	ldi R24,255
	std y+5,R24
	.dbline 63
;    retry = 0;
	clr R20
L26:
	.dbline 65
;    do
;    { //retry 100 times to send CMD1 command 
	.dbline 66
;      temp = Write_Command_SD(CMD);
	movw R16,R28
	rcall _Write_Command_SD
	mov R22,R16
	.dbline 67
;      if (retry++ == 100) 
	mov R2,R20
	clr R3
	subi R20,255    ; addi 1
	mov R24,R2
	cpi R24,100
	brne L29
	.dbline 68
;        return INIT_CMD1_ERROR;//CMD1 Error!
	ldi R16,2
	rjmp L10
L29:
	.dbline 69
;    } 
L27:
	.dbline 70
;    while (temp != 0);
	tst R22
	brne L26
	.dbline 73
;    
;    //Active High-speed SPI mode(Fsck=Fosc/2) 
;    SPCR = 0x50; 
	ldi R24,80
	out 0xd,R24
	.dbline 74
;    SPSR = 0x00; 
	clr R2
	out 0xe,R2
	.dbline 76
; 
;    SD_Disable();  //set MMC_Chip_Select to high 
	sbi 0x18,4
	.dbline 77
;    return INIT_OK; //All commands have been taken.
	clr R16
	.dbline -2
L10:
	adiw R28,6
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r retry 20 c
	.dbsym l CMD 0 A[6:6]c
	.dbsym r temp 22 c
	.dbsym r i 10 c
	.dbend
	.dbfunc e Write_Command_SD _Write_Command_SD fc
;          retry -> R20
;              i -> R22
;            tmp -> R10
;            cmd -> R12,R13
	.even
_Write_Command_SD::
	rcall push_gset4
	movw R12,R16
	.dbline -1
	.dbline 85
; }
; 
; //****************************************************************************
; //Send a Command to MMC/SD-Card
; //Return: the second byte of response register of MMC/SD-Card
; uint8 Write_Command_SD(uint8 *cmd)
; //****************************************************************************
; {
	.dbline 87
;         uint8 tmp,i;
;         uint8 retry=0;
	clr R20
	.dbline 88
;         SD_Disable();
	sbi 0x18,4
	.dbline 89
; 		SPI_TransferByte(0xFF);
	ldi R16,255
	rcall _SPI_TransferByte
	.dbline 90
; 		SD_Enable();
	cbi 0x18,4
	.dbline 91
; 		for(i=0;i<6;i++)
	clr R22
	rjmp L35
L32:
	.dbline 92
	.dbline 93
	movw R30,R12
	ld R16,Z+
	movw R12,R30
	rcall _SPI_TransferByte
	.dbline 94
L33:
	.dbline 91
	inc R22
L35:
	.dbline 91
	cpi R22,6
	brlo L32
	.dbline 95
; 		{
;         SPI_TransferByte(*cmd++);
;         }
;         SPI_ReadByte();
	rcall _SPI_ReadByte
L36:
	.dbline 97
;         
;         do{
	.dbline 98
;                 tmp = SPI_ReadByte();
	rcall _SPI_ReadByte
	mov R10,R16
	.dbline 99
L37:
	.dbline 99
;         }while((tmp==0xff)&&(retry++ <100));
	mov R24,R10
	cpi R24,255
	brne L39
	mov R2,R20
	clr R3
	subi R20,255    ; addi 1
	mov R24,R2
	cpi R24,100
	brlo L36
L39:
	.dbline 100
;         return(tmp);
	mov R16,R10
	.dbline -2
L31:
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r retry 20 c
	.dbsym r i 22 c
	.dbsym r tmp 10 c
	.dbsym r cmd 12 pc
	.dbend
	.dbfunc e SD_Read_Block _SD_Read_Block fc
;          retry -> R20
;           temp -> R22
;              i -> R22,R23
;          Bytes -> R10,R11
;         Buffer -> R12,R13
;            CMD -> R14,R15
	.even
_SD_Read_Block::
	rcall push_gset5
	movw R12,R18
	movw R14,R16
	ldd R10,y+10
	ldd R11,y+11
	.dbline -1
	.dbline 105
; }
; 
; uint8 SD_Read_Block(uint8 *CMD,uint8 *Buffer,uint16 Bytes)
; //****************************************************************************
; {  
	.dbline 110
;    uint16 i;
;    uint8 retry, temp;
;     
;    //Send Command CMD to MMC/SD-Card
;    retry=0;
	clr R20
L41:
	.dbline 112
;    do
;    {  //Retry 100 times to send command.
	.dbline 113
;       temp=Write_Command_SD(CMD);
	movw R16,R14
	rcall _Write_Command_SD
	mov R22,R16
	.dbline 114
;       if(retry++ == 100) 
	mov R2,R20
	clr R3
	subi R20,255    ; addi 1
	mov R24,R2
	cpi R24,100
	brne L44
	.dbline 115
;         return READ_BLOCK_ERROR; //block write Error!
	ldi R16,4
	rjmp L40
L44:
	.dbline 116
;    }
L42:
	.dbline 117
;    while (temp != 0); 
	tst R22
	brne L41
L46:
	.dbline 120
L47:
	.dbline 120
;    			
;    //Read Start Byte form MMC/SD-Card (FEh/Start Byte)
;    while (SPI_ReadByte() != 0xfe);
	rcall _SPI_ReadByte
	cpi R16,254
	brne L46
	.dbline 123
; 	
;    //Write blocks(normal 512Bytes) to MMC/SD-Card
;    for (i = 0; i < Bytes; i++)
	clr R22
	clr R23
	rjmp L52
L49:
	.dbline 124
	.dbline 125
	rcall _SPI_ReadByte
	movw R30,R12
	st Z+,R16
	movw R12,R30
	.dbline 127
L50:
	.dbline 123
	subi R22,255  ; offset = 1
	sbci R23,255
L52:
	.dbline 123
	cp R22,R10
	cpc R23,R11
	brlo L49

⌨️ 快捷键说明

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