📄 mmc.lis
字号:
.module mmc.c
.area text(rom, con, rel)
0000 .dbfile D:\学习\AVRpro\Mega16程序\TestLCD\mmc.c
0000 .dbfunc e SPI_Low _SPI_Low fV
.even
0000 _SPI_Low::
0000 .dbline -1
0000 .dbline 7
0000 ; # include "iom16v.h"
0000 ; # include "macros.h"
0000 ; #include "mmc.h"
0000 ;
0000 ; //低速模式 //spi low speed
0000 ; void SPI_Low(void)
0000 ; {
0000 .dbline 8
0000 ; SPCR = BIT(SPE)|BIT(MSTR)|BIT(SPR1)|BIT(SPR0); //SCK:XTAL-CLOCK/128
0000 83E5 ldi R24,83
0002 8DB9 out 0xd,R24
0004 .dbline 9
0004 ; SPSR &= ~BIT(SPI2X); //不用倍速
0004 7098 cbi 0xe,0
0006 .dbline -2
0006 L1:
0006 .dbline 0 ; func end
0006 0895 ret
0008 .dbend
0008 .dbfunc e SPI_High _SPI_High fV
.even
0008 _SPI_High::
0008 .dbline -1
0008 .dbline 14
0008 ; }
0008 ;
0008 ; //高速模式 //spi full speed
0008 ; void SPI_High(void)
0008 ; {
0008 .dbline 15
0008 ; SPCR = BIT(SPE)|BIT(MSTR); //SCK: XTAL-CLOCK/2,采用倍速
0008 80E5 ldi R24,80
000A 8DB9 out 0xd,R24
000C .dbline 16
000C ; SPSR |= BIT(SPI2X);
000C 709A sbi 0xe,0
000E .dbline -2
000E L2:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbend
0010 .dbfunc e SPI_Init _SPI_Init fV
.even
0010 _SPI_Init::
0010 .dbline -1
0010 .dbline 21
0010 ; }
0010 ;
0010 ; //端口初始化,模式初始化 //port initialize
0010 ; void SPI_Init(void)
0010 ; {
0010 .dbline 22
0010 ; DDR_INI();
0010 87B3 in R24,0x17
0012 806B ori R24,176
0014 87BB out 0x17,R24
0016 .dbline 23
0016 ; SPI_High();
0016 F8DF xcall _SPI_High
0018 .dbline -2
0018 L3:
0018 .dbline 0 ; func end
0018 0895 ret
001A .dbend
001A .dbfunc e SPI_WriteByte _SPI_WriteByte fc
001A ; val -> R16
.even
001A _SPI_WriteByte::
001A .dbline -1
001A .dbline 28
001A ; }
001A ;
001A ; //写[读]一个字节 //read [and write] one byte
001A ; uint8 SPI_WriteByte(register uint8 val)
001A ; {
001A .dbline 29
001A ; SPDR = val;
001A 0FB9 out 0xf,R16
001C L5:
001C .dbline 30
001C ; while(!(SPSR & BIT(SPIF))); //等待SPI发送完数据
001C L6:
001C .dbline 30
001C 779B sbis 0xe,7
001E FECF rjmp L5
0020 X0:
0020 .dbline 31
0020 ; return SPDR;
0020 0FB1 in R16,0xf
0022 .dbline -2
0022 L4:
0022 .dbline 0 ; func end
0022 0895 ret
0024 .dbsym r val 16 c
0024 .dbend
0024 .dbfunc e MMC_SD_Detect _MMC_SD_Detect fc
.even
0024 _MMC_SD_Detect::
0024 .dbline -1
0024 .dbline 37
0024 ; }
0024 ;
0024 ;
0024 ; //检测SD卡是否插入,已插入,返回1,否则,返回0
0024 ; uint8 MMC_SD_Detect(void)
0024 ; {
0024 .dbline 38
0024 ; PORTA |=BIT(MMC_SD_INSDETC); //PORTA0为高电平
0024 DF9A sbi 0x1b,7
0026 .dbline 39
0026 ; DDRA&=(~BIT(MMC_SD_INSDETC)); //PA0设置为输入
0026 D798 cbi 0x1a,7
0028 .dbline 41
0028 ; //;;//读取MMC_SD_INSDETC,为低电平,表示已经插入SD卡
0028 ; ;
0028 .dbline 42
0028 ; if((PINA&=BIT(MMC_SD_INSDETC))==0)
0028 89B3 in R24,0x19
002A 8078 andi R24,128
002C 89BB out 0x19,R24
002E 8823 tst R24
0030 11F4 brne L9
0032 X1:
0032 .dbline 43
0032 ; return 1;
0032 01E0 ldi R16,1
0034 01C0 xjmp L8
0036 L9:
0036 .dbline 45
0036 ; else
0036 ; return 0;
0036 0027 clr R16
0038 .dbline -2
0038 L8:
0038 .dbline 0 ; func end
0038 0895 ret
003A .dbend
003A .dbfunc e MMC_SD_Init _MMC_SD_Init fV
.even
003A _MMC_SD_Init::
003A .dbline -1
003A .dbline 50
003A ; }
003A ;
003A ; //sd卡初始化 //sd card initialize
003A ; void MMC_SD_Init(void)
003A ; {
003A .dbline 51
003A ; SPI_Init();
003A EADF xcall _SPI_Init
003C .dbline 52
003C ; SPI_CS_Deassert();;
003C C49A sbi 0x18,4
003E .dbline 52
003E .dbline -2
003E L11:
003E .dbline 0 ; func end
003E 0895 ret
0040 .dbend
0040 .dbfunc e MMC_SD_SendCommand _MMC_SD_SendCommand fc
0040 ; r1 -> R10
0040 ; retry -> R20
0040 ; arg -> y+6
0040 ; cmd -> R22
.even
0040 _MMC_SD_SendCommand::
0040 3A93 st -y,r19
0042 2A93 st -y,r18
0044 0E940000 xcall push_xgsetF00C
0048 602F mov R22,R16
004A .dbline -1
004A .dbline 57
004A ; }
004A ;
004A ; //sd卡写命令 //sd send command
004A ; uint8 MMC_SD_SendCommand(uint8 cmd, uint32 arg)
004A ; {
004A .dbline 59
004A ; uint8 r1;
004A ; register uint8 retry=0;
004A 4427 clr R20
004C .dbline 61
004C ;
004C ; SPI_WriteByte(0xff);
004C 0FEF ldi R16,255
004E E5DF xcall _SPI_WriteByte
0050 .dbline 62
0050 ; SPI_CS_Assert();
0050 C498 cbi 0x18,4
0052 .dbline 64
0052 ;
0052 ; SPI_WriteByte(cmd | 0x40);//分别写入命令 //send command
0052 062F mov R16,R22
0054 0064 ori R16,64
0056 E1DF xcall _SPI_WriteByte
0058 .dbline 65
0058 ; SPI_WriteByte(arg>>24);
0058 88E1 ldi R24,24
005A 90E0 ldi R25,0
005C 0E81 ldd R16,y+6
005E 1F81 ldd R17,y+7
0060 2885 ldd R18,y+8
0062 3985 ldd R19,y+9
0064 8A93 st -y,R24
0066 0E940000 xcall lsr32
006A D7DF xcall _SPI_WriteByte
006C .dbline 66
006C ; SPI_WriteByte(arg>>16);
006C 2E80 ldd R2,y+6
006E 3F80 ldd R3,y+7
0070 4884 ldd R4,y+8
0072 5984 ldd R5,y+9
0074 1201 movw R2,R4
0076 4424 clr R4
0078 5524 clr R5
007A 022D mov R16,R2
007C CEDF xcall _SPI_WriteByte
007E .dbline 67
007E ; SPI_WriteByte(arg>>8);
007E 88E0 ldi R24,8
0080 90E0 ldi R25,0
0082 0E81 ldd R16,y+6
0084 1F81 ldd R17,y+7
0086 2885 ldd R18,y+8
0088 3985 ldd R19,y+9
008A 8A93 st -y,R24
008C 0E940000 xcall lsr32
0090 C4DF xcall _SPI_WriteByte
0092 .dbline 68
0092 ; SPI_WriteByte(arg);
0092 0E81 ldd R16,y+6
0094 C2DF xcall _SPI_WriteByte
0096 .dbline 69
0096 ; SPI_WriteByte(0x95);
0096 05E9 ldi R16,149
0098 C0DF xcall _SPI_WriteByte
009A 07C0 xjmp L14
009C L13:
009C .dbline 72
009C ;
009C ; while((r1 = SPI_WriteByte(0xff)) == 0xff)//等待响应, //wait response
009C ; if(retry++ > 20) break;//超时退出 //time out error
009C 242E mov R2,R20
009E 3324 clr R3
00A0 4F5F subi R20,255 ; addi 1
00A2 84E1 ldi R24,20
00A4 8215 cp R24,R2
00A6 08F4 brsh L16
00A8 X2:
00A8 .dbline 72
00A8 05C0 xjmp L15
00AA L16:
00AA L14:
00AA .dbline 71
00AA 0FEF ldi R16,255
00AC B6DF xcall _SPI_WriteByte
00AE A02E mov R10,R16
00B0 0F3F cpi R16,255
00B2 A1F3 breq L13
00B4 X3:
00B4 L15:
00B4 .dbline 74
00B4 ;
00B4 ; SPI_CS_Deassert();
00B4 C49A sbi 0x18,4
00B6 .dbline 76
00B6 ;
00B6 ; return r1;//返回状态值 //return state
00B6 0A2D mov R16,R10
00B8 .dbline -2
00B8 L12:
00B8 .dbline 0 ; func end
00B8 0E940000 xcall pop_xgsetF00C
00BC 2296 adiw R28,2
00BE 0895 ret
00C0 .dbsym r r1 10 c
00C0 .dbsym r retry 20 c
00C0 .dbsym l arg 6 l
00C0 .dbsym r cmd 22 c
00C0 .dbend
00C0 .dbfunc e MMC_SD_Reset _MMC_SD_Reset fc
00C0 ; r1 -> R20
00C0 ; i -> R22
00C0 ; retry -> R10
.even
00C0 _MMC_SD_Reset::
00C0 0E940000 xcall push_xgsetF00C
00C4 2297 sbiw R28,2
00C6 .dbline -1
00C6 .dbline 81
00C6 ; }
00C6 ;
00C6 ; //sd卡复位,正常时,返回0
00C6 ; uint8 MMC_SD_Reset(void)
00C6 ; {
00C6 .dbline 83
00C6 ; uint8 i;
00C6 ; register uint8 retry=0;
00C6 AA24 clr R10
00C8 .dbline 84
00C8 ; uint8 r1=0;
00C8 4427 clr R20
00CA .dbline 85
00CA ; SPI_Low();
00CA 9ADF xcall _SPI_Low
00CC L19:
00CC .dbline 87
00CC ; do
00CC ; {
00CC .dbline 88
00CC ; for(i=0;i<10;i++) SPI_WriteByte(0xff);
00CC 6627 clr R22
00CE 03C0 xjmp L25
00D0 L22:
00D0 .dbline 88
00D0 0FEF ldi R16,255
00D2 A3DF xcall _SPI_WriteByte
00D4 L23:
00D4 .dbline 88
00D4 6395 inc R22
00D6 L25:
00D6 .dbline 88
00D6 6A30 cpi R22,10
00D8 D8F3 brlo L22
00DA X4:
00DA .dbline 89
00DA ; r1 = MMC_SD_SendCommand(0, 0);//发idle命令 //send idle command
00DA 80E0 ldi R24,0
00DC 90E0 ldi R25,0
00DE A0E0 ldi R26,0
00E0 B0E0 ldi R27,0
00E2 A883 std y+0,R26
00E4 B983 std y+1,R27
00E6 9C01 movw R18,R24
00E8 0027 clr R16
00EA AADF xcall _MMC_SD_SendCommand
00EC 402F mov R20,R16
00EE .dbline 90
00EE ; retry++;
00EE A394 inc R10
00F0 .dbline 91
00F0 ; if(retry>10) return 1;//超时退出 //time out
00F0 8AE0 ldi R24,10
00F2 8A15 cp R24,R10
00F4 10F4 brsh L26
00F6 X5:
00F6 .dbline 91
00F6 01E0 ldi R16,1
00F8 2BC0 xjmp L18
00FA L26:
00FA .dbline 92
00FA ; } while(r1 != 0x01);
00FA L20:
00FA .dbline 92
00FA 4130 cpi R20,1
00FC 39F7 brne L19
00FE X6:
00FE .dbline 95
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -