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

📄 mmc_read.c

📁 5509 MMC in Native Mode
💻 C
字号:
/****************************************************************************\
*           Copyright (C) 1999-2000 Texas Instruments Incorporated.
*                           All Rights Reserved 
*------------------------------------------------------------------------------
* MODULE NAME... MMC
* FILENAME...... mmc_read.c
* DATE CREATED.. Thu May 24 14:48:09 2001
* PROJECT....... Chip Support Library
* COMPONENT..... Service Layer
* PREREQUISITS.. 
*------------------------------------------------------------------------------
*
* HISTORY:
*	 Created:		Thu May 24 14:48:09 2001 (Automatic generation)
*	 Last Modified:	
*
*------------------------------------------------------------------------------
* DESCRIPTION: Reads a block of data from MMC card
*
\*************************************************************************/
#define _MMC_MOD_
/*************************************************************************\
* Included Header Files                                                  *
\*************************************************************************/

#include <csl_mmc.h>

#if (_MMC_SUPPORT)

#pragma CODE_SECTION(MMC_read,".text:MMC_read")

/**************************************************************************
* MMC_read(MMC_Handle mmc, Uint32 cardAddr, Uint16 *buffer, Uint32 length)
*          mmc     - Handle of MMC device reserved by previous call to 
*                    MMC_open()
*          carAddr - Address on MMC Card where read starts
*          buffer  - Pointer to buffer where data should be stored
*          length  - number of bytes to transfer.
***************************************************************************/

int MMC_read(MMC_Handle mmc, Uint32 cardAddr, Uint16 *buffer, Uint32 length){
  Uint16 old_intm;
  Uint16 noWords;
  Uint16 ready;
  Uint16 error;
  Uint16 done;
  Uint16 crd;
  Uint32 lastAddr;
  ioport MMC_MmcRegObj *regs;

  MMC_ASSERT_HANDLE(mmc, return);

  old_intm = IRQ_globalDisable();

  noWords = length/2;
  lastAddr = cardAddr;
  error = 0;
  done = 0;
  crd = mmc->currentCard;

  regs = mmc->mmcRegs;
  regs->mmcblen = length;
  regs->mmcnblk = 1;


  // Clear out response registers

  MMC_clearResponse(mmc);

  // Format and send command
  
  if (MMC_FGET_H(mmc,MMCCTL,SPIEN)) {
  MMC_FSET_H(mmc,MMCCTL,CSEN,1);  //select card
  }

  regs->mmcargh = (Uint16)((cardAddr >> 16)& 0xFFFFu);
  regs->mmcargl = (Uint16)(cardAddr & 0xFFFFu);
  
  if (!(MMC_FGET_H(mmc,MMCCTL,SPIEN))) {
  regs->mmccmd = MMC_READ_SINGLE_BLOCK|0xA000;  //send command
  }
  
  else {
  regs->mmccmd = MMC_READ_SINGLE_BLOCK|0xE000;  // if spimode, add 80 init cycles
  }

  IRQ_globalRestore(old_intm);

 // Make sure command was accepted and card is ready 
    // Waiting to see if i must do a getStatus command for this

 // Read data

 do {
   do {
     ready = MMC_getStatus(mmc, MMC_ST0_DRRDY);
     error = MMC_getStatus(mmc, MMC_USE_LAST_STATUS | MMC_ST0_CRCRD | MMC_ST0_TOUTRD | MMC_ST0_SPIERR);
     // Checking for early DATDNE
     done  |= MMC_getStatus(mmc, MMC_USE_LAST_STATUS | MMC_ST0_DATDNE);

   }while(  !error && !ready  );
			
   if(ready){				  
     *buffer++ = regs->mmcdrr;
     lastAddr += 2;
   } 
    
			
 }while( !error && --noWords );  
      
 // Test to make sure that we see a DATDNE signal  
 if( (error == 0) && (done == 0) ) {
    MMC_waitForFlag(mmc,MMC_ST0_DATDNE | MMC_ST0_TOUTRD);
    error = mmc->status & MMC_ST0_TOUTRD;
 }  

 mmc->cards[crd].lastAddrRead = lastAddr;
 
 if (MMC_FGET_H(mmc,MMCCTL,SPIEN)) {
 MMC_FSET_H(mmc,MMCCTL,CSEN,0);
 }
 			      
 // Check for errors.
 return( error == 0 ? 0 : -1 );
}
#endif

  

⌨️ 快捷键说明

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