📄 sdmmc.s
字号:
; Com_putstring(tmp,4,&RTbuf_UART0);
; */
; #if !(HW_SPI_Mode)
; SPCR=spimode;
out 0xd,R22
.dbline 233
; SPSR=spispeeddub;
out 0xe,R20
.dbline 235
; #endif
; MMC_Disable();
sbi 0x18,4
.dbline 235
.dbline -2
L29:
adiw R28,20
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym l tmp 16 A[4:4]c
.dbsym r spispeeddub 20 c
.dbsym r spimode 22 c
.dbsym l buffer 0 A[16:16]c
.dbsym r vinf 10 pS[MMC_VOLUME_INFO]
.dbend
.dbfunc e Write_Command_MMC _Write_Command_MMC fc
; i -> R20
; retry -> R22
; tmp -> R10
; CMD -> R12,R13
.even
_Write_Command_MMC::
xcall push_gset4
movw R12,R16
.dbline -1
.dbline 243
; }
;
; //****************************************************************************
; //Send a Command to MMC/SD-Card
; //Return: the second byte of response register of MMC/SD-Card
; uint8 Write_Command_MMC(uint8 *CMD)
; //****************************************************************************
; {
.dbline 245
; uint8 tmp;
; uint8 retry=0;
clr R22
.dbline 249
; uint8 i;
;
; //set MMC_Chip_Select to high (MMC/SD-Card disable)
; MMC_Disable();
sbi 0x18,4
.dbline 249
.dbline 251
; //send 8 Clock Impulse
; Write_Byte_MMC(0xFF);
ldi R16,255
xcall _Write_Byte_MMC
.dbline 253
; //set MMC_Chip_Select to low (MMC/SD-Card active)
; MMC_Enable();
cbi 0x18,4
.dbline 253
.dbline 256
;
; //send 6 Byte Command to MMC/SD-Card
; for (i=0;i<0x06;i++)
clr R20
xjmp L44
L41:
.dbline 257
.dbline 258
movw R30,R12
ld R16,Z+
movw R12,R30
xcall _Write_Byte_MMC
.dbline 259
L42:
.dbline 256
inc R20
L44:
.dbline 256
cpi R20,6
brlo L41
.dbline 262
; {
; Write_Byte_MMC(*CMD++);
; }
;
; //get 16 bit response
; Read_Byte_MMC(); //read the first byte,ignore it.
xcall _Read_Byte_MMC
L45:
.dbline 264
; do
; { //Only last 8 bit is used here.Read it out.
.dbline 265
; tmp = Read_Byte_MMC();
xcall _Read_Byte_MMC
mov R10,R16
.dbline 266
; retry++;
inc R22
.dbline 267
; }
L46:
.dbline 268
; while((tmp==0xff)&&(retry<100));
mov R24,R10
cpi R24,255
brne L48
cpi R22,100
brlo L45
L48:
.dbline 269
; return(tmp);
mov R16,R10
.dbline -2
L40:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r retry 22 c
.dbsym r tmp 10 c
.dbsym r CMD 12 pc
.dbend
.dbfunc e Read_Byte_MMC _Read_Byte_MMC fc
; i -> R22
; temp -> R20
.even
_Read_Byte_MMC::
xcall push_gset2
.dbline -1
.dbline 276
; }
;
; //****************************************************************************
; //Routine for reading a byte from MMC/SD-Card
; uint8 Read_Byte_MMC(void)
; //****************************************************************************
; {
.dbline 277
; uint8 temp=0;
clr R20
.dbline 279
; uint8 i;
; MMC_PORT&=~(1<<SPI_Busy);
cbi 0x18,0
.dbline 281
; //Software SPI
; if(Init_Flag)
lds R2,_Init_Flag
tst R2
breq L50
.dbline 282
; {
.dbline 283
; for (i=0; i<8; i++) //MSB First
clr R22
xjmp L55
L52:
.dbline 284
; {
.dbline 285
; MMC_PORT&=~(1<<SPI_CLK); //Clock Impuls (Low)
cbi 0x18,7
.dbline 286
; if(Init_Flag)
lds R2,_Init_Flag
tst R2
breq L56
.dbline 287
; delay_us(200);
ldi R16,200
xcall _delay_us
L56:
.dbline 288
; temp = (temp << 1) + ((MMC_PIN&(1<<SPI_MISO))>>SPI_MISO); //read mmc data out pin
in R24,0x16
andi R24,64
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
lsr R24
mov R2,R20
lsl R2
add R2,R24
mov R20,R2
.dbline 289
; MMC_PORT|=(1<<SPI_CLK); //set Clock Impuls High
sbi 0x18,7
.dbline 290
; if(Init_Flag)
lds R2,_Init_Flag
tst R2
breq L58
.dbline 291
; delay_us(200);
ldi R16,200
xcall _delay_us
L58:
.dbline 292
L53:
.dbline 283
inc R22
L55:
.dbline 283
cpi R22,8
brlo L52
.dbline 294
; }
;
; }
xjmp L51
L50:
.dbline 296
; else
; {
.dbline 298
; #if !(HW_SPI_Mode)
; SPDR=0xFF;
ldi R24,255
out 0xf,R24
L60:
.dbline 299
.dbline 299
L61:
.dbline 299
; while(!(SPSR & 0x80)){};
sbis 0xe,7
rjmp L60
.dbline 299
.dbline 300
; temp=SPDR;
in R20,0xf
.dbline 304
; #else
; Spi_SendReceive(&temp,1,1);
; #endif
; }
L51:
.dbline 305
; MMC_PORT|=(1<<SPI_Busy);
sbi 0x18,0
.dbline 306
; return (temp);
mov R16,R20
.dbline -2
L49:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 22 c
.dbsym r temp 20 c
.dbend
.dbfunc e Write_Byte_MMC _Write_Byte_MMC fV
; i -> R20
; value -> R22
.even
_Write_Byte_MMC::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 313
; }
;
; //****************************************************************************
; //Routine for sending a byte to MMC/SD-Card
; void Write_Byte_MMC(uint8 value)
; //****************************************************************************
; {
.dbline 315
; uint8 i;
; MMC_PORT&=~(1<<SPI_Busy);
cbi 0x18,0
.dbline 317
; //Software SPI
; if(Init_Flag){
lds R2,_Init_Flag
tst R2
breq L64
.dbline 317
.dbline 318
; for (i=0; i<8; i++)
clr R20
xjmp L69
L66:
.dbline 319
; { //write a byte
.dbline 320
; if (((value >> (7-i)) & 0x01)==0x01)
ldi R17,7
sub R17,R20
mov R16,R22
xcall lsr8
mov R24,R16
andi R24,1
cpi R24,1
brne L70
.dbline 321
; MMC_PORT|=(1<<SPI_MOSI); //Send bit by bit(MSB First)
sbi 0x18,5
xjmp L71
L70:
.dbline 323
; else
; MMC_PORT&=~(1<<SPI_MOSI);
cbi 0x18,5
L71:
.dbline 324
; MMC_PORT&=~(1<<SPI_CLK); //set Clock Impuls low
cbi 0x18,7
.dbline 325
; if(Init_Flag)
lds R2,_Init_Flag
tst R2
breq L72
.dbline 326
; delay_us(200);
ldi R16,200
xcall _delay_us
L72:
.dbline 327
; MMC_PORT|=(1<<SPI_CLK); //set Clock Impuls High
sbi 0x18,7
.dbline 328
; if(Init_Flag)
lds R2,_Init_Flag
tst R2
breq L74
.dbline 329
; delay_us(200);
ldi R16,200
xcall _delay_us
L74:
.dbline 330
L67:
.dbline 318
inc R20
L69:
.dbline 318
cpi R20,8
brlo L66
.dbline 331
; }//write a byte
; MMC_PORT|=(1<<SPI_MOSI); //set Output High
sbi 0x18,5
.dbline 333
;
; }
xjmp L65
L64:
.dbline 335
; else
; {
.dbline 337
; #if !(HW_SPI_Mode)
; SPDR=value;
out 0xf,R22
L76:
.dbline 338
.dbline 338
L77:
.dbline 338
; while(!(SPSR & 0x80)){};
sbis 0xe,7
rjmp L76
.dbline 338
.dbline 342
; #else
; Spi_SendReceive(&value,1,0);
; #endif
; }
L65:
.dbline 343
; MMC_PORT|=(1<<SPI_Busy);
sbi 0x18,0
.dbline -2
L63:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r value 22 c
.dbend
.area lit(rom, con, rel)
L80:
.byte 'X,0
.byte 0,0
.byte 0,255
.area text(rom, con, rel)
.dbfile D:\桌面\mp3\sdmmc\sdmmc.c
.dbfunc e MMC_Write_Sector _MMC_Write_Sector fc
; spispeeddub -> y+7
; spimode -> y+6
; CMD -> y+0
; retry -> R14
; tmp -> R12
; i -> R10,R11
; Buffer -> y+22
; addr -> y+18
.even
_MMC_Write_Sector::
xcall push_arg4
xcall push_gset5
sbiw R28,8
.dbline -1
.dbline 351
; }
;
; //****************************************************************************
; //Routine for writing a Block(512Byte) to MMC/SD-Card
; //Return 0 if sector writing is completed.
; uint8 MMC_Write_Sector(uint32 addr,uint8 *Buffer)
; //****************************************************************************
; {
.dbline 355
; 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,<L80
ldi R25,>L80
movw R30,R28
ldi R16,6
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 358
; #if !(HW_SPI_Mode)
; uint8 spimode,spispeeddub;
; spimode=SPCR;
in R2,0xd
std y+6,R2
.dbline 359
; spispeeddub=SPSR;
in R2,0xe
std y+7,R2
.dbline 360
; SPCR&=~(1<<SPIE);
cbi 0xd,7
.dbline 363
; #endif
; // CLI(); //clear all interrupt.
; addr = addr << 9; //addr = addr * 512
ldi R24,9
ldi R25,0
movw R30,R28
ldd R2,z+18
ldd R3,z+19
ldd R4,z+20
ldd R5,z+21
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R30,R28
std z+18,R16
std z+19,R17
std z+20,R18
std z+21,R19
.dbline 365
;
; CMD[1] = ((addr & 0xFF000000) >>24 );
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,255
movw R30,R28
ldd R2,z+18
ldd R3,z+19
ldd R4,z+20
ldd R5,z+21
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
xcall lsr32
std y+1,R16
.dbline 366
; CMD[2] = ((addr & 0x00FF0000) >>16 );
ldi R20,0
ldi R21,0
ldi R22,255
ldi R23,0
movw R30,R28
ldd R2,z+18
ldd R3,z+19
ldd R4,z+20
ldd R5,z+21
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R2,R4
clr R4
clr R5
std y+2,R2
.dbline 367
; CMD[3] = ((addr & 0x0000FF00) >>8 );
ldi R20,0
ldi R21,255
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+18
ldd R3,z+19
ldd R4,z+20
ldd R5,z+21
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
xcall lsr32
std y+3,R16
.dbline 370
;
; //Send Command CMD24 to MMC/SD-Card (Write 1 Block/512 Bytes)
; retry=0;
clr R14
L84:
.dbline 372
; do
; { //Retry 100 times to send command.
.dbline 373
; tmp=Write_Command_MMC(CMD);
movw R16,R28
xcall _Write_Command_MMC
mov R12,R16
.dbline 374
; retry++;
inc R14
.dbline 375
; if(retry==100)
mov R24,R14
cpi R24,100
brne L87
.dbline 376
; {
.dbline 378
; #if !(HW_SPI_Mode)
; SPCR=spimode;
ldd R0,y+6
out 0xd,R0
.dbline 379
; SPSR=spispeeddub;
ldd R0,y+7
out 0xe,R0
.dbline 381
; #endif
; return(FALSE); //send commamd Error!
clr R16
xjmp L79
L87:
.dbline 383
; }
; }
L85:
.dbline 384
; while(tmp!=0);
tst R12
brne L84
.dbline 387
;
; //Before writing,send 100 clock to MMC/SD-Card
; for (i=0;i<100;i++)
clr R10
clr R11
xjmp L92
L89:
.dbline 388
.dbline 389
xcall _Read_Byte_MMC
.dbline 390
L90:
.dbline 387
movw R24,R10
adiw R24,1
movw R10,R24
L92:
.dbline 387
movw R24,R10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -