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

📄 sd.lst

📁 增强型51单片机fs7821sd卡、mmc卡读写程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.02b   SD                                                                   02/01/2007 10:35:44 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE SD
OBJECT MODULE PLACED IN .\Output\Sd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Sd.c OPTIMIZE(9,SPEED) BROWSE INCDIR(Include) DEFINE(READER) DEBUG OBJECTEX
                    -TEND PRINT(.\Output\Sd.lst) OBJECT(.\Output\Sd.obj)

stmt level    source

   1          /*
   2          **********************************************************************************************
   3          * Project:      TK7821
   4          * File:         sd.c
   5          * Contents: 
   6          *          The SD access module 
   7          *
   8          * $Date: 02/25/05    Jason    v0.1
   9          *        05/12/05    Mingo    v0.2   www.fameg.com
  10          *
  11          * Copyright (c) 2005 Fameg, Inc. All rights reserved
  12          ***********************************************************************************************
  13          */
  14          
  15          #include <reg51.h>
  16          #include <stdio.h>
  17          #include <string.h>
  18          #include "Device.h"
  19          #include "UsbDisk.h"
  20          #include "Storage.h"
  21          
  22          #define MAX_CMD_LEN          6
  23          #define MAX_RESP_LEN         17 // Max response length = 136 bits
  24          #define RSP_LEN              6     
  25          #define LONG_RSP_LEN         17
  26          #define CARD_CMD_START       0x40
  27          #define CARD_PWRUP_FINISH    0x80
  28          #define OPERATION_VOL_RANGE  0x00FF0000
  29          #define GOOD_CRC16_STS       0x02
  30          
  31          /* SD_COMMAND */
  32          #define SD_CMD_ONLY         1
  33          #define SD_CMD_SHORT_RSP    2 
  34          #define SD_CMD_LONG_RSP     3
  35          #define SD_CMD_TX_DATA      4
  36          #define SD_CMD_TX_DATA_ONLY 5 
  37          #define SD_CMD_RX_DATA      6
  38          #define SD_CMD_RX_DATA_ONLY 7 
  39          
  40          #define IDLE_STATE          0  
  41          #define READY_STATE         1
  42          #define IDENTIFY_STATE      2
  43          #define STANDBY_STATE       3
  44          #define TRANSFER_STATE      4  
  45          #define DATA_STATE          5
  46          #define RECEIVE_STATE       6
  47          #define PRGROGAM_STATE      7
  48          #define DISCONNECT_STATE    8  
  49          
  50          #define BUS_WIDTH_1BIT      0x00
  51          #define BUS_WIDTH_4BIT      0x02
  52          
  53          //      Command Name      Index   MMC-3.1 MMC-4.0 SD-1.01  Resp
  54          #define GO_IDLE_STATE        0    //  V      V      V      -
C51 COMPILER V7.02b   SD                                                                   02/01/2007 10:35:44 PAGE 2   

  55          #define SEND_OP_COND         1    //  V      V             R3 (OCR)
  56          #define ALL_SEND_CID         2    //  V      V      V      R2
  57          #define SEND_RELATIVE_ADDR   3    //  R1     R1     R6     See SdGetRespType()
  58          #define SET_DSR              4    //  V      V      V      - 
  59          #define SWITCH               6    //         V             R1
  60          #define SELECT_CARD          7    //  V      V      V      R1
  61          #define SEND_EXT_CSD         8    //         V             R1
  62          #define SEND_CSD             9    //  V      V      V      R2
  63          #define SEND_CID             10   //  V      V      V      R2
  64          #define READ_DAT_UNTIL_STOP  11   //  V      V             R1
  65          #define STOP_TRANS           12   //  V      V      V      R1
  66          #define SEND_STATUS          13   //  V      V      V      R1
  67          #define GO_INACTIVE_STATE    15   //  V      V      V      - 
  68          #define SET_BLOCKLEN         16   //  V      V      V      R1
  69          #define READ_BLOCK           17   //  V      V      V      R1
  70          #define READ_MUL_BLOCK       18   //  V      V      V      R1
  71          #define WRITE_DAT_UNTIL_STOP 20   //  V      V             R1
  72          #define SET_BLOCK_COUNT      23   //  V      V             R1
  73          #define WRITE_BLOCK          24   //  V      V      V      R1
  74          #define WRITE_MUL_BLOCK      25   //  V      V      V      R1
  75          #define PROGRAM_CID          26   //  V      V             R1
  76          #define PROGRAM_CSD          27   //  V      V      V      R1
  77          #define SET_WRITE_PROT       28   //  V      V      V      R1
  78          #define CLR_WRITE_PROT       29   //  V      V      V      R1
  79          #define SEND_WRITE_PROT      30   //  V      V      V      R1
  80          #define ERASE_WR_BLK_START   32   //                V      R1
  81          #define ERASE_WR_BLK_END     33   //                V      R1
  82          #define ERASE_GROUP_START    35   //  V      V             R1
  83          #define ERASE_GROUP_END      36   //  V      V             R1
  84          #define ERASE                38   //  V      V      V      R1
  85          #define FAST_IO              39   //  V      V             R4
  86          #define GO_IRQ_STATE         40   //  V      V             R5
  87          #define LOCK_UNLOCK          42   //  V      V      V      R1
  88          #define APP_CMD              55   //  V      V      V      R1
  89          #define GEN_CMD              56   //  V      V      V      R1
  90          
  91          //      ACMD Name         Index   MMC-3.1 MMC-4.0 SD-1.01  Resp
  92          #define SET_BUS_WIDTH        6    //                V      R1
  93          #define SEND_SD_STATUS       13   //                V      R1
  94          #define SEND_NUM_WR_BLOCKS   22   //                V      R1
  95          #define SET_WR_BLK_ERASE_CNT 23   //                V      R1
  96          #define SD_SEND_OP_COND      41   //                V      R3 (OCR)
  97          #define SET_CLR_CARD_DETECT  42   //                V      R1
  98          #define SEND_SCR             51   //                V      R1
  99          
 100          // ??? According to Spec of MMC3.1, MultiMediaCard returns response of
 101          //     type R1 to APP_CMD (CMD55). But, according to Spec of SD1.01 
 102          //     page 23, MultiMediaCard will not respond to APP_CMD - CMD55. 
 103          //     Is this a confliction ? 
 104          
 105          
 106          #define SdHiClk() CSRWrite(SD_BASE + SD_CLK_CTRL, \
 107                               (CSRRead(SD_BASE + SD_CLK_CTRL) | SD_CLK_SEL) | SD_CLK_EN);
 108          #define SdLoClk()  CSRWrite(SD_BASE + SD_CLK_CTRL, \
 109                               (CSRRead(SD_BASE + SD_CLK_CTRL) & ~SD_CLK_SEL) | SD_CLK_EN); 
 110          #define SdStopClk() CSRWrite(SD_BASE + SD_CLK_CTRL, \
 111                               CSRRead(SD_BASE + SD_CLK_CTRL) & ~SD_CLK_EN);                      
 112          #define IsCardBusy() (CSRRead(SD_BASE + SD_STATUS) & SD_BUSY)     
 113          #define SdWriteProtect() (!(CSRRead(SD_BASE + SD_STATUS) & SD_WPD))
 114          #define SdCardExist() (CSRRead(SD_BASE + SD_STATUS) & SD_CARD_STS)
 115          #define SdCtrlReset() CSRWrite(SD_BASE + SD_CLK_CTRL, SD_RESET | SD_CLK_EN)
 116          #define SdWaitCard()\
C51 COMPILER V7.02b   SD                                                                   02/01/2007 10:35:44 PAGE 3   

 117          {\
 118            CmdTimer = SD_CMD_TIMEOUT;\
 119            while (IsCardBusy() && CmdTimer);\
 120          }
 121          
 122          #ifdef PMOS
 123            #define SdPowerOn() {SD_POWER_CTRL = 0; Delay(50);}
 124            #define SdPowerOff() SD_POWER_CTRL = 1
 125          #else
                #define SdPowerOn()
                #define SdPowerOff()
              #endif
 129          
 130          typedef enum {CARD_SD, CARD_MMC} TCARD_TYPE;
 131          
 132          /*************************************************
 133             Global Variables
 134          *************************************************/
 135          xdata BYTE SdGetFlashInfoTimer = 0;
 136          
 137          /*************************************************
 138             Local Variables
 139          *************************************************/
 140          static xdata UINT32 SdAvailableBlocks = 0;
 141          static xdata TCARD_TYPE CardType = CARD_SD;
 142          static idata BYTE SdCmdBuf[MAX_CMD_LEN];
 143          static xdata BYTE SdRespBuf[MAX_RESP_LEN]; 
 144          static idata UINT32 RCA = 0;
 145          
 146          #define TYPE_RESP_NO      0
 147          #define TYPE_RESP_R1      1
 148          #define TYPE_RESP_R2      2
 149          #define TYPE_RESP_R3      3
 150          #define TYPE_RESP_R4      4
 151          #define TYPE_RESP_R5      5
 152          #define TYPE_RESP_R6      6
 153          
 154          xdata bool IsAppCmd = false;
 155          
 156          BYTE SdGetRespType(BYTE CmdIndex)
 157          {
 158   1          if(CmdIndex == SEND_RELATIVE_ADDR)
 159   1          {
 160   2              if(CardType == CARD_SD)
 161   2                  return TYPE_RESP_R6;
 162   2              else
 163   2                  return TYPE_RESP_R1;
 164   2          }
 165   1          switch(CmdIndex)
 166   1          {
 167   2              case GO_IDLE_STATE        : return TYPE_RESP_NO; break;
 168   2              case SEND_OP_COND         : return TYPE_RESP_R3; break;
 169   2              case ALL_SEND_CID         : return TYPE_RESP_R2; break;
 170   2              case SET_DSR              : return TYPE_RESP_NO; break;
 171   2              case SWITCH               : return TYPE_RESP_R1; break;
 172   2              case SELECT_CARD          : return TYPE_RESP_R1; break;
 173   2              case SEND_EXT_CSD         : return TYPE_RESP_R1; break;
 174   2              case SEND_CSD             : return TYPE_RESP_R2; break;
 175   2              case SEND_CID             : return TYPE_RESP_R2; break;
 176   2              case READ_DAT_UNTIL_STOP  : return TYPE_RESP_R1; break;
 177   2              case STOP_TRANS           : return TYPE_RESP_R1; break;
 178   2              case SEND_STATUS          : return TYPE_RESP_R1; break;
C51 COMPILER V7.02b   SD                                                                   02/01/2007 10:35:44 PAGE 4   

 179   2              case GO_INACTIVE_STATE    : return TYPE_RESP_NO; break;
 180   2              case SET_BLOCKLEN         : return TYPE_RESP_R1; break;
 181   2              case READ_BLOCK           : return TYPE_RESP_R1; break;
 182   2              case READ_MUL_BLOCK       : return TYPE_RESP_R1; break;
 183   2              case WRITE_DAT_UNTIL_STOP : return TYPE_RESP_R1; break;
 184   2              case SET_BLOCK_COUNT      : return TYPE_RESP_R1; break;
 185   2              case WRITE_BLOCK          : return TYPE_RESP_R1; break;
 186   2              case WRITE_MUL_BLOCK      : return TYPE_RESP_R1; break;
 187   2              case PROGRAM_CID          : return TYPE_RESP_R1; break;
 188   2              case PROGRAM_CSD          : return TYPE_RESP_R1; break;
 189   2              case SET_WRITE_PROT       : return TYPE_RESP_R1; break;
 190   2              case CLR_WRITE_PROT       : return TYPE_RESP_R1; break;
 191   2              case SEND_WRITE_PROT      : return TYPE_RESP_R1; break;
 192   2              case ERASE_WR_BLK_START   : return TYPE_RESP_R1; break;
 193   2              case ERASE_WR_BLK_END     : return TYPE_RESP_R1; break;
 194   2              case ERASE_GROUP_START    : return TYPE_RESP_R1; break;
 195   2              case ERASE_GROUP_END      : return TYPE_RESP_R1; break;
 196   2              case ERASE                : return TYPE_RESP_R1; break;
 197   2              case FAST_IO              : return TYPE_RESP_R4; break;
 198   2              case GO_IRQ_STATE         : return TYPE_RESP_R5; break;
 199   2              case LOCK_UNLOCK          : return TYPE_RESP_R1; break;
 200   2              case APP_CMD              : return TYPE_RESP_R1; break;
 201   2              case GEN_CMD              : return TYPE_RESP_R1; break;
 202   2              // APP_CMDs
 203   2              case SEND_NUM_WR_BLOCKS   : return TYPE_RESP_R1; break;
 204   2              case SD_SEND_OP_COND      : return TYPE_RESP_R3; break;
 205   2              case SEND_SCR             : return TYPE_RESP_R1; break;
 206   2              default                   : return TYPE_RESP_NO; break;
 207   2          }

⌨️ 快捷键说明

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