📄 mmc.lis
字号:
00FE ;
00FE ;
00FE ; retry = 0;
00FE AA24 clr R10
0100 L28:
0100 .dbline 97
0100 ; do
0100 ; {
0100 .dbline 98
0100 ; r1 = MMC_SD_SendCommand(1, 0);//发active命令 //send active command
0100 80E0 ldi R24,0
0102 90E0 ldi R25,0
0104 A0E0 ldi R26,0
0106 B0E0 ldi R27,0
0108 A883 std y+0,R26
010A B983 std y+1,R27
010C 9C01 movw R18,R24
010E 01E0 ldi R16,1
0110 97DF xcall _MMC_SD_SendCommand
0112 402F mov R20,R16
0114 .dbline 99
0114 ; retry++;
0114 A394 inc R10
0116 .dbline 100
0116 ; if(retry>100) return 1;//超时退出 //time out
0116 84E6 ldi R24,100
0118 8A15 cp R24,R10
011A 10F4 brsh L31
011C X7:
011C .dbline 100
011C 01E0 ldi R16,1
011E 18C0 xjmp L18
0120 L31:
0120 .dbline 101
0120 ; } while(r1);
0120 L29:
0120 .dbline 101
0120 4423 tst R20
0122 71F7 brne L28
0124 X8:
0124 .dbline 102
0124 ; SPI_High();
0124 71DF xcall _SPI_High
0126 .dbline 103
0126 ; r1 = MMC_SD_SendCommand(59, 0);//关crc //disable CRC
0126 80E0 ldi R24,0
0128 90E0 ldi R25,0
012A A0E0 ldi R26,0
012C B0E0 ldi R27,0
012E A883 std y+0,R26
0130 B983 std y+1,R27
0132 9C01 movw R18,R24
0134 0BE3 ldi R16,59
0136 84DF xcall _MMC_SD_SendCommand
0138 .dbline 105
0138 ;
0138 ; r1 = MMC_SD_SendCommand(16, 512);//设扇区大小512 //set sector size to 512
0138 80E0 ldi R24,0
013A 92E0 ldi R25,2
013C A0E0 ldi R26,0
013E B0E0 ldi R27,0
0140 A883 std y+0,R26
0142 B983 std y+1,R27
0144 9C01 movw R18,R24
0146 00E1 ldi R16,16
0148 7BDF xcall _MMC_SD_SendCommand
014A A02E mov R10,R16
014C 4A2D mov R20,R10
014E .dbline 106
014E ; return 0;//正常返回 //normal return
014E 0027 clr R16
0150 .dbline -2
0150 L18:
0150 .dbline 0 ; func end
0150 2296 adiw R28,2
0152 0C940000 xjmp pop_xgsetF00C
0156 .dbsym r r1 20 c
0156 .dbsym r i 22 c
0156 .dbsym r retry 10 c
0156 .dbend
0156 .dbfunc e MMC_SD_ReadSingleBlock _MMC_SD_ReadSingleBlock fc
0156 ; r1 -> R12
0156 ; retry -> R20,R21
0156 ; i -> R20,R21
0156 ; buffer -> R10,R11
0156 ; sector -> y+10
.even
0156 _MMC_SD_ReadSingleBlock::
0156 0E940000 xcall push_arg4
015A 0E940000 xcall push_xgsetF03C
015E 2297 sbiw R28,2
0160 AE84 ldd R10,y+14
0162 BF84 ldd R11,y+15
0164 .dbline -1
0164 .dbline 111
0164 ; }
0164 ;
0164 ; //读一个扇区,成功,返回0
0164 ; uint8 MMC_SD_ReadSingleBlock(uint32 sector, uint8* buffer)
0164 ; {
0164 .dbline 114
0164 ; uint8 r1;
0164 ; register uint16 i;
0164 ; register uint16 retry=0;
0164 4427 clr R20
0166 5527 clr R21
0168 .dbline 116
0168 ;
0168 ; r1 = MMC_SD_SendCommand(17, sector<<9);//读命令 //read command
0168 89E0 ldi R24,9
016A 90E0 ldi R25,0
016C 0A85 ldd R16,y+10
016E 1B85 ldd R17,y+11
0170 2C85 ldd R18,y+12
0172 3D85 ldd R19,y+13
0174 8A93 st -y,R24
0176 0E940000 xcall lsl32
017A 2883 std y+0,R18
017C 3983 std y+1,R19
017E 9801 movw R18,R16
0180 01E1 ldi R16,17
0182 5EDF xcall _MMC_SD_SendCommand
0184 C02E mov R12,R16
0186 .dbline 118
0186 ;
0186 ; if(r1 != 0x00)
0186 0023 tst R16
0188 09F0 breq L34
018A X9:
018A .dbline 119
018A ; return r1;
018A 27C0 xjmp L33
018C L34:
018C .dbline 121
018C ;
018C ; SPI_CS_Assert();
018C C498 cbi 0x18,4
018E 0BC0 xjmp L37
0190 L36:
0190 .dbline 123
0190 ; //等数据的开始
0190 ; while(SPI_WriteByte(0xff) != 0xfe) if(retry++ > 1000){SPI_CS_Deassert(); return 1;}
0190 1A01 movw R2,R20
0192 4F5F subi R20,255 ; offset = 1
0194 5F4F sbci R21,255
0196 88EE ldi R24,1000
0198 93E0 ldi R25,3
019A 8215 cp R24,R2
019C 9305 cpc R25,R3
019E 18F4 brsh L39
01A0 X10:
01A0 .dbline 123
01A0 .dbline 123
01A0 C49A sbi 0x18,4
01A2 .dbline 123
01A2 01E0 ldi R16,1
01A4 1AC0 xjmp L33
01A6 L39:
01A6 L37:
01A6 .dbline 123
01A6 0FEF ldi R16,255
01A8 38DF xcall _SPI_WriteByte
01AA 602F mov R22,R16
01AC 0E3F cpi R16,254
01AE 81F7 brne L36
01B0 X11:
01B0 .dbline 125
01B0 ;
01B0 ; for(i=0; i<512; i++)//读512个数据 //read 512 bytes
01B0 4427 clr R20
01B2 5527 clr R21
01B4 08C0 xjmp L44
01B6 L41:
01B6 .dbline 126
01B6 ; {
01B6 .dbline 127
01B6 ; *buffer++ = SPI_WriteByte(0xff);
01B6 0FEF ldi R16,255
01B8 30DF xcall _SPI_WriteByte
01BA C02E mov R12,R16
01BC F501 movw R30,R10
01BE C192 st Z+,R12
01C0 5F01 movw R10,R30
01C2 .dbline 128
01C2 ; }
01C2 L42:
01C2 .dbline 125
01C2 4F5F subi R20,255 ; offset = 1
01C4 5F4F sbci R21,255
01C6 L44:
01C6 .dbline 125
01C6 4030 cpi R20,0
01C8 E2E0 ldi R30,2
01CA 5E07 cpc R21,R30
01CC A0F3 brlo L41
01CE X12:
01CE .dbline 130
01CE ;
01CE ; SPI_WriteByte(0xff);//伪crc
01CE 0FEF ldi R16,255
01D0 24DF xcall _SPI_WriteByte
01D2 .dbline 131
01D2 ; SPI_WriteByte(0xff);
01D2 0FEF ldi R16,255
01D4 22DF xcall _SPI_WriteByte
01D6 .dbline 133
01D6 ;
01D6 ; SPI_CS_Deassert();
01D6 C49A sbi 0x18,4
01D8 .dbline 135
01D8 ;
01D8 ; return 0;
01D8 0027 clr R16
01DA .dbline -2
01DA L33:
01DA .dbline 0 ; func end
01DA 2296 adiw R28,2
01DC 0E940000 xcall pop_xgsetF03C
01E0 2496 adiw R28,4
01E2 0895 ret
01E4 .dbsym r r1 12 c
01E4 .dbsym r retry 20 i
01E4 .dbsym r i 20 i
01E4 .dbsym r buffer 10 pc
01E4 .dbsym l sector 10 l
01E4 .dbend
01E4 ; }
01E4 ;
01E4 ; /*
01E4 ; //写一个扇区 //wirite one sector //not used in this application
01E4 ; uint8 MMC_SD_WriteSingleBlock(uint32 sector, uint8* buffer)
01E4 ; {
01E4 ; uint8 r1;
01E4 ; uint16 i;
01E4 ; uint16 retry=0;
01E4 ;
01E4 ; r1 = MMC_SD_SendCommand(24, sector<<9);//写命令 //send command
01E4 ; if(r1 != 0x00)
01E4 ; return r1;
01E4 ;
01E4 ; SPI_CS_Assert();
01E4 ;
01E4 ; SPI_WriteByte(0xff);
01E4 ; SPI_WriteByte(0xff);
01E4 ; SPI_WriteByte(0xff);
01E4 ;
01E4 ; SPI_WriteByte(0xfe);//发开始符 //send start byte
01E4 ;
01E4 ; for(i=0; i<512; i++)//送512字节数据 //send 512 bytes data
01E4 ; {
01E4 ; SPI_WriteByte(*buffer++);
01E4 ; }
01E4 ;
01E4 ; SPI_WriteByte(0xff);
01E4 ; SPI_WriteByte(0xff);
01E4 ;
01E4 ; r1 = SPI_WriteByte(0xff);
01E4 ;
01E4 ; if( (r1&0x1f) != 0x05)//等待是否成功 //judge if it successful
01E4 ; {
01E4 ; SPI_CS_Deassert();
01E4 ; return r1;
01E4 ; }
01E4 ; //等待操作完 //wait no busy
01E4 ; while(!SPI_WriteByte(0xff))if(retry++ > 2000){SPI_CS_Deassert();return 1;}
01E4 ;
01E4 ; SPI_CS_Deassert();
01E4 ;
01E4 ; return 0;
01E4 ; }
01E4 ;
01E4 ; uint32 MMC_SD_ReadCapacity(void)
01E4 ; {
01E4 ; uint8 r1;
01E4 ; uint16 i;
01E4 ; uint16 temp;
01E4 ; uint8 buffer[16];
01E4 ; uint32 Capacity;
01E4 ; //uint8 retry=0;
01E4 ;
01E4 ; r1 = MMC_SD_SendCommand(9, 0);//写命令 //send command //READ CSD
01E4 ; if(r1 != 0x00)
01E4 ; return r1;
01E4 ;
01E4 ; SPI_CS_Assert();
01E4 ; while(SPI_WriteByte(0xff) != 0xfe);
01E4 ;
01E4 ; for(i=0;i<16;i++)
01E4 ; {
01E4 ; buffer[i]=SPI_WriteByte(0xff);
01E4 ; }
01E4 ;
01E4 ; SPI_WriteByte(0xff);
01E4 ; SPI_WriteByte(0xff);
01E4 ;
01E4 ; SPI_WriteByte(0xff);
01E4 ;
01E4 ; SPI_CS_Deassert();
01E4 ;
01E4 ; //////////////////////////////////////
01E4 ; // C_SIZE
01E4 ; i = buffer[6]&0x03;
01E4 ; i<<=8;
01E4 ; i += buffer[7];
01E4 ; i<<=2;
01E4 ; i += ((buffer[8]&0xc0)>>6);
01E4 ;
01E4 ; ///////////////////////////////////////
01E4 ; // C_SIZE_MULT
01E4 ;
01E4 ; r1 = buffer[9]&0x03;
01E4 ; r1<<=1;
01E4 ; r1 += ((buffer[10]&0x80)>>7);
01E4 ;
01E4 ;
01E4 ; ///////////////////////////////////////
01E4 ; // BLOCKNR
01E4 ;
01E4 ; r1+=2;
01E4 ;
01E4 ; temp = 1;
01E4 ; while(r1)
01E4 ; {
01E4 ; temp*=2;
01E4 ; r1--;
01E4 ; }
01E4 ;
01E4 ; Capacity = ((uint32)(i+1))*((uint32)temp);
01E4 ;
01E4 ; /////////////////////////
01E4 ; // READ_BL_LEN
01E4 ;
01E4 ; i = buffer[5]&0x0f;
01E4 ;
01E4 ; /////////////////////////
01E4 ; //BLOCK_LEN
01E4 ;
01E4 ; temp = 1;
01E4 ; while(i)
01E4 ; {
01E4 ; temp*=2;
01E4 ; i--;
01E4 ; }
01E4 ; /////////////////////////
01E4 ;
01E4 ;
01E4 ; ////////////////////////////////////////////////////////////
01E4 ; //
01E4 ; // memory capacity = BLOCKNR * BLOCK_LEN
01E4 ; //
01E4 ; // BLOCKNR = (C_SIZE + 1)* MULT
01E4 ; //
01E4 ; // C_SIZE_MULT+2
01E4 ; // MULT = 2
01E4 ; //
01E4 ; // READ_BL_LEN
01E4 ; // BLOCK_LEN = 2
01E4 ; ////////////////////////////////////////////////////////////
01E4 ; //The final result
01E4 ;
01E4 ; Capacity *= (uint32)temp;
01E4 ; return Capacity;
01E4 ; }
01E4 ;
01E4 ; */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -