📄 sd.lst
字号:
291 3 return KO;
292 3 }
293 2 }
294 1 STATUS07_00 = 0xFF;
295 1
296 1 if(!SDVar.SDCIF_IF)//SD
297 1 {
298 2 SDVar.RCA[1] = RESP119_112;//get RCA
299 2 SDVar.RCA[0] = RREP111_104;
300 2 }
301 1 //SDVar.CardStatus[1] = RREP103_096;
302 1 //SDVar.CardStatus[0] = RREP095_088;
303 1
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 6
304 1 //ChkCurrentState();
305 1 return OK;
306 1 }
307 /************************************************
308 函 数 名: SDCIF_SDIOCMD7()
309 功 能:选择/释放SD卡(RCA)
310 说 明:
311 调 用:
312 全局变量:RCA
313 入口参数:无
314 出口参数:无
315 返 回 值:OK or KO
316 ************************************************/
317 bit SDCIF_SDIOCMD7(void)
318 {
319 1 ARG31_24 = SDVar.RCA[1];//argument = RCA, form CMD3
320 1 ARG23_16 = SDVar.RCA[0];
321 1 //ARG15_08 = 0;//argument dont't care
322 1 //ARG07_00 = 0;
323 1 CMDCON = WAITRSP;
324 1 CMDINDEX = SELECT_DESELECT;
325 1 while(!(STATUS07_00 & CMDSEND));
326 1 while(!(STATUS07_00 & RSPRXVP))
327 1 {
328 2 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
329 2 {
330 3 STATUS07_00 = 0xFF;
331 3 return KO;
332 3 }
333 2 }
334 1 STATUS07_00 = 0xFF;
335 1 return OK;
336 1 }
337 /************************************************
338 函 数 名: SDCIF_CMD09()
339 功 能:Addressed card sends its card-specific data (CSD) on the CMD line
340 说 明:
341 调 用:
342 全局变量:RCA
343 入口参数:无
344 出口参数:无
345 返 回 值:OK or KO
346 ************************************************/
347 bit SDCIF_CMD09(void)
348 {
349 1 Byte tmp;
350 1
351 1 ARG31_24 = SDVar.RCA[1];//argument = RCA, form CMD3
352 1 ARG23_16 = SDVar.RCA[0];
353 1 //ARG15_08 = 0;//argument dont't care
354 1 //ARG07_00 = 0;
355 1 CMDCON = (LONGRSP | WAITRSP);
356 1 CMDINDEX = SEND_CSD;
357 1 while(!(STATUS07_00 & CMDSEND));
358 1 while(!(STATUS07_00 & RSPRXVP))
359 1 {
360 2 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
361 2 {
362 3 STATUS07_00 = 0xFF;
363 3 return KO;
364 3 }
365 2 }
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 7
366 1 STATUS07_00 = 0xFF;
367 1
368 1 ((Byte*)&sd_mem_size)[0] = 0;
369 1 ((Byte*)&sd_mem_size)[1] = 0;
370 1 ((Byte*)&sd_mem_size)[2] = RREP079_072 & CSD_MSK_CSH;
371 1 ((Byte*)&sd_mem_size)[3] = RREP071_064;
372 1 sd_mem_size = sd_mem_size << 2;
373 1 ((Byte*)&sd_mem_size)[3] |= ((RREP063_056 & CSD_MSK_CSL) >> 6);
374 1 /* read C_SIZE_MULT */
375 1 tmp = RREP055_048 << 1;
376 1 tmp = (tmp | (RREP047_040 >> 7)) & CSD_MSK_CSM;
377 1
378 1 sd_mem_size = ((sd_mem_size + 1) << (tmp + 2));
379 1 sd_mem_size--;
380 1
381 1 return OK;
382 1 }
383 /************************************************
384 函 数 名: SDCIF_CMD10()
385 功 能:Addressed card sends its card identification (CID) on the CMD line
386 说 明:
387 调 用:
388 全局变量:RCA
389 入口参数:无
390 出口参数:无
391 返 回 值:无
392 ************************************************/
393 /*void SDCIF_CMD10(void)
394 {
395 SDVar.ErrVal = 0;
396 ARG31_24 = SDVar.RCA[1];//argument = RCA, form CMD3
397 ARG23_16 = SDVar.RCA[0];
398 //ARG15_08 = 0;//argument dont't care
399 //ARG07_00 = 0;
400 CMDCON = (LONGRSP | WAITRSP);
401 CMDINDEX = SEND_CID;
402 while(!(STATUS07_00 & CMDSEND));
403 while(!(STATUS07_00 & RSPRXVP))
404 {
405 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
406 {
407 SDVar.ErrVal = 1;
408 //SYSDelay();
409 break;
410 }
411 }
412 STATUS07_00 = 0xFF;
413 }
414 /************************************************
415 函 数 名: SDCIF_CMD12()
416 功 能:Terminates a multiple block read/write operation
417 说 明:
418 调 用:
419 全局变量:
420 入口参数:无
421 出口参数:无
422 返 回 值:无
423 ************************************************/
424 bit SDCIF_CMD12(void)
425 {
426 1 //SDVar.ErrVal = 0;
427 1 //argument dont't care
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 8
428 1 CMDCON = (STOP | WAITRSP);
429 1 CMDINDEX = STOP_TRANSMISSION;
430 1 while(!(STATUS07_00 & CMDSEND));
431 1 while(!(STATUS07_00 & RSPRXVP))
432 1 {
433 2 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
434 2 {
435 3 STATUS07_00 = 0xFF;
436 3 return KO;
437 3 }
438 2 }
439 1 STATUS07_00 = 0xFF;
440 1 return OK;
441 1 }
442 /************************************************
443 函 数 名: SDCIF_CMD13()
444 功 能:Addressed card sends its status register
445 说 明:
446 调 用:
447 全局变量:RCA
448 入口参数:无
449 出口参数:无
450 返 回 值:无
451 ************************************************/
452 bit SDCIF_CMD13(void)
453 {
454 1 ARG31_24 = SDVar.RCA[1];//argument = RCA, form CMD3
455 1 ARG23_16 = SDVar.RCA[0];
456 1 //ARG15_08 = 0;//argument dont't care
457 1 //ARG07_00 = 0;
458 1 CMDCON = WAITRSP;
459 1 CMDINDEX = SEND_STATUS;
460 1 while(!(STATUS07_00 & CMDSEND));
461 1 while(!(STATUS07_00 & RSPRXVP))
462 1 {
463 2 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
464 2 {
465 3 STATUS07_00 = 0xFF;
466 3 STATUS15_08 = 0x03;
467 3 return KO;
468 3 }
469 2 }
470 1 STATUS07_00 = 0xFF;
471 1 STATUS15_08 = 0x03;
472 1 return OK;
473 1 }
474 /************************************************
475 函 数 名: SDCIF_CMD16()
476 功 能:Selects a block length (in bytes) for all following block commands (read and write)
477 说 明:
478 调 用:
479 全局变量:ErrVal, SD_lba(FlashAddr[3:0])
480 入口参数:无
481 出口参数:无
482 返 回 值:无
483 ************************************************/
484 /*void SDCIF_CMD16(void)
485 {
486 SDVar.ErrVal = 0;
487 ARG31_24 = SDVar.FlashAddr[0];//argument = SD_lba(FlashAddr[3:0]) = block length
488 ARG23_16 = SDVar.FlashAddr[1];
489 ARG15_08 = SDVar.FlashAddr[2];
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 9
490 ARG07_00 = SDVar.FlashAddr[3];
491 CMDCON = WAITRSP;
492 CMDINDEX = SET_BLOCKLEN;
493 while(!(STATUS07_00 & CMDSEND));
494
495 while(!(STATUS07_00 & RSPRXVP))
496 {
497 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
498 {
499 SDVar.ErrVal = 1;
500 //STATUS07_00 = 0xFF;
501 //return;
502 break;
503 }
504 }
505 STATUS07_00 = 0xFF;
506 }
507 /************************************************
508 函 数 名: SDCIF_CMD17()
509 功 能:Reads a block of the size selected by the SET_BLOCKLEN command
510 说 明:数据存放地址由SDH_DMA_CS决定
511 调 用:
512 全局变量:SD_lba(FlashAddr[3:0])
513 入口参数:无
514 出口参数:无
515 返 回 值:OK or KO
516 ************************************************/
517 //读单块
518 bit SDCIF_CMD17(void)
519 {
520 1 BLKLEN11_08 = 0x02;//SET_BLOCKLEN
521 1 BLKLEN07_00 = 0x00;
522 1 DATACON = XFER_MODE_0;//block read
523 1 ARG31_24 = SDVar.FlashAddr[0];//argument = SD_lba(FlashAddr[3:0])
524 1 ARG23_16 = SDVar.FlashAddr[1];
525 1 ARG15_08 = SDVar.FlashAddr[2];
526 1 ARG07_00 = SDVar.FlashAddr[3];
527 1 CMDCON = (WAITRSP | DATA_WITH);
528 1 CMDINDEX = READ_SINGLE_BLOCK;
529 1 while(!(STATUS07_00 & CMDSEND));
530 1
531 1 while(!(STATUS07_00 & RSPRXVP))
532 1 {
533 2 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
534 2 {
535 3 STATUS07_00 = 0xFF;
536 3 STATUS15_08 = 0x03;
537 3 return KO;
538 3 }
539 2 }
540 1 //SDH_DMA_ACK &= ~DMA_ACK_F;
541 1
542 1 while(!(STATUS07_00 & XFEREND))
543 1 {
544 2 if((STATUS07_00 & DTIMEOUT) || (STATUS07_00 & CRC16ERROR))
545 2 {
546 3 STATUS07_00 = 0xFF;
547 3 STATUS15_08 = 0x03;
548 3 return KO;
549 3 }
550 2 }
551 1 STATUS07_00 = 0xFF;
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 10
552 1 STATUS15_08 = 0x03;
553 1
554 1 if(!SDCIF_CMD13())
555 1 return KO;
556 1 return OK;
557 1 }
558 /************************************************
559 函 数 名: SDCIF_CMD24()
560 功 能:Writes a block of the size selected by the SET_BLOCKLEN command
561 说 明:数据存放地址由SDH_DMA_CS决定
562 调 用:
563 全局变量:SD_lba(FlashAddr[3:0])
564 入口参数:无
565 出口参数:无
566 返 回 值:OK or KO
567 ************************************************/
568 bit SDCIF_CMD24(void)
569 {
570 1 BLKLEN11_08 = 0x02;//SET_BLOCKLEN
571 1 BLKLEN07_00 = 0x00;
572 1 DATACON = XFER_MODE_1;//block write
573 1 ARG31_24 = SDVar.FlashAddr[0];//argument = SD_lba(FlashAddr[3:0])
574 1 ARG23_16 = SDVar.FlashAddr[1];
575 1 ARG15_08 = SDVar.FlashAddr[2];
576 1 ARG07_00 = SDVar.FlashAddr[3];
577 1 CMDCON = (WAITRSP | DATA_WITH);
578 1 CMDINDEX = WRITE_BLOCK;
579 1 while(!(STATUS07_00 & CMDSEND));
580 1
581 1 while(!(STATUS07_00 & RSPRXVP))
582 1 {
583 2 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
584 2 {
585 3 STATUS07_00 = 0xFF;
586 3 STATUS15_08 = BUSYEND;
587 3 return KO;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -