⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmc_sd.txt

📁 mp3量不要让站长把时间都花费在为您修正说明上。压缩包解压时不能有密码。系统会自动删除debug和release目录
💻 TXT
📖 第 1 页 / 共 4 页
字号:
000768  e2820001          ADD      r0,r2,#1              ;395
00076c  e3c02801          BIC      r2,r0,#0x10000        ;395
000770  e3520c02          CMP      r2,#0x200             ;395
000774  3afffff9          BCC      |L1.1888|
;;;398    	}
;;;399    	
;;;400    	SPI_WriteByte(0xff);			//dummy crc
000778  e3a000ff          MOV      r0,#0xff
00077c  ebfffffe          BL       SPI_WriteByte
;;;401    	SPI_WriteByte(0xff);
000780  e3a000ff          MOV      r0,#0xff
000784  ebfffffe          BL       SPI_WriteByte
;;;402    	
;;;403    	r1 = SPI_WriteByte(0xff);
000788  e3a000ff          MOV      r0,#0xff
00078c  ebfffffe          BL       SPI_WriteByte
;;;404    	
;;;405    	if( (r1&0x1f) != 0x05)//等待是否成功	//judge if it successful
000790  e200101f          AND      r1,r0,#0x1f
000794  e3510005          CMP      r1,#5
;;;406    	{
;;;407    		SPI_CS_Deassert;
000798  15931004          LDRNE    r1,[r3,#4]
00079c  13811602          ORRNE    r1,r1,#0x200000
0007a0  15831004          STRNE    r1,[r3,#4]
;;;408    		return r1;
0007a4  1a000012          BNE      |L1.2036|
0007a8  ea000007          B        |L1.1996|
                  |L1.1964|
;;;409    	}
;;;410    	//等待操作完		//wait no busy
;;;411    	while(!SPI_WriteByte(0xff))if(retry++ > ACCESS_TIMEOUT){SPI_CS_Deassert;return 1;}
0007ac  e1a00004          MOV      r0,r4
0007b0  e3500807          CMP      r0,#0x70000
0007b4  25930004          LDRCS    r0,[r3,#4]
0007b8  e2844001          ADD      r4,r4,#1
0007bc  23800602          ORRCS    r0,r0,#0x200000
0007c0  25830004          STRCS    r0,[r3,#4]
0007c4  23a00001          MOVCS    r0,#1
0007c8  2a000009          BCS      |L1.2036|
                  |L1.1996|
0007cc  e3a000ff          MOV      r0,#0xff
0007d0  ebfffffe          BL       SPI_WriteByte
0007d4  e3500000          CMP      r0,#0
0007d8  0afffff3          BEQ      |L1.1964|
;;;412    
;;;413    	SPI_CS_Deassert;
0007dc  e5930004          LDR      r0,[r3,#4]
0007e0  e3800602          ORR      r0,r0,#0x200000
0007e4  e5830004          STR      r0,[r3,#4]
;;;414    	SPI_WriteByte(0xff);// extra 8 CLK
0007e8  e3a000ff          MOV      r0,#0xff
0007ec  ebfffffe          BL       SPI_WriteByte
;;;415    
;;;416    	return 0;
0007f0  e3a00000          MOV      r0,#0
                  |L1.2036|
0007f4  e8bd4030          POP      {r4,r5,lr}
;;;417    }
0007f8  e12fff1e          BX       lr
;;;418    
                          ENDP

                  MMC_SD_ReadCapacity PROC
;;;421    uint32 MMC_SD_ReadCapacity()
;;;422    {
0007fc  e92d401f          PUSH     {r0-r4,lr}
;;;423    	uint8 r1;
;;;424    	uint16 i;
;;;425    	uint16 temp;
;;;426    	uint8 buffer[16];
;;;427    	uint32 Capacity;
;;;428    	uint32 retry =0;
000800  e3a04000          MOV      r4,#0
;;;429    	//uint8 retry=0;
;;;430    
;;;431    	//if(address_mode==BLOCK_MODE) return 0; /*currently I do not have the spec. so do not kown how to calculate the capacity*/
;;;432    	
;;;433    	//SPI_High();		/* Use High Speed SPI*/
;;;434    
;;;435    	r1 = MMC_SD_SendCommandCRC_NoDeassert(9, 0,0);//写命令	//send command  //READ CSD
000804  e1a02004          MOV      r2,r4
000808  e1a01004          MOV      r1,r4
00080c  e3a00009          MOV      r0,#9
000810  ebfffffe          BL       MMC_SD_SendCommandCRC_NoDeassert
;;;436    	if(r1 != 0x00)
000814  e3500000          CMP      r0,#0
000818  1a000053          BNE      |L1.2412|
;;;437    		return r1;
;;;438    
;;;439    	SPI_CS_Assert;
00081c  e51f32c0          LDR      r3,|L1.1380|
000820  e593000c          LDR      r0,[r3,#0xc]
000824  e3800602          ORR      r0,r0,#0x200000
000828  e583000c          STR      r0,[r3,#0xc]
;;;440    	while(SPI_WriteByte(0xff) != 0xfe)if(retry++ > ACCESS_TIMEOUT){SPI_CS_Deassert;return 1;}
00082c  ea000007          B        |L1.2128|
                  |L1.2096|
000830  e1a00004          MOV      r0,r4
000834  e3500807          CMP      r0,#0x70000
000838  25930004          LDRCS    r0,[r3,#4]
00083c  e2844001          ADD      r4,r4,#1
000840  23800602          ORRCS    r0,r0,#0x200000
000844  25830004          STRCS    r0,[r3,#4]
000848  23a00001          MOVCS    r0,#1
00084c  2a000046          BCS      |L1.2412|
                  |L1.2128|
000850  e3a000ff          MOV      r0,#0xff
000854  ebfffffe          BL       SPI_WriteByte
000858  e35000fe          CMP      r0,#0xfe
00085c  1afffff3          BNE      |L1.2096|
;;;441    
;;;442    	
;;;443    	for(i=0;i<16;i++)
000860  e3a02000          MOV      r2,#0
000864  e28dc000          ADD      r12,sp,#0
                  |L1.2152|
;;;444    	{
;;;445    		buffer[i]=SPI_WriteByte(0xff);
000868  e3a000ff          MOV      r0,#0xff
00086c  ebfffffe          BL       SPI_WriteByte
000870  e7cc0002          STRB     r0,[r12,r2]
000874  e2820001          ADD      r0,r2,#1              ;443
000878  e3c02801          BIC      r2,r0,#0x10000        ;443
00087c  e3520010          CMP      r2,#0x10              ;443
000880  3afffff8          BCC      |L1.2152|
;;;446    	}	
;;;447    
;;;448    	SPI_WriteByte(0xff);
000884  e3a000ff          MOV      r0,#0xff
000888  ebfffffe          BL       SPI_WriteByte
;;;449    	SPI_WriteByte(0xff);
00088c  e3a000ff          MOV      r0,#0xff
000890  ebfffffe          BL       SPI_WriteByte
;;;450    	
;;;451    	SPI_WriteByte(0xff);
000894  e3a000ff          MOV      r0,#0xff
000898  ebfffffe          BL       SPI_WriteByte
;;;452    	
;;;453    	SPI_CS_Deassert;
00089c  e5930004          LDR      r0,[r3,#4]
0008a0  e3800602          ORR      r0,r0,#0x200000
0008a4  e5830004          STR      r0,[r3,#4]
;;;454    
;;;455    	SPI_WriteByte(0xff);// extra 8 CLK
0008a8  e3a000ff          MOV      r0,#0xff
0008ac  ebfffffe          BL       SPI_WriteByte
;;;456    
;;;457    	if((buffer[0]&0xc0)==0x40)
0008b0  e5dd0000          LDRB     r0,[sp,#0]
0008b4  e20000c0          AND      r0,r0,#0xc0
0008b8  e3500040          CMP      r0,#0x40
;;;458    	{
;;;459    		Capacity =  (((uint32)buffer[8])<<8 + (uint32)buffer[9] +1)*(uint32)1024;
0008bc  05dd1009          LDRBEQ   r1,[sp,#9]
0008c0  05dd0008          LDRBEQ   r0,[sp,#8]
0008c4  02811009          ADDEQ    r1,r1,#9
0008c8  01a00110          LSLEQ    r0,r0,r1
0008cc  01a00500          LSLEQ    r0,r0,#10
;;;460    		return Capacity;
0008d0  0a000025          BEQ      |L1.2412|
;;;461    	}
;;;462    
;;;463    /*********************************/
;;;464    //	C_SIZE
;;;465    	i = buffer[6]&0x03;
0008d4  e5dd0006          LDRB     r0,[sp,#6]
;;;466    	i<<=8;
0008d8  e3a01cff          MOV      r1,#0xff00
;;;467    	i += buffer[7];
;;;468    	i<<=2;
;;;469    	i += ((buffer[8]&0xc0)>>6);
;;;470    
;;;471    /**********************************/
;;;472    //  C_SIZE_MULT
;;;473    
;;;474    	r1 = buffer[9]&0x03;
;;;475    	r1<<=1;
;;;476    	r1 += ((buffer[10]&0x80)>>7);
;;;477    
;;;478    
;;;479    /**********************************/
;;;480    // BLOCKNR
;;;481    
;;;482    	r1+=2;
;;;483    
;;;484    	temp = 1;
0008dc  e3e02801          MVN      r2,#0x10000
0008e0  e2000003          AND      r0,r0,#3              ;465
0008e4  e0010400          AND      r0,r1,r0,LSL #8       ;466
0008e8  e5dd1007          LDRB     r1,[sp,#7]            ;467
0008ec  e0800001          ADD      r0,r0,r1              ;467
0008f0  e3e01803          MVN      r1,#0x30000           ;468
0008f4  e0010100          AND      r0,r1,r0,LSL #2       ;468
0008f8  e5dd1008          LDRB     r1,[sp,#8]            ;469
0008fc  e20110c0          AND      r1,r1,#0xc0           ;469
000900  e0803321          ADD      r3,r0,r1,LSR #6       ;469
000904  e5dd0009          LDRB     r0,[sp,#9]            ;474
000908  e5dd100a          LDRB     r1,[sp,#0xa]          ;476
00090c  e1a00f00          LSL      r0,r0,#30             ;474
000910  e1a00ea0          LSR      r0,r0,#29             ;475
000914  e2011080          AND      r1,r1,#0x80           ;476
000918  e08003a1          ADD      r0,r0,r1,LSR #7       ;476
00091c  e2800002          ADD      r0,r0,#2              ;482
000920  e3a01001          MOV      r1,#1
                  |L1.2340|
;;;485    	while(r1)
000924  e3500000          CMP      r0,#0
;;;486    	{
;;;487    		temp*=2;
;;;488    		r1--;
000928  12400001          SUBNE    r0,r0,#1
00092c  10021081          ANDNE    r1,r2,r1,LSL #1       ;487
000930  120000ff          ANDNE    r0,r0,#0xff
000934  1afffffa          BNE      |L1.2340|
;;;489    	}
;;;490    	
;;;491    	Capacity = ((uint32)(i+1))*((uint32)temp);
000938  e2830001          ADD      r0,r3,#1
00093c  e0030190          MUL      r3,r0,r1
;;;492    
;;;493    /////////////////////////
;;;494    // READ_BL_LEN
;;;495    
;;;496    	i = buffer[5]&0x0f;
000940  e5dd0005          LDRB     r0,[sp,#5]
;;;497    
;;;498    /*************************/
;;;499    //BLOCK_LEN
;;;500    
;;;501    	temp = 1;
000944  e3a01001          MOV      r1,#1
000948  e200000f          AND      r0,r0,#0xf            ;496
                  |L1.2380|
;;;502    	while(i)
00094c  e3500000          CMP      r0,#0
;;;503    	{
;;;504    		temp*=2;
;;;505    		i--;
000950  12400001          SUBNE    r0,r0,#1
000954  11a00800          LSLNE    r0,r0,#16
000958  10021081          ANDNE    r1,r2,r1,LSL #1       ;504
00095c  11a00820          LSRNE    r0,r0,#16
000960  1afffff9          BNE      |L1.2380|
;;;506    	}
;;;507    /************************/
;;;508    
;;;509    
;;;510    /************** formula of the capacity ******************/
;;;511    //
;;;512    //  memory capacity = BLOCKNR * BLOCK_LEN
;;;513    //	
;;;514    //	BLOCKNR = (C_SIZE + 1)* MULT
;;;515    //
;;;516    //           C_SIZE_MULT+2
;;;517    //	MULT = 2
;;;518    //
;;;519    //               READ_BL_LEN
;;;520    //	BLOCK_LEN = 2
;;;521    /**********************************************/
;;;522    
;;;523    //The final result
;;;524    	
;;;525    	Capacity *= (uint32)temp;	 
000964  e0000193          MUL      r0,r3,r1
;;;526    	return Capacity/512;		
000968  e1a004a0          LSR      r0,r0,#9
                  |L1.2412|
00096c  e28dd010          ADD      sp,sp,#0x10
000970  e8bd4010          POP      {r4,lr}
;;;527    }
000974  e12fff1e          BX       lr
;;;528    
                          ENDP


                          AREA ||.data||, DATA, ALIGN=0

                  address_mode
000000  00                DCB      0x00

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -