📄 sd.lis
字号:
.module sd.c
.area text(rom, con, rel)
0000 .dbfile ..\..\..\..\..\DOCUME~1\浪仔\桌面\教学实验板\M16_VS1003_test\sd.c
0000 .dbfile C:\DOCUME~1\浪仔\桌面\教学实验板\M16_VS1003_test\sd.c
0000 .dbfunc e SD_Port_Init _SD_Port_Init fV
.even
0000 _SD_Port_Init::
0000 .dbline -1
0000 .dbline 19
0000 ;
0000 ;
0000 ; //---------------------------- SD卡驱动程序 ----------------------------
0000 ; //
0000 ; //简化版SD卡驱动程序
0000 ; //整理日期:2009.7.8
0000 ; //
0000 ; //------------------------------------------------------------------------
0000 ;
0000 ; #include"sd.h"
0000 ;
0000 ;
0000 ; //---------------------------------
0000 ; //
0000 ; // SD卡接口初始化函数
0000 ; //
0000 ; //---------------------------------
0000 ; void SD_Port_Init(void)
0000 ; {
0000 .dbline 20
0000 ; SD_CS_DDR |= 1<<SD_CS_BIT;
0000 D19A sbi 0x1a,1
0002 .dbline 21
0002 ; SD_CS_PORT |= 1<<SD_CS_BIT;
0002 D99A sbi 0x1b,1
0004 .dbline -2
0004 L1:
0004 .dbline 0 ; func end
0004 0895 ret
0006 .dbend
0006 .dbfunc e SD_SendCommand _SD_SendCommand fc
0006 ; retry -> R22
0006 ; r1 -> R20
0006 ; arg -> y+6
0006 ; cmd -> R10
.even
0006 _SD_SendCommand::
0006 3A93 st -y,r19
0008 2A93 st -y,r18
000A 0E940000 xcall push_xgsetF00C
000E A02E mov R10,R16
0010 .dbline -1
0010 .dbline 34
0010 ; }
0010 ;
0010 ;
0010 ;
0010 ; //---------------------------------
0010 ; //
0010 ; // SD卡写寄存器函数
0010 ; // arg:命令
0010 ; // cmd:命令号
0010 ; //
0010 ; //---------------------------------
0010 ; uint8 SD_SendCommand(uint8 cmd, uint32 arg)
0010 ; {
0010 .dbline 35
0010 ; uint8 r1=1;
0010 41E0 ldi R20,1
0012 .dbline 36
0012 ; uint8 retry=0;
0012 6627 clr R22
0014 .dbline 39
0014 ;
0014 ;
0014 ; SPI_SrByte(0xff);
0014 0FEF ldi R16,255
0016 0E940000 xcall _SPI_SrByte
001A .dbline 40
001A ; SPI_CS_Assert;
001A D998 cbi 0x1b,1
001C L3:
001C .dbline 41
001C ; while(r1--);
001C L4:
001C .dbline 41
001C 242E mov R2,R20
001E 3324 clr R3
0020 4150 subi R20,1
0022 2220 tst R2
0024 D9F7 brne L3
0026 X0:
0026 .dbline 43
0026 ;
0026 ; SPI_SrByte((cmd & 0x3f) | 0x40); /* send command */
0026 0A2D mov R16,R10
0028 0F73 andi R16,63
002A 0064 ori R16,64
002C 0E940000 xcall _SPI_SrByte
0030 .dbline 45
0030 ;
0030 ; SPI_SrByte(arg>>24);
0030 88E1 ldi R24,24
0032 90E0 ldi R25,0
0034 0E81 ldd R16,y+6
0036 1F81 ldd R17,y+7
0038 2885 ldd R18,y+8
003A 3985 ldd R19,y+9
003C 8A93 st -y,R24
003E 0E940000 xcall lsr32
0042 0E940000 xcall _SPI_SrByte
0046 .dbline 46
0046 ; SPI_SrByte(arg>>16);
0046 2E80 ldd R2,y+6
0048 3F80 ldd R3,y+7
004A 4884 ldd R4,y+8
004C 5984 ldd R5,y+9
004E 1201 movw R2,R4
0050 4424 clr R4
0052 5524 clr R5
0054 022D mov R16,R2
0056 0E940000 xcall _SPI_SrByte
005A .dbline 47
005A ; SPI_SrByte(arg>>8);
005A 88E0 ldi R24,8
005C 90E0 ldi R25,0
005E 0E81 ldd R16,y+6
0060 1F81 ldd R17,y+7
0062 2885 ldd R18,y+8
0064 3985 ldd R19,y+9
0066 8A93 st -y,R24
0068 0E940000 xcall lsr32
006C 0E940000 xcall _SPI_SrByte
0070 .dbline 48
0070 ; SPI_SrByte(arg);
0070 0E81 ldd R16,y+6
0072 0E940000 xcall _SPI_SrByte
0076 .dbline 50
0076 ;
0076 ; SPI_SrByte(0x95);
0076 05E9 ldi R16,149
0078 0E940000 xcall _SPI_SrByte
007C .dbline 52
007C ;
007C ; SPI_SrByte(0xff);
007C 0FEF ldi R16,255
007E 0E940000 xcall _SPI_SrByte
0082 07C0 xjmp L7
0084 L6:
0084 .dbline 54
0084 ; while((r1 = SPI_SrByte(0xff)) == 0xff) /* wait response */
0084 ; if(retry++ > 0xfe) break; /* time out error */
0084 262E mov R2,R22
0086 3324 clr R3
0088 6F5F subi R22,255 ; addi 1
008A 8EEF ldi R24,254
008C 8215 cp R24,R2
008E 08F4 brsh L9
0090 X1:
0090 .dbline 54
0090 07C0 xjmp L8
0092 L9:
0092 L7:
0092 .dbline 53
0092 0FEF ldi R16,255
0094 0E940000 xcall _SPI_SrByte
0098 A02E mov R10,R16
009A 4A2D mov R20,R10
009C 0F3F cpi R16,255
009E 91F3 breq L6
00A0 X2:
00A0 L8:
00A0 .dbline 56
00A0 ;
00A0 ; SPI_CS_Deassert;
00A0 D99A sbi 0x1b,1
00A2 .dbline 57
00A2 ; SPI_SrByte(0xff); // extra 8 CLK
00A2 0FEF ldi R16,255
00A4 0E940000 xcall _SPI_SrByte
00A8 .dbline 59
00A8 ;
00A8 ; return r1; /* return state */
00A8 042F mov R16,R20
00AA .dbline -2
00AA L2:
00AA .dbline 0 ; func end
00AA 0E940000 xcall pop_xgsetF00C
00AE 2296 adiw R28,2
00B0 0895 ret
00B2 .dbsym r retry 22 c
00B2 .dbsym r r1 20 c
00B2 .dbsym l arg 6 l
00B2 .dbsym r cmd 10 c
00B2 .dbend
00B2 .dbfunc e SD_Init _SD_Init fc
00B2 ; retry -> R10
00B2 ; r1 -> R20
00B2 ; i -> R22
.even
00B2 _SD_Init::
00B2 0E940000 xcall push_xgsetF00C
00B6 2297 sbiw R28,2
00B8 .dbline -1
00B8 .dbline 69
00B8 ; }
00B8 ;
00B8 ;
00B8 ; //---------------------------------
00B8 ; //
00B8 ; // SD卡初始化函数
00B8 ; //
00B8 ; //---------------------------------
00B8 ; uint8 SD_Init(void)
00B8 ; {
00B8 .dbline 72
00B8 ;
00B8 ; uint8 i;
00B8 ; uint8 retry = 0;
00B8 AA24 clr R10
00BA .dbline 73
00BA ; uint8 r1 = 0;
00BA 4427 clr R20
00BC .dbline 75
00BC ;
00BC ; SD_Port_Init();
00BC A1DF xcall _SD_Port_Init
00BE .dbline 77
00BE ;
00BE ; SPI_CS_Assert;
00BE D998 cbi 0x1b,1
00C0 .dbline 78
00C0 ; delay_ms(1);
00C0 01E0 ldi R16,1
00C2 10E0 ldi R17,0
00C4 20E0 ldi R18,0
00C6 30E0 ldi R19,0
00C8 0E940000 xcall _delay_ms
00CC .dbline 79
00CC ; SPI_CS_Deassert;
00CC D99A sbi 0x1b,1
00CE .dbline 80
00CE ; delay_ms(1);
00CE 01E0 ldi R16,1
00D0 10E0 ldi R17,0
00D2 20E0 ldi R18,0
00D4 30E0 ldi R19,0
00D6 0E940000 xcall _delay_ms
00DA .dbline 83
00DA ;
00DA ;
00DA ; SPI_Low();
00DA 0E940000 xcall _SPI_Low
00DE L12:
00DE .dbline 86
00DE ;
00DE ; do
00DE ; {
00DE .dbline 87
00DE ; for(i=0;i<10;i++) SPI_SrByte(0xff);
00DE 6627 clr R22
00E0 04C0 xjmp L18
00E2 L15:
00E2 .dbline 87
00E2 0FEF ldi R16,255
00E4 0E940000 xcall _SPI_SrByte
00E8 L16:
00E8 .dbline 87
00E8 6395 inc R22
00EA L18:
00EA .dbline 87
00EA 6A30 cpi R22,10
00EC D0F3 brlo L15
00EE X3:
00EE .dbline 88
00EE ; r1 = SD_SendCommand(0, 0);//发idle命令 //send idle command
00EE 80E0 ldi R24,0
00F0 90E0 ldi R25,0
00F2 A0E0 ldi R26,0
00F4 B0E0 ldi R27,0
00F6 A883 std y+0,R26
00F8 B983 std y+1,R27
00FA 9C01 movw R18,R24
00FC 0027 clr R16
00FE 83DF xcall _SD_SendCommand
0100 402F mov R20,R16
0102 .dbline 89
0102 ; retry++;
0102 A394 inc R10
0104 .dbline 90
0104 ; if(retry>0xfe) return 1;//超时退出 //time out
0104 8EEF ldi R24,254
0106 8A15 cp R24,R10
0108 10F4 brsh L19
010A X4:
010A .dbline 90
010A 01E0 ldi R16,1
010C 2CC0 xjmp L11
010E L19:
010E .dbline 91
010E ; } while(r1 != 0x01);
010E L13:
010E .dbline 91
010E 4130 cpi R20,1
0110 31F7 brne L12
0112 X5:
0112 .dbline 94
0112 ;
0112 ;
0112 ; retry = 0;
0112 AA24 clr R10
0114 L21:
0114 .dbline 96
0114 ; do
0114 ; {
0114 .dbline 97
0114 ; r1 = SD_SendCommand(1, 0);//发active命令 //send active command
0114 80E0 ldi R24,0
0116 90E0 ldi R25,0
0118 A0E0 ldi R26,0
011A B0E0 ldi R27,0
011C A883 std y+0,R26
011E B983 std y+1,R27
0120 9C01 movw R18,R24
0122 01E0 ldi R16,1
0124 70DF xcall _SD_SendCommand
0126 402F mov R20,R16
0128 .dbline 98
0128 ; retry++;
0128 A394 inc R10
012A .dbline 99
012A ; if(retry>0xfe) return 1;//超时退出 //time out
012A 8EEF ldi R24,254
012C 8A15 cp R24,R10
012E 10F4 brsh L24
0130 X6:
0130 .dbline 99
0130 01E0 ldi R16,1
0132 19C0 xjmp L11
0134 L24:
0134 .dbline 100
0134 ; } while(r1);
0134 L22:
0134 .dbline 100
0134 4423 tst R20
0136 71F7 brne L21
0138 X7:
0138 .dbline 102
0138 ;
0138 ; SPI_High(); /* Use High Speed SPI*/
0138 0E940000 xcall _SPI_High
013C .dbline 104
013C ;
013C ; r1 = SD_SendCommand(59, 0);//关crc //disable CRC
013C 80E0 ldi R24,0
013E 90E0 ldi R25,0
0140 A0E0 ldi R26,0
0142 B0E0 ldi R27,0
0144 A883 std y+0,R26
0146 B983 std y+1,R27
0148 9C01 movw R18,R24
014A 0BE3 ldi R16,59
014C 5CDF xcall _SD_SendCommand
014E .dbline 106
014E ;
014E ; r1 = SD_SendCommand(16, 512);//设扇区大小512 //set sector size to 512
014E 80E0 ldi R24,0
0150 92E0 ldi R25,2
0152 A0E0 ldi R26,0
0154 B0E0 ldi R27,0
0156 A883 std y+0,R26
0158 B983 std y+1,R27
015A 9C01 movw R18,R24
015C 00E1 ldi R16,16
015E 53DF xcall _SD_SendCommand
0160 A02E mov R10,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -