📄 sd.lis
字号:
.module sd.c
.area text(rom, con, rel)
0000 .dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
0000 .dbfunc e SPI_ReadByte _SPI_ReadByte fc
.even
0000 _SPI_ReadByte::
0000 .dbline -1
0000 .dbline 9
0000 ; #include<iom16v.h>
0000 ; #include<main.h>
0000 ; #include<sd.h>
0000 ;
0000 ;
0000 ; extern uint8 BUFFER[512];
0000 ;
0000 ; uint8 SPI_ReadByte(void)
0000 ; {
0000 .dbline 10
0000 ; SPDR = 0xFF;
0000 8FEF ldi R24,255
0002 8FB9 out 0xf,R24
0004 L2:
0004 .dbline 11
0004 L3:
0004 .dbline 11
0004 ; while (!(SPSR & 0x80));
0004 779B sbis 0xe,7
0006 FECF rjmp L2
0008 .dbline 12
0008 ; return SPDR;
0008 0FB1 in R16,0xf
000A .dbline -2
000A L1:
000A .dbline 0 ; func end
000A 0895 ret
000C .dbend
000C .dbfunc e SPI_TransferByte _SPI_TransferByte fV
000C ; cmp1 -> R16
.even
000C _SPI_TransferByte::
000C .dbline -1
000C .dbline 15
000C ; }
000C ; void SPI_TransferByte(uint8 cmp1)
000C ; {
000C .dbline 16
000C ; SPDR=cmp1;
000C 0FB9 out 0xf,R16
000E L6:
000E .dbline 17
000E L7:
000E .dbline 17
000E ; while(!(SPSR&(1<<SPIF)));
000E 779B sbis 0xe,7
0010 FECF rjmp L6
0012 .dbline -2
0012 L5:
0012 .dbline 0 ; func end
0012 0895 ret
0014 .dbsym r cmp1 16 c
0014 .dbend
0014 .dbfunc e SD_Port_Init _SD_Port_Init fV
.even
0014 _SD_Port_Init::
0014 .dbline -1
0014 .dbline 22
0014 ; }
0014 ;
0014 ; void SD_Port_Init(void)
0014 ; //****************************************************************************
0014 ; {
0014 .dbline 23
0014 ; SD_PORT |= (1<<SD_SS);//(1<<SD_SCK)
0014 C49A sbi 0x18,4
0016 .dbline 24
0016 ; SD_DDR |= (1<<SD_SCK)|(1<<SD_MOSI)|(1<<SD_SS);
0016 87B3 in R24,0x17
0018 806B ori R24,176
001A 87BB out 0x17,R24
001C .dbline 25
001C ; SD_DDR &= ~(1<<SD_MISO);
001C BE98 cbi 0x17,6
001E .dbline 26
001E ; SD_Disable();
001E C49A sbi 0x18,4
0020 .dbline -2
0020 L9:
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbend
.area lit(rom, con, rel)
0000 L11:
0000 4000 .byte 64,0
0002 0000 .byte 0,0
0004 0095 .byte 0,149
.area text(rom, con, rel)
0022 .dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
0022 .dbfunc e SD_Init _SD_Init fc
0022 ; retry -> R20
0022 ; CMD -> y+0
0022 ; temp -> R22
0022 ; i -> R10
.even
0022 _SD_Init::
0022 00D0 rcall push_gset3
0024 2697 sbiw R28,6
0026 .dbline -1
0026 .dbline 33
0026 ; }
0026 ;
0026 ; //****************************************************************************
0026 ; //Routine for Init MMC/SD card(SPI-MODE)
0026 ; uint8 SD_Init(void)
0026 ; //****************************************************************************
0026 ; {
0026 .dbline 37
0026 ; uint8 retry,temp;
0026 ; uint8 i;
0026 ;
0026 ; uint8 CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};
0026 80E0 ldi R24,<L11
0028 90E0 ldi R25,>L11
002A FE01 movw R30,R28
002C 06E0 ldi R16,6
002E 10E0 ldi R17,0
0030 FA93 st -y,R31
0032 EA93 st -y,R30
0034 9A93 st -y,R25
0036 8A93 st -y,R24
0038 00D0 rcall asgncblk
003A .dbline 38
003A ; SD_Port_Init(); //Init SPI port
003A ECDF rcall _SD_Port_Init
003C .dbline 40
003C AA24 clr R10
003E 02C0 rjmp L15
0040 L12:
0040 .dbline 40
0040 0000 nop
0042 L13:
0042 .dbline 40
0042 A394 inc R10
0044 L15:
0044 .dbline 40
0044 ;
0044 ; for (i = 0; i < 200; i++) asm("nop"); //Wait MMC/SD ready...
0044 8A2D mov R24,R10
0046 883C cpi R24,200
0048 D8F3 brlo L12
004A .dbline 43
004A ;
004A ; //Active SPI bus at low speed
004A ; SPCR=0x53; //SPI Master,MSB First
004A 83E5 ldi R24,83
004C 8DB9 out 0xd,R24
004E .dbline 44
004E ; SPSR=0x00; //double speed disable,Fsck=Fosc/128
004E 2224 clr R2
0050 2EB8 out 0xe,R2
0052 .dbline 46
0052 ;
0052 ; for (i = 0; i < 16; i++)
0052 AA24 clr R10
0054 03C0 rjmp L19
0056 L16:
0056 .dbline 47
0056 0FEF ldi R16,255
0058 D9DF rcall _SPI_TransferByte
005A L17:
005A .dbline 46
005A A394 inc R10
005C L19:
005C .dbline 46
005C 8A2D mov R24,R10
005E 8031 cpi R24,16
0060 D0F3 brlo L16
0062 .dbline 50
0062 ; SPI_TransferByte(0xff); //send 74 clock at least!!!
0062 ;
0062 ; //Send Command CMD0 to MMC/SD Card
0062 ; SD_Enable();
0062 C498 cbi 0x18,4
0064 .dbline 51
0064 ; retry = 0;
0064 4427 clr R20
0066 L20:
0066 .dbline 53
0066 ; do
0066 ; { //retry 200 times to send CMD0 command
0066 .dbline 54
0066 ; temp = Write_Command_SD(CMD);
0066 8E01 movw R16,R28
0068 26D0 rcall _Write_Command_SD
006A 602F mov R22,R16
006C .dbline 55
006C ; if (retry++ == 200)
006C 242E mov R2,R20
006E 3324 clr R3
0070 4F5F subi R20,255 ; addi 1
0072 822D mov R24,R2
0074 883C cpi R24,200
0076 11F4 brne L23
0078 .dbline 56
0078 ; return INIT_CMD0_ERROR;//CMD0 Error!
0078 01E0 ldi R16,1
007A 1AC0 rjmp L10
007C L23:
007C .dbline 57
007C ; }
007C L21:
007C .dbline 58
007C ; while (temp != 1);
007C 6130 cpi R22,1
007E 99F7 brne L20
0080 .dbline 61
0080 ;
0080 ; //Send Command CMD1 to MMC/SD-Card
0080 ; CMD[0] = 0x41; //Command 1
0080 81E4 ldi R24,65
0082 8883 std y+0,R24
0084 .dbline 62
0084 ; CMD[5] = 0xFF;
0084 8FEF ldi R24,255
0086 8D83 std y+5,R24
0088 .dbline 63
0088 ; retry = 0;
0088 4427 clr R20
008A L26:
008A .dbline 65
008A ; do
008A ; { //retry 100 times to send CMD1 command
008A .dbline 66
008A ; temp = Write_Command_SD(CMD);
008A 8E01 movw R16,R28
008C 14D0 rcall _Write_Command_SD
008E 602F mov R22,R16
0090 .dbline 67
0090 ; if (retry++ == 100)
0090 242E mov R2,R20
0092 3324 clr R3
0094 4F5F subi R20,255 ; addi 1
0096 822D mov R24,R2
0098 8436 cpi R24,100
009A 11F4 brne L29
009C .dbline 68
009C ; return INIT_CMD1_ERROR;//CMD1 Error!
009C 02E0 ldi R16,2
009E 08C0 rjmp L10
00A0 L29:
00A0 .dbline 69
00A0 ; }
00A0 L27:
00A0 .dbline 70
00A0 ; while (temp != 0);
00A0 6623 tst R22
00A2 99F7 brne L26
00A4 .dbline 73
00A4 ;
00A4 ; //Active High-speed SPI mode(Fsck=Fosc/2)
00A4 ; SPCR = 0x50;
00A4 80E5 ldi R24,80
00A6 8DB9 out 0xd,R24
00A8 .dbline 74
00A8 ; SPSR = 0x00;
00A8 2224 clr R2
00AA 2EB8 out 0xe,R2
00AC .dbline 76
00AC ;
00AC ; SD_Disable(); //set MMC_Chip_Select to high
00AC C49A sbi 0x18,4
00AE .dbline 77
00AE ; return INIT_OK; //All commands have been taken.
00AE 0027 clr R16
00B0 .dbline -2
00B0 L10:
00B0 2696 adiw R28,6
00B2 00D0 rcall pop_gset3
00B4 .dbline 0 ; func end
00B4 0895 ret
00B6 .dbsym r retry 20 c
00B6 .dbsym l CMD 0 A[6:6]c
00B6 .dbsym r temp 22 c
00B6 .dbsym r i 10 c
00B6 .dbend
00B6 .dbfunc e Write_Command_SD _Write_Command_SD fc
00B6 ; retry -> R20
00B6 ; i -> R22
00B6 ; tmp -> R10
00B6 ; cmd -> R12,R13
.even
00B6 _Write_Command_SD::
00B6 00D0 rcall push_gset4
00B8 6801 movw R12,R16
00BA .dbline -1
00BA .dbline 85
00BA ; }
00BA ;
00BA ; //****************************************************************************
00BA ; //Send a Command to MMC/SD-Card
00BA ; //Return: the second byte of response register of MMC/SD-Card
00BA ; uint8 Write_Command_SD(uint8 *cmd)
00BA ; //****************************************************************************
00BA ; {
00BA .dbline 87
00BA ; uint8 tmp,i;
00BA ; uint8 retry=0;
00BA 4427 clr R20
00BC .dbline 88
00BC ; SD_Disable();
00BC C49A sbi 0x18,4
00BE .dbline 89
00BE ; SPI_TransferByte(0xFF);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -