📄 mmc_sd.txt
字号:
000274 e5901004 LDR r1,[r0,#4]
000278 e3c110f4 BIC r1,r1,#0xf4
00027c e5801004 STR r1,[r0,#4]
;;;187 PINSEL1 |= (0x02 << 2) + (0x02 << 4) + (0x02 << 6);
000280 e5901004 LDR r1,[r0,#4]
000284 e38110a8 ORR r1,r1,#0xa8
000288 e5801004 STR r1,[r0,#4]
;;;188
;;;189 SSPCR0 = (0x00 << 8) | // SCR=0
00028c e3a00007 MOV r0,#7
000290 e2886701 ADD r6,r8,#0x40000
000294 e5860000 STR r0,[r6,#0]
;;;190 (0x00 << 7) | // CPHA =0时钟输出相位,仅SPI模式有效
;;;191 (0x00 << 6) | // CPOL =0时钟输出极性,仅SPI模式有效
;;;192 (0x00 << 4) | // FRF =00 帧格式 00=SPI,01=SSI,10=Microwire,11=保留
;;;193 (0x07 << 0); // DSS 数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位
;;;194
;;;195 SSPCR1 = (0x00 << 3) | // SOD 从机输出禁能,1=禁止,0=允许
000298 e3a00002 MOV r0,#2
00029c e5860004 STR r0,[r6,#4]
;;;196 (0x00 << 2) | // MS 主从选择,0=主机,1=从机
;;;197 (0x01 << 1) | // SSE SSP使能,1=允许SSP与其它设备通信
;;;198 (0x00 << 0); // LBM 回写模式
;;;199
;;;200 SSPIMSC = 0x00; // 取消所有中断使能
0002a0 e3a07000 MOV r7,#0
0002a4 e5867014 STR r7,[r6,#0x14]
;;;201 SSPICR = 0x00; // 中断清除寄存器
0002a8 e5867020 STR r7,[r6,#0x20]
0002ac e3a00080 MOV r0,#0x80
0002b0 e5860010 STR r0,[r6,#0x10]
;;;202
;;;203
;;;204 /* set SPI clock speed */
;;;205 SPI_Low();
;;;206 _delay_ms(100);
0002b4 e3a00064 MOV r0,#0x64
0002b8 ebfffffe BL soft_delay_ms
|L1.700|
;;;207 do
;;;208 {
;;;209 for(i=0;i<40;i++) SPI_WriteByte(0xff);
0002bc e3a02000 MOV r2,#0
|L1.704|
0002c0 e3a000ff MOV r0,#0xff
0002c4 ebfffffe BL SPI_WriteByte
0002c8 e2820001 ADD r0,r2,#1
0002cc e20020ff AND r2,r0,#0xff
0002d0 e3520028 CMP r2,#0x28
0002d4 3afffff9 BCC |L1.704|
;;;210 r1 = MMC_SD_SendCommandCRC(0, 0, 0x95);/*send idle command*/
0002d8 e3a01000 MOV r1,#0
0002dc e3a02095 MOV r2,#0x95
0002e0 e1a00001 MOV r0,r1
0002e4 ebfffffe BL MMC_SD_SendCommandCRC
;;;211 retry++;
0002e8 e2841001 ADD r1,r4,#1
0002ec e3c14801 BIC r4,r1,#0x10000
;;;212 if(retry>CMD_TIMOUT) return 1;/*time out*/
0002f0 e3540d7d CMP r4,#0x1f40
0002f4 8a000097 BHI |L1.1368|
;;;213 } while(r1 != 0x01);
0002f8 e3500001 CMP r0,#1
0002fc 1affffee BNE |L1.700|
;;;214
;;;215
;;;216 r1 = MMC_SD_SendCommandCRC_NoDeassert(8, 0x1aa, 0x87);/*check version*/
000300 e59f1264 LDR r1,|L1.1388|
000304 e3a02087 MOV r2,#0x87
000308 e3a00008 MOV r0,#8
00030c ebfffffe BL MMC_SD_SendCommandCRC_NoDeassert
000310 e59f5258 LDR r5,|L1.1392|
;;;217
;;;218 if(r1 == 0x05) /*version 1*/ /*if it is version 2, then it will return invalid command, that is bit 2*/
000314 e3500005 CMP r0,#5
000318 e3a09004 MOV r9,#4 ;216
00031c 1a000043 BNE |L1.1072|
;;;219 {
;;;220
;;;221 SPI_CS_Deassert;
000320 e5980004 LDR r0,[r8,#4]
000324 e3800602 ORR r0,r0,#0x200000
000328 e5880004 STR r0,[r8,#4]
;;;222 SPI_WriteByte(0xff); /* extra 8 CLK */
00032c e3a000ff MOV r0,#0xff
000330 ebfffffe BL SPI_WriteByte
;;;223 SPI_WriteByte(0xff);
000334 e3a000ff MOV r0,#0xff
000338 ebfffffe BL SPI_WriteByte
;;;224
;;;225
;;;226 printf_P(PSTR("\r\nVersion 1"));
00033c e28f0e23 ADR r0,|L1.1396|
000340 ebfffffe BL __1printf
;;;227
;;;228 retry = 0;
000344 e3a04000 MOV r4,#0
|L1.840|
;;;229 do
;;;230 {
;;;231 r1 = MMC_SD_SendCommandCRC(55, 0, 0);
000348 e3a02000 MOV r2,#0
00034c e1a01002 MOV r1,r2
000350 e3a00037 MOV r0,#0x37
000354 ebfffffe BL MMC_SD_SendCommandCRC
;;;232 if(r1!=0x01)
000358 e3500001 CMP r0,#1
00035c e1a08000 MOV r8,r0 ;231
000360 0a000005 BEQ |L1.892|
;;;233 {
;;;234 printf_P(PSTR("\r\n CMD55 r1=%x "),r1);
000364 e1a01008 MOV r1,r8
000368 e28f0e21 ADR r0,|L1.1408|
00036c ebfffffe BL __1printf
;;;235 return r1;
000370 e1a00008 MOV r0,r8
|L1.884|
000374 e8bd4ff8 POP {r3-r11,lr}
;;;236 }
;;;237 retry ++;
;;;238 r1 = MMC_SD_SendCommandCRC(41, 0, 0);
;;;239
;;;240 }while((r1!=0)&&(retry<CMD_TIMOUT));
;;;241
;;;242 if (retry==CMD_TIMOUT) /*then it should be MMC card: note: not tested! */
;;;243 {
;;;244 printf_P(PSTR("\r\nTake it as MMC card "));
;;;245 retry = 0;
;;;246 do
;;;247 {
;;;248 r1 = MMC_SD_SendCommand(1, 0);/*send active command*/
;;;249 retry++;
;;;250 if(retry>CMD_TIMOUT)
;;;251 {
;;;252 printf_P(PSTR("\r\n Time out "));
;;;253 return 1;/*time out*/
;;;254 }
;;;255 } while(r1);
;;;256 }
;;;257
;;;258 SPI_High(); /* Use High Speed SPI*/
;;;259 _delay_ms(1000);
;;;260 #if 1
;;;261 r1 = MMC_SD_SendCommand(59, 0);/*disable CRC*/
;;;262 if(r1 != 0)
;;;263 {
;;;264 printf_P(PSTR("\r\nDisabel CRC error"));
;;;265 return r1;
;;;266 }
;;;267
;;;268 r1 = MMC_SD_SendCommand(16, 512);/*set sector size to 512*/
;;;269 if(r1 != 0)
;;;270 {
;;;271 printf_P(PSTR("\r\nSet sector size error"));
;;;272 return r1;
;;;273 }
;;;274 #endif
;;;275 address_mode = BYTE_MODE;
;;;276 }
;;;277
;;;278 else if(r1 == 0x01)/*version 2*/ /*it only return idle*/
;;;279 {
;;;280 for(i=0;i<3;i++){buffer[i]=SPI_WriteByte(0xff);printf("%x ",buffer[i]);}
;;;281 //if(buffer[2]!=0xaa || ((buffer[1]&0xf)!=0x01))
;;;282 //{
;;;283 // printf_P(PSTR("\r\n pattern error"));
;;;284 // goto exit1;
;;;285 //}
;;;286
;;;287 SPI_CS_Deassert;
;;;288 SPI_WriteByte(0xff); /* extra 8 CLK */
;;;289
;;;290 printf_P(PSTR("\r\nVersion 2"));
;;;291
;;;292 retry = 0;
;;;293 do
;;;294 {
;;;295 r1 = MMC_SD_SendCommandCRC(55, 0, 0);
;;;296 if(r1!=0x01)
;;;297 {
;;;298 //printf_P(PSTR("\r\n CMD55 r1=%x "),r1);
;;;299 return r1;
;;;300 }
;;;301
;;;302 r1 = MMC_SD_SendCommandCRC(41, 0x40000000, 0);
;;;303
;;;304 }while(r1!=0);
;;;305
;;;306 if(MMC_SD_SendCommandCRC_NoDeassert(58, 0, 0)!=0x00)goto exit1; /*read OCR*/
;;;307 for(i=0;i<4;i++)buffer[i]=SPI_WriteByte(0xff);
;;;308
;;;309 if(buffer[0]&(1<<6))
;;;310 address_mode = BLOCK_MODE;
;;;311 else
;;;312 address_mode = BYTE_MODE;
;;;313
;;;314 SPI_CS_Deassert;
;;;315 SPI_WriteByte(0xff); /* extra 8 CLK */
;;;316
;;;317
;;;318 SPI_High(); /* Use High Speed SPI*/
;;;319
;;;320 }
;;;321 else
;;;322 {
;;;323 printf_P(PSTR("\r\nnot supported card"));
;;;324 }
;;;325
;;;326
;;;327 printf_P(PSTR("\r\naddress mode = %d"),address_mode);
;;;328
;;;329
;;;330 return 0; /*normal return*/
;;;331 exit1:
;;;332 printf_P(PSTR("\r\nexit 1 r1=%x "),r1);
;;;333
;;;334 SPI_CS_Deassert;
;;;335 SPI_WriteByte(0xff); /* extra 8 CLK */
;;;336 return 1;
;;;337 }
000378 e12fff1e BX lr
|L1.892|
00037c e2840001 ADD r0,r4,#1 ;237
000380 e3c04801 BIC r4,r0,#0x10000 ;237
000384 e3a02000 MOV r2,#0 ;238
000388 e1a01002 MOV r1,r2 ;238
00038c e3a00029 MOV r0,#0x29 ;238
000390 ebfffffe BL MMC_SD_SendCommandCRC
000394 e3500000 CMP r0,#0 ;240
000398 13540d7d CMPNE r4,#0x1f40 ;240
00039c 3affffe9 BCC |L1.840|
0003a0 e3540d7d CMP r4,#0x1f40 ;242
0003a4 1a00000e BNE |L1.996|
0003a8 e28f0e1e ADR r0,|L1.1424|
0003ac ebfffffe BL __1printf
0003b0 e3a04000 MOV r4,#0 ;245
|L1.948|
0003b4 e3a01000 MOV r1,#0 ;248
0003b8 e3a00001 MOV r0,#1 ;248
0003bc ebfffffe BL MMC_SD_SendCommand
0003c0 e2841001 ADD r1,r4,#1 ;249
0003c4 e3c14801 BIC r4,r1,#0x10000 ;249
0003c8 e3540d7d CMP r4,#0x1f40 ;250
0003cc 9a000002 BLS |L1.988|
0003d0 e28f0e1d ADR r0,|L1.1448|
0003d4 ebfffffe BL __1printf
0003d8 ea00005e B |L1.1368|
|L1.988|
0003dc e3500000 CMP r0,#0 ;255
0003e0 1afffff3 BNE |L1.948|
|L1.996|
0003e4 e5869010 STR r9,[r6,#0x10] ;255
0003e8 e3a00ffa MOV r0,#0x3e8 ;259
0003ec ebfffffe BL soft_delay_ms
0003f0 e3a01000 MOV r1,#0 ;261
0003f4 e3a0003b MOV r0,#0x3b ;261
0003f8 ebfffffe BL MMC_SD_SendCommand
0003fc e1b04000 MOVS r4,r0 ;261
000400 128f0e1b ADRNE r0,|L1.1464|
000404 1a000006 BNE |L1.1060|
000408 e3a01c02 MOV r1,#0x200 ;268
00040c e3a00010 MOV r0,#0x10 ;268
000410 ebfffffe BL MMC_SD_SendCommand
000414 e1b04000 MOVS r4,r0 ;268
000418 05c57000 STRBEQ r7,[r5,#0] ;275 ; address_mode
00041c 0a000040 BEQ |L1.1316|
000420 e28f0f69 ADR r0,|L1.1484|
|L1.1060|
000424 ebfffffe BL __1printf
000428 e1a00004 MOV r0,r4 ;272
00042c eaffffd0 B |L1.884|
|L1.1072|
000430 e3500001 CMP r0,#1 ;278
000434 1a000038 BNE |L1.1308|
000438 e3a04000 MOV r4,#0 ;280
00043c e28da000 ADD r10,sp,#0 ;280
|L1.1088|
000440 e3a000ff MOV r0,#0xff ;280
000444 ebfffffe BL SPI_WriteByte
000448 e7ca0004 STRB r0,[r10,r4] ;280
00044c e7da1004 LDRB r1,[r10,r4] ;280
000450 e28f0f4d ADR r0,|L1.1420|
000454 ebfffffe BL __1printf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -