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

📄 mmc.lst

📁 这是atmel公司的89C51SND1C的mp3源程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V6.20c  MMC                                                                   07/10/2002 15:17:49 PAGE 1   


C51 COMPILER V6.20c, COMPILATION OF MODULE MMC
OBJECT MODULE PLACED IN ..\obj\mmc.obj
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE ..\..\..\lib_mem\mmc\mmc.c BROWSE INCDIR(..\src\system;..\..\..\lib) DEFINE
                    -(KEIL) DEBUG OBJECTEXTEND PRINT(.\mmc.lst) OBJECT(..\obj\mmc.obj) 

stmt level    source

   1          /*C**************************************************************************
   2          * $RCSfile: mmc.c,v $
   3          *----------------------------------------------------------------------------
   4          * Copyright (c) 2002 Atmel.
   5          *----------------------------------------------------------------------------
   6          * RELEASE:      $Name: DEMO_FAT_1_2_5 $      
   7          * REVISION:     $Revision: 1.9 $     
   8          * FILE_CVSID:   $Id: mmc.c,v 1.9 2002/06/03 11:35:46 ffosse Exp $       
   9          *----------------------------------------------------------------------------
  10          * PURPOSE:
  11          * This file contains the high level MMC routines
  12          *
  13          * NOTES:
  14          * Global Variables:
  15          *   - gl_ptr_mem:   long in data space
  16          *
  17          * - The functions are written to handle a 2-card MMC stack
  18          * - Only MMC cards with block size = 512 bytes are accepted
  19          *****************************************************************************/
  20          
  21          /*_____ I N C L U D E S ____________________________________________________*/
  22          
  23          #include "config.h"                         /* system configuration */
  24          #include "..\..\lib\usb\usb_drv.h"          /* usb driver definition */
  25          #include "mmc.h"                            /* MMC definition */
  26          
  27          
  28          /*_____ M A C R O S ________________________________________________________*/
  29          
  30          
  31          /*_____ D E F I N I T I O N ________________________________________________*/
  32          
  33          extern  data    Uint32  gl_ptr_mem;         /* memory data pointer */
  34          extern  data    Byte    gl_mem_tick;        /* memory tick counter */
  35          extern  bdata   bit     gl_mem_failure;     /* memory hardware failure */
  36          
  37          static  Byte    mmc_state;
  38          static  bit     mmc_mem_busy;               /* memory in busy state */
  39          idata   Uint32  mmc_mem_size;               /* memory disk size in pages */
  40          
  41          
  42          /*_____ D E C L A R A T I O N ______________________________________________*/
  43          
  44          
  45          /*F**************************************************************************
  46          * NAME: mmc_init
  47          *----------------------------------------------------------------------------
  48          * PARAMS:
  49          *
  50          * return:
  51          *----------------------------------------------------------------------------
  52          * PURPOSE: 
  53          *   MMC initialisation
  54          *----------------------------------------------------------------------------
C51 COMPILER V6.20c  MMC                                                                   07/10/2002 15:17:49 PAGE 2   

  55          * EXAMPLE:
  56          *----------------------------------------------------------------------------
  57          * NOTE:
  58          *----------------------------------------------------------------------------
  59          * REQUIREMENTS:
  60          *****************************************************************************/
  61          void mmc_init (void)
  62          {
  63   1        gl_mem_failure = FALSE;
  64   1        mmc_state = MMC_FUNCT_START;
  65   1        mmc_mem_busy = FALSE;                     /* memory ready */
  66   1      }
  67          
  68          
  69          /*F**************************************************************************
  70          * NAME: mmc_init_csd
  71          *----------------------------------------------------------------------------
  72          * PARAMS:
  73          *
  74          * return:
  75          *   check status  - OK: card supported by software
  76          *                 - KO: card not supported by software
  77          *----------------------------------------------------------------------------
  78          * PURPOSE: 
  79          *   Card validity checking, memory variable initialisation and
  80          *   controller data transfer mode initialisation
  81          *----------------------------------------------------------------------------
  82          * EXAMPLE:
  83          *----------------------------------------------------------------------------
  84          * NOTE:
  85          *   Card with block size != 512 are rejected
  86          *----------------------------------------------------------------------------
  87          * REQUIREMENTS:
  88          *****************************************************************************/
  89          bit mmc_init_csd (void)
  90          {
  91   1      Byte  tmp;
  92   1      
  93   1        ACC = Mmc_rd_cmd();                       /* dummy read of header */
  94   1        ACC = Mmc_rd_cmd();                       /* dummy read of CSD[0] */
  95   1        ACC = Mmc_rd_cmd();                       /* dummy read */
  96   1        ACC = Mmc_rd_cmd();                       /* dummy read */
  97   1        ACC = Mmc_rd_cmd();                       /* dummy read */
  98   1        ACC = Mmc_rd_cmd();                       /* dummy read */
  99   1      
 100   1        if ((Mmc_rd_cmd() & CSD_MSK_RBL) != CSD_BLEN_512) /* check block length */
 101   1        { /* block size != 512 bytes not supported by firmware */
 102   2          Mmc_reset_cmd_fifos();                  /* reset pointers */
 103   2          return KO;
 104   2        }
 105   1        else
 106   1        {
 107   2          Mmc_set_block_size(CSD_BLEN_512);       /* init controller */
 108   2        }
 109   1        /* compute card size in number of block (block size = 512) */
 110   1        /* read C_SIZE */
 111   1        ((Byte*)&mmc_mem_size)[0] = 0;
 112   1        ((Byte*)&mmc_mem_size)[1] = 0;
 113   1        ((Byte*)&mmc_mem_size)[2] = Mmc_rd_cmd() & CSD_MSK_CSH;
 114   1        ((Byte*)&mmc_mem_size)[3] = Mmc_rd_cmd();
 115   1        mmc_mem_size = mmc_mem_size << 2;
 116   1        ((Byte*)&mmc_mem_size)[3] |= ((Mmc_rd_cmd() & CSD_MSK_CSL) >> 6);
C51 COMPILER V6.20c  MMC                                                                   07/10/2002 15:17:49 PAGE 3   

 117   1        /* read C_SIZE_MULT */
 118   1        tmp = Mmc_rd_cmd() << 1;
 119   1        tmp = (tmp | (Mmc_rd_cmd() >> 7)) & CSD_MSK_CSM;
 120   1        mmc_mem_size = ((mmc_mem_size + 1) << (tmp + 2));
 121   1        mmc_mem_size--;
 122   1        Mmc_set_single_block();                   /* single block mode transfer */
 123   1        Mmc_enable_flow_ctrl();                   /* start flow control */
 124   1        Mmc_reset_cmd_fifos();                    /* reset pointers */
 125   1        return OK;
 126   1      }
 127          
 128          
 129          /*F**************************************************************************
 130          * NAME: mmc_init_stack
 131          *----------------------------------------------------------------------------
 132          * PARAMS:
 133          *
 134          * return:
 135          *----------------------------------------------------------------------------
 136          * PURPOSE: 
 137          *   Initialize MMC controller and reset all cards to idle state
 138          *----------------------------------------------------------------------------
 139          * EXAMPLE:
 140          *----------------------------------------------------------------------------
 141          * NOTE:
 142          *   This function is called when initializing stack for first time
 143          *----------------------------------------------------------------------------
 144          * REQUIREMENTS:
 145          *****************************************************************************/
 146          void mmc_init_stack (void)
 147          {
 148   1        gl_mem_failure = FALSE;
 149   1        Mmc_set_read();                           /* dir from card to uc */
 150   1        Mmc_set_clock(MMC_CLK_INIT);              /* set MMC clock to 400 KHz */
 151   1        Mmc_enable();
 152   1        Mmc_reset();
 153   1        Mmc_reset_cmd_fifos();
 154   1        Mmc_reset_data_fifos();
 155   1        mmc_send_scmd(MMC_GO_IDLE_STATE, MMC_NO_RESP);
 156   1      }
 157          
 158          
 159          /*F**************************************************************************
 160          * NAME: mmc_init_next
 161          *----------------------------------------------------------------------------
 162          * PARAMS:
 163          *
 164          * return:
 165          *----------------------------------------------------------------------------
 166          * PURPOSE: 
 167          *   Initialize MMC controller
 168          *----------------------------------------------------------------------------
 169          * EXAMPLE:
 170          *----------------------------------------------------------------------------
 171          * NOTE:
 172          *   This function is called when stack has already been initialized
 173          *----------------------------------------------------------------------------
 174          * REQUIREMENTS:
 175          *****************************************************************************/
 176          void mmc_init_next (void)
 177          {
 178   1        gl_mem_failure = FALSE;
C51 COMPILER V6.20c  MMC                                                                   07/10/2002 15:17:49 PAGE 4   

 179   1        Mmc_set_read();                           /* dir from card to uc */
 180   1        Mmc_set_clock(MMC_CLK_INIT);              /* set MMC clock to 400 KHz */
 181   1        Mmc_enable();
 182   1        Mmc_reset();
 183   1        Mmc_reset_cmd_fifos();
 184   1        Mmc_reset_data_fifos();
 185   1      }
 186          
 187          
 188          /*F**************************************************************************
 189          * NAME: mmc_single_acq
 190          *----------------------------------------------------------------------------
 191          * PARAMS:
 192          *
 193          * return:
 194          *   MMC_OK:     state result OK
 195          *   MMC_ERROR:  state result KO
 196          *   MMC_END:    end of card acquisition
 197          *----------------------------------------------------------------------------
 198          * PURPOSE: 
 199          *   Single card acquisition
 200          *----------------------------------------------------------------------------
 201          * EXAMPLE:
 202          *----------------------------------------------------------------------------
 203          * NOTE:
 204          *   - This function must be called 5 or 6 times for completion depending on
 205          *     the busy card
 206          *   - Each call must be delayed enough to leave time for command
 207          *     transmission and response reception
 208          *   - It does not take care of the DSR
 209          *   - At the end of this function CSD is in buffer
 210          *
 211          *   STATES: MMC_SINGLE_OP_COND  send operating condition
 212          *           MMC_SINGLE_CID      check busy and send CID or op cond again
 213          *           MMC_SINGLE_SRA      check CID response and set relative address
 214          *           MMC_SINGLE_CSD      send CSD request
 215          *           MMC_SINGLE_END      check CSD reception
 216          *----------------------------------------------------------------------------
 217          * REQUIREMENTS:
 218          *****************************************************************************/
 219          Byte mmc_single_acq (void)
 220          {
 221   1      Uint32  response;
 222   1      
 223   1        switch (mmc_state)
 224   1        {
 225   2          case MMC_SINGLE_OP_COND:
 226   2          {
 227   3            mmc_send_cmd(MMC_SEND_OP_COND, MMC_OCR_INIT, MMC_RESP_R3);
 228   3            mmc_state = MMC_SINGLE_CID;
 229   3            return (MMC_OK);
 230   3          }
 231   2      
 232   2          case MMC_SINGLE_CID:
 233   2          {
 234   3            if (mmc_check_response() == MMC_ERR_RESP)
 235   3            {
 236   4              mmc_state = MMC_FUNCT_START;
 237   4              return (MMC_ERROR);                 /* no response */
 238   4            }
 239   3            else
 240   3            {
C51 COMPILER V6.20c  MMC                                                                   07/10/2002 15:17:49 PAGE 5   

 241   4              response = mmc_read_response();
 242   4              if ((((Byte*)&response)[0] & MMC_BUSY_OCR) != MMC_BUSY_OCR)
 243   4              {   /* at least one card is busy */
 244   5                mmc_send_cmd(MMC_SEND_OP_COND, MMC_OCR_INIT, MMC_RESP_R3);
 245   5              }
 246   4              else
 247   4              {
 248   5                mmc_send_scmd(MMC_ALL_SEND_CID, MMC_RESP_R2);
 249   5                mmc_state = MMC_SINGLE_SRA;
 250   5              }
 251   4              return (MMC_OK);
 252   4            }
 253   3          }
 254   2      
 255   2          case MMC_SINGLE_SRA:
 256   2          {
 257   3            if (mmc_check_response() == MMC_ERR_RESP)
 258   3            {
 259   4              mmc_state = MMC_FUNCT_START;
 260   4              return (MMC_ERROR);                 /* no response */
 261   4            }
 262   3            else
 263   3            {
 264   4              mmc_send_cmd(MMC_SET_RELATIVE_ADDRESS, MMC_RCA_1, MMC_RESP_R1);
 265   4              mmc_state = MMC_SINGLE_CSD;
 266   4              return (MMC_OK);
 267   4            }
 268   3          }
 269   2      
 270   2          case MMC_SINGLE_CSD:
 271   2          {
 272   3            if (mmc_check_response() == MMC_ERR_RESP)
 273   3            {
 274   4              mmc_state = MMC_FUNCT_START;
 275   4              return (MMC_ERROR);                 /* no response */
 276   4            }
 277   3            else
 278   3            {
 279   4              mmc_send_cmd(MMC_SEND_CSD, MMC_RCA_1, MMC_RESP_R2);
 280   4              mmc_state = MMC_SINGLE_END;
 281   4              return (MMC_OK);
 282   4            }
 283   3          }
 284   2      
 285   2          case MMC_SINGLE_END:
 286   2          {
 287   3            if (mmc_check_response() == MMC_ERR_RESP)
 288   3            {
 289   4              mmc_state = MMC_FUNCT_START;
 290   4              return (MMC_ERROR);                 /* no response */
 291   4            }
 292   3            else
 293   3            {
 294   4              Mmc_set_clock(MMC_CLK_TRANS);       /* set MMC clock to transfer */
 295   4              mmc_state = MMC_FUNCT_START;
 296   4              Mmc_set_single_block();             /* single block transfer */

⌨️ 快捷键说明

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