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

📄 sd.s

📁 AVR单片机做的MP3
💻 S
📖 第 1 页 / 共 2 页
字号:
	.dbline 130
;    {
;       *Buffer++ = SPI_ReadByte();
; 	 // put_c(*Buffer);
;    }
;    
;    //CRC-Byte
;    SPI_ReadByte();//CRC - Byte 
	rcall _SPI_ReadByte
	.dbline 131
;    SPI_ReadByte();//CRC - Byte
	rcall _SPI_ReadByte
	.dbline 134
; 	
;    //set MMC_Chip_Select to high (MMC/SD-Card invalid)
;    SD_Disable();
	sbi 0x18,4
	.dbline 135
;    return READ_BLOCK_OK;
	clr R16
	.dbline -2
L40:
	rcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r retry 20 c
	.dbsym r temp 22 c
	.dbsym r i 22 i
	.dbsym r Bytes 10 i
	.dbsym r Buffer 12 pc
	.dbsym r CMD 14 pc
	.dbend
	.area lit(rom, con, rel)
L54:
	.byte 'Q,0
	.byte 0,0
	.byte 0,255
	.area text(rom, con, rel)
	.dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
	.dbfunc e SD_read_sector _SD_read_sector fc
;            CMD -> y+2
;         Buffer -> y+16
;           addr -> y+12
	.even
_SD_read_sector::
	rcall push_arg4
	rcall push_gset2
	sbiw R28,8
	.dbline -1
	.dbline 143
; }
; 
; //****************************************************************************
; //Routine for writing a Block(512Byte) to MMC/SD-Card
; //Return 0 if sector writing is completed.
; uint8 SD_read_sector(uint32 addr,uint8 *Buffer)
; //****************************************************************************
; {
	.dbline 145
;        //Command 16 is reading Blocks from MMC/SD-Card
;    uint8 CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF}; 
	ldi R24,<L54
	ldi R25,>L54
	movw R30,R28
	adiw R30,2
	ldi R16,6
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 147
;    
;    asm("cli"); //clear all interrupt.
	cli
	.dbline 149
;    //Address conversation(logic block address-->byte address)  
;    addr = addr << 9; //addr = addr * 512
	ldi R24,9
	ldi R25,0
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	st -y,R24
	movw R16,R2
	movw R18,R4
	rcall lsl32
	movw R30,R28
	std z+12,R16
	std z+13,R17
	std z+14,R18
	std z+15,R19
	.dbline 151
; 
;    CMD[1] = ((addr & 0xFF000000) >>24 );
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,255
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R24,24
	ldi R25,0
	st -y,R24
	movw R16,R2
	movw R18,R4
	rcall lsr32
	std y+3,R16
	.dbline 152
;    CMD[2] = ((addr & 0x00FF0000) >>16 );
	ldi R20,0
	ldi R21,0
	ldi R22,255
	ldi R23,0
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R2,R4
	clr R4
	clr R5
	std y+4,R2
	.dbline 153
;    CMD[3] = ((addr & 0x0000FF00) >>8 );
	ldi R20,0
	ldi R21,255
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R24,8
	ldi R25,0
	st -y,R24
	movw R16,R2
	movw R18,R4
	rcall lsr32
	std y+5,R16
	.dbline 155
; 
;    return SD_Read_Block(CMD, Buffer, 512);
	ldi R24,512
	ldi R25,2
	std y+1,R25
	std y+0,R24
	ldd R18,y+16
	ldd R19,y+17
	movw R16,R28
	subi R16,254  ; offset = 2
	sbci R17,255
	rcall _SD_Read_Block
	.dbline -2
L53:
	adiw R28,8
	rcall pop_gset2
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l CMD 2 A[6:6]c
	.dbsym l Buffer 16 pc
	.dbsym l addr 12 l
	.dbend
	.area lit(rom, con, rel)
L59:
	.byte 'X,0
	.byte 0,0
	.byte 0,255
	.area text(rom, con, rel)
	.dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
	.dbfunc e SD_write_sector _SD_write_sector fc
;          retry -> R10
;            CMD -> y+0
;            tmp -> R14
;              i -> R12,R13
;         Buffer -> y+20
;           addr -> y+16
	.even
_SD_write_sector::
	rcall push_arg4
	rcall push_gset5
	sbiw R28,6
	.dbline -1
	.dbline 160
;         
; }
; uint8 SD_write_sector(uint32 addr,uint8 *Buffer)
; //****************************************************************************
; {  
	.dbline 164
;    uint8 tmp,retry;
;    uint16 i;
;    //Command 24 is a writing blocks command for MMC/SD-Card.
;    uint8 CMD[] = {0x58,0x00,0x00,0x00,0x00,0xFF}; 
	ldi R24,<L59
	ldi R25,>L59
	movw R30,R28
	ldi R16,6
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 166
;    
;    asm("cli"); //clear all interrupt.
	cli
	.dbline 167
;    addr = addr << 9; //addr = addr * 512
	ldi R24,9
	ldi R25,0
	movw R30,R28
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	st -y,R24
	movw R16,R2
	movw R18,R4
	rcall lsl32
	movw R30,R28
	std z+16,R16
	std z+17,R17
	std z+18,R18
	std z+19,R19
	.dbline 169
; 	
;    CMD[1] = ((addr & 0xFF000000) >>24 );
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,255
	movw R30,R28
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R24,24
	ldi R25,0
	st -y,R24
	movw R16,R2
	movw R18,R4
	rcall lsr32
	std y+1,R16
	.dbline 170
;    CMD[2] = ((addr & 0x00FF0000) >>16 );
	ldi R20,0
	ldi R21,0
	ldi R22,255
	ldi R23,0
	movw R30,R28
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R2,R4
	clr R4
	clr R5
	std y+2,R2
	.dbline 171
;    CMD[3] = ((addr & 0x0000FF00) >>8 );
	ldi R20,0
	ldi R21,255
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R24,8
	ldi R25,0
	st -y,R24
	movw R16,R2
	movw R18,R4
	rcall lsr32
	std y+3,R16
	.dbline 174
; 
;    //Send Command CMD24 to MMC/SD-Card (Write 1 Block/512 Bytes)
;    retry=0;
	clr R10
L63:
	.dbline 176
;    do
;    {  //Retry 100 times to send command.
	.dbline 177
;       tmp = Write_Command_SD(CMD);
	movw R16,R28
	rcall _Write_Command_SD
	mov R14,R16
	.dbline 178
;       if(retry++ == 100) 
	mov R2,R10
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	mov R10,R24
	mov R24,R2
	cpi R24,100
	brne L66
	.dbline 179
;         return(tmp); //send commamd Error!
	rjmp L58
L66:
	.dbline 180
;    }
L64:
	.dbline 181
;    while(tmp != 0); 
	tst R14
	brne L63
	.dbline 184
;    
;    //Before writing,send 100 clock to MMC/SD-Card
;    for (i = 0; i < 100; i++)
	clr R12
	clr R13
	rjmp L71
L68:
	.dbline 185
	rcall _SPI_ReadByte
L69:
	.dbline 184
	movw R24,R12
	adiw R24,1
	movw R12,R24
L71:
	.dbline 184
	movw R24,R12
	cpi R24,100
	ldi R30,0
	cpc R25,R30
	brlo L68
	.dbline 188
;       SPI_ReadByte();
; 	
;    //Send Start Byte to MMC/SD-Card
;    SPI_TransferByte(0xFE);	
	ldi R16,254
	rcall _SPI_TransferByte
	.dbline 191
; 	
;    //Now send real data Bolck (512Bytes) to MMC/SD-Card
;    for (i = 0; i < 512; i++)
	clr R12
	clr R13
	rjmp L75
L72:
	.dbline 192
	ldd R30,y+20
	ldd R31,y+21
	ld R16,Z+
	std y+21,R31
	std y+20,R30
	rcall _SPI_TransferByte
L73:
	.dbline 191
	movw R24,R12
	adiw R24,1
	movw R12,R24
L75:
	.dbline 191
	movw R24,R12
	cpi R24,0
	ldi R30,2
	cpc R25,R30
	brlo L72
	.dbline 195
;       SPI_TransferByte(*Buffer++); //send 512 bytes to Card
; 
;    //CRC-Byte 
;    SPI_TransferByte(0xFF); //Dummy CRC
	ldi R16,255
	rcall _SPI_TransferByte
	.dbline 196
;    SPI_TransferByte(0xFF); //CRC Code
	ldi R16,255
	rcall _SPI_TransferByte
	.dbline 199
;    
;     
;    tmp=SPI_ReadByte();   // read response
	rcall _SPI_ReadByte
	mov R14,R16
	.dbline 200
;    if((tmp & 0x1F) != 0x05) // data block accepted ?
	mov R24,R14
	andi R24,31
	cpi R24,5
	breq L79
	.dbline 201
;    {
	.dbline 202
;      SD_Disable();
	sbi 0x18,4
	.dbline 203
;      return WRITE_BLOCK_ERROR; //Error!
	ldi R16,3
	rjmp L58
L78:
	.dbline 206
	.dbline 206
L79:
	.dbline 206
;    }
;    //Wait till MMC/SD-Card is not busy
;    while (SPI_ReadByte() != 0xFF){};
	rcall _SPI_ReadByte
	cpi R16,255
	brne L78
	.dbline 206
	.dbline 209
; 	
;    //set MMC_Chip_Select to high (MMC/SD-Card Invalid)
;    SD_Disable();
	sbi 0x18,4
	.dbline 210
;    return 0;
	clr R16
	.dbline -2
L58:
	adiw R28,6
	rcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r retry 10 c
	.dbsym l CMD 0 A[6:6]c
	.dbsym r tmp 14 c
	.dbsym r i 12 i
	.dbsym l Buffer 20 pc
	.dbsym l addr 16 l
	.dbend

⌨️ 快捷键说明

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