📄 mmc.lis
字号:
.module mmc.c
.area text(rom, con, rel)
0000 .dbfile G:\mega8\atmega16\mp3_7210\mmc.c
0000 .dbfunc e SPI_masterinit _SPI_masterinit fV
.even
0000 _SPI_masterinit::
0000 .dbline -1
0000 .dbline 52
0000 ; #include <iom16v.h>
0000 ;
0000 ; // MMC commands
0000 ; #define MMC_GO_IDLE_STATE 0
0000 ; #define MMC_SEND_OP_COND 1
0000 ; #define MMC_SEND_CSD 9
0000 ; #define MMC_SEND_CID 10
0000 ; #define MMC_SEND_STATUS 13
0000 ; #define MMC_SET_BLOCKLEN 16
0000 ; #define MMC_READ_SINGLE_BLOCK 17
0000 ; #define MMC_WRITE_BLOCK 24
0000 ; #define MMC_PROGRAM_CSD 27
0000 ; #define MMC_SET_WRITE_PROT 28
0000 ; #define MMC_CLR_WRITE_PROT 29
0000 ; #define MMC_SEND_WRITE_PROT 30
0000 ; #define MMC_TAG_SECTOR_START 32
0000 ; #define MMC_TAG_SECTOR_END 33
0000 ; #define MMC_UNTAG_SECTOR 34
0000 ; #define MMC_TAG_ERASE_GROUP_START 35
0000 ; #define MMC_TAG_ERARE_GROUP_END 36
0000 ; #define MMC_UNTAG_ERASE_GROUP 37
0000 ; #define MMC_ERASE 38
0000 ; #define MMC_CRC_ON_OFF 59
0000 ;
0000 ; #define R1_BUSY 128
0000 ; #define R1_PARAMETER 64
0000 ; #define R1_ADDRESS 32
0000 ; #define R1_ERASE_SEQ 16
0000 ; #define R1_COM_CRC 8
0000 ; #define R1_ILLEGAL_COM 4
0000 ; #define R1_ERASE_RESET 2
0000 ; #define R1_IDLE_STATE 1
0000 ;
0000 ; #define led1_off (PORTA|=(1<<6))
0000 ; #define led1_on (PORTA&=~(1<<6))
0000 ; #define led2_off (PORTA|=(1<<5))
0000 ; #define led2_on (PORTA&=~(1<<5))
0000 ;
0000 ; #define disable_mmc_cs (PORTB|=(1<<0))
0000 ; #define enable_mmc_cs (PORTB&=~(1<<0))
0000 ;
0000 ;
0000 ;
0000 ; unsigned char ram_data[512];
0000 ;
0000 ;
0000 ;
0000 ; extern void LCD_write(unsigned char data,unsigned char dc);
0000 ;
0000 ; /***********SPI初始化******************/
0000 ; void SPI_masterinit(void)
0000 ; {
0000 .dbline 54
0000 ; //不中断 允许 主模式 fck/4
0000 ; SPCR=0b01010000; //SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
0000 80E5 ldi R24,80
0002 8DB9 out 0xd,R24
0004 .dbline -2
0004 .dbline 56
0004 ;
0004 ; }
0004 L1:
0004 .dbline 0 ; func end
0004 0895 ret
0006 .dbend
0006 .dbfunc e SPI_tx_rx _SPI_tx_rx fc
0006 ; spi_data -> R16
.even
0006 _SPI_tx_rx::
0006 .dbline -1
0006 .dbline 61
0006 ;
0006 ; /***********SPI读取/写入****基础SPI传送命令******/
0006 ; unsigned char SPI_tx_rx(unsigned char spi_data);
0006 ; unsigned char SPI_tx_rx(unsigned char spi_data)
0006 ; {
0006 .dbline 62
0006 ; SPDR=spi_data;
0006 0FB9 out 0xf,R16
0008 L3:
0008 .dbline 63
0008 L4:
0008 .dbline 63
0008 ; while (!(SPSR&0x80));
0008 779B sbis 0xe,7
000A FECF rjmp L3
000C .dbline 64
000C ; return SPDR;
000C 0FB1 in R16,0xf
000E .dbline -2
000E L2:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbsym r spi_data 16 c
0010 .dbend
0010 .dbfunc e MMC_sendCmd _MMC_sendCmd fc
0010 ; temp -> R20
0010 ; A7_0 -> y+8
0010 ; A15_8 -> y+6
0010 ; A23_16 -> y+4
0010 ; A31_24 -> R20
0010 ; cmd -> R22
.even
0010 _MMC_sendCmd::
0010 0E940000 xcall push_gset2
0014 422F mov R20,R18
0016 602F mov R22,R16
0018 .dbline -1
0018 .dbline 69
0018 ; }
0018 ; /***********MMC_sendCmd();*****基础传送命令*******/
0018 ; unsigned char MMC_sendCmd(unsigned char cmd,unsigned char A31_24,unsigned char A23_16,unsigned char A15_8,unsigned char A7_0);
0018 ; unsigned char MMC_sendCmd(unsigned char cmd,unsigned char A31_24,unsigned char A23_16,unsigned char A15_8,unsigned char A7_0)
0018 ; {
0018 .dbline 71
0018 ; signed char temp;
0018 ; enable_mmc_cs;
0018 C098 cbi 0x18,0
001A .dbline 73
001A ;
001A ; SPI_tx_rx(cmd|0x40); //cmd"01xxxxxx"
001A 062F mov R16,R22
001C 0064 ori R16,64
001E F3DF xcall _SPI_tx_rx
0020 .dbline 74
0020 ; SPI_tx_rx(A31_24);
0020 042F mov R16,R20
0022 F1DF xcall _SPI_tx_rx
0024 .dbline 75
0024 ; SPI_tx_rx(A23_16);
0024 0C81 ldd R16,y+4
0026 EFDF xcall _SPI_tx_rx
0028 .dbline 76
0028 ; SPI_tx_rx(A15_8);
0028 0E81 ldd R16,y+6
002A EDDF xcall _SPI_tx_rx
002C .dbline 77
002C ; SPI_tx_rx(A7_0);
002C 0885 ldd R16,y+8
002E EBDF xcall _SPI_tx_rx
0030 .dbline 78
0030 ; SPI_tx_rx(0x95); //crc for cmd0
0030 05E9 ldi R16,149
0032 E9DF xcall _SPI_tx_rx
0034 .dbline 80
0034 ;
0034 ; SPI_tx_rx(0xff); //one empty cycle
0034 0FEF ldi R16,255
0036 E7DF xcall _SPI_tx_rx
0038 .dbline 82
0038 ;
0038 ; temp=SPI_tx_rx(0xff); //0=busy
0038 0FEF ldi R16,255
003A E5DF xcall _SPI_tx_rx
003C 402F mov R20,R16
003E .dbline 84
003E ; //LCD_write(temp,1); //test point
003E ; if ((temp-0x80)>=0) //0b1xxxxxxx=err
003E 842F mov R24,R20
0040 8058 subi R24,128
0042 8030 cpi R24,0
0044 34F0 brlt L7
0046 .dbline 85
0046 ; {
0046 .dbline 86
0046 ; temp=0xff;
0046 4FEF ldi R20,255
0048 L9:
0048 .dbline 87
0048 L10:
0048 .dbline 87
0048 ; while (SPI_tx_rx(0xff)==0);
0048 0FEF ldi R16,255
004A DDDF xcall _SPI_tx_rx
004C 0023 tst R16
004E E1F3 breq L9
0050 .dbline 89
0050 ; // led1_on; //test point
0050 ; }
0050 0EC0 xjmp L8
0052 L7:
0052 .dbline 91
0052 ; else
0052 ; if (cmd==MMC_SEND_STATUS) //如果是读状态命令
0052 6D30 cpi R22,13
0054 41F4 brne L18
0056 .dbline 92
0056 ; {
0056 .dbline 93
0056 ; temp=SPI_tx_rx(0xff); //read STATUS
0056 0FEF ldi R16,255
0058 D6DF xcall _SPI_tx_rx
005A 402F mov R20,R16
005C L14:
005C .dbline 94
005C L15:
005C .dbline 94
005C ; while (SPI_tx_rx(0xff)==0);
005C 0FEF ldi R16,255
005E D3DF xcall _SPI_tx_rx
0060 0023 tst R16
0062 E1F3 breq L14
0064 .dbline 96
0064 ; // led1_on;
0064 ; }
0064 04C0 xjmp L13
0066 X0:
0066 .dbline 98
0066 ; else //是其他命令
0066 ; {
0066 L17:
0066 .dbline 99
0066 L18:
0066 .dbline 99
0066 ; while (SPI_tx_rx(0xff)==0);
0066 0FEF ldi R16,255
0068 CEDF xcall _SPI_tx_rx
006A 0023 tst R16
006C E1F3 breq L17
006E .dbline 101
006E ; // led1_on;
006E ; }
006E L13:
006E L8:
006E .dbline 102
006E ; return temp;
006E 042F mov R16,R20
0070 .dbline -2
0070 L6:
0070 0E940000 xcall pop_gset2
0074 .dbline 0 ; func end
0074 0895 ret
0076 .dbsym r temp 20 C
0076 .dbsym l A7_0 8 c
0076 .dbsym l A15_8 6 c
0076 .dbsym l A23_16 4 c
0076 .dbsym r A31_24 20 c
0076 .dbsym r cmd 22 c
0076 .dbend
0076 .dbfunc e MMC_finish _MMC_finish fV
.even
0076 _MMC_finish::
0076 .dbline -1
0076 .dbline 106
0076 ; }
0076 ; /***********MMC_finish();***停止卡片******/
0076 ; void MMC_finish(void)
0076 ; {
0076 .dbline 107
0076 ; disable_mmc_cs;
0076 C09A sbi 0x18,0
0078 .dbline 108
0078 ; SPI_tx_rx(0xff);
0078 0FEF ldi R16,255
007A .dbline -2
007A .dbline 109
007A ; }
007A L20:
007A .dbline 0 ; func end
007A C5CF xjmp _SPI_tx_rx
007C .dbend
007C .dbfunc e MMC_flush _MMC_flush fV
007C ; counter -> R20
007C ; flush_num -> R22
.even
007C _MMC_flush::
007C 0E940000 xcall push_gset2
0080 602F mov R22,R16
0082 .dbline -1
0082 .dbline 114
0082 ;
0082 ; /***********MMC_flush();*****丢弃几个字节*******/
0082 ; void MMC_flush(unsigned char flush_num);
0082 ; void MMC_flush(unsigned char flush_num)
0082 ; {
0082 .dbline 116
0082 4427 clr R20
0084 03C0 xjmp L25
0086 L22:
0086 .dbline 116
0086 0FEF ldi R16,255
0088 BEDF xcall _SPI_tx_rx
008A L23:
008A .dbline 116
008A 4395 inc R20
008C L25:
008C .dbline 116
008C ; unsigned char counter;
008C ; for (counter=0;counter<flush_num;counter++) SPI_tx_rx(0xff); //丢弃几个字节
008C 4617 cp R20,R22
008E D8F3 brlo L22
0090 .dbline 117
0090 ; MMC_finish();
0090 F2DF xcall _MMC_finish
0092 .dbline -2
0092 .dbline 118
0092 ; }
0092 L21:
0092 0E940000 xcall pop_gset2
0096 .dbline 0 ; func end
0096 0895 ret
0098 .dbsym r counter 20 c
0098 .dbsym r flush_num 22 c
0098 .dbend
0098 .dbfunc e MMC_reset _MMC_reset fV
0098 ; lcd_add -> <dead>
0098 ; mmc_response -> R20
0098 ; counter -> R22
.even
0098 _MMC_reset::
0098 0E940000 xcall push_gset2
009C 2597 sbiw R28,5
009E .dbline -1
009E .dbline 122
009E ;
009E ; /***********MMC_reset();***将MMC卡转到SPI模式****/
009E ; void MMC_reset(void)
009E ; {
009E .dbline 124
009E 6627 clr R22
00A0 03C0 xjmp L30
00A2 L27:
00A2 .dbline 124
00A2 0FEF ldi R16,255
00A4 B0DF xcall _SPI_tx_rx
00A6 L28:
00A6 .dbline 124
00A6 6395 inc R22
00A8 L30:
00A8 .dbline 124
00A8 ; unsigned char counter,mmc_response,lcd_add;
00A8 ; for (counter=0;counter<11;counter++) SPI_tx_rx(0xff);//80个时钟开始总线
00A8 6B30 cpi R22,11
00AA D8F3 brlo L27
00AC .dbline 126
00AC ;
00AC ; mmc_response=MMC_sendCmd(MMC_GO_IDLE_STATE,0,0,0,0); //send cmd0
00AC 2224 clr R2
00AE 2C82 std y+4,R2
00B0 2A82 std y+2,R2
00B2 2882 std y+0,R2
00B4 2227 clr R18
00B6 0027 clr R16
00B8 ABDF xcall _MMC_sendCmd
00BA 402F mov R20,R16
00BC .dbline 127
00BC ; MMC_finish();
00BC DCDF xcall _MMC_finish
00BE .dbline 129
00BE ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -