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

📄 sd.c

📁 mp3播放器
💻 C
📖 第 1 页 / 共 4 页
字号:
         //return KO;
         status = KO;
         break;
      }
   }
   STATUS07_00 = 0xFF;
   //return OK;
   return status;
}
/************************************************
函 数 名: SDCIF_CMD08()
功    能:Sends SD Memory Card interface condition
说    明:
调    用:
全局变量:RCA
入口参数:无
出口参数:无
返 回 值:OK or KO
************************************************/
Bool SDCIF_CMD08( void )
{
   Bool status = OK;
   SDVar.Info.CardVer2 = 1;  // SD card version 2.0 for OCR
   ARG31_24 = 0x00;
   ARG23_16 = 0x00;
   ARG15_08 = 0x01;  //Vlotage Supplied 2.7-3.6V
   ARG07_00 = 0xAA;  //check pattern
   CMDCON = 0x02;
   CMDINDEX = SEND_IF_COND;
   
   while( !( STATUS07_00 & CMDSEND )); //Command transfer completely
   while( !( STATUS07_00 & RSPRXVP )
   {
      //if( STATUS07_00 & RSPTIMEOUT )
      if( STATUS07_00 &( RSPTIMEOUT | CRC7ERROR ))
      {
         status = KO;
         SDVar.Info.CardVer2 = 0;  // SD 1.1
         break;
      }
      /*if( STATUS07_00 & CRC7ERROR )
      {
         status = KO;
         SDVar.Info.CardVer2 = 0;  // SD 1.1
         //SYSDelay();  // for MMC Mason@1020 --> Must
         break;
      }*/
   }
   SDVar.SResp[ 0 ] = RESP119_112;
   SDVar.SResp[ 1 ] = RREP111_104;
   SDVar.SResp[ 2 ] = RREP103_096;
   SDVar.SResp[ 3 ] = RREP095_088;
   
   STATUS07_00 = 0xFF;
   return status;
}
/************************************************
函 数 名: SDCIF_CMD09()
功    能:Addressed card sends its card-specific data (CSD) on the CMD line
说    明:
调    用:
全局变量:RCA
入口参数:无
出口参数:无
返 回 值:OK or KO
************************************************/
Bool SDCIF_CMD09( void )
{
   //Byte tmp;
   Bool status = OK;
   idata U8 deleycnt;
	
   ARG31_24 = SDVar.RCA[ 1 ];//argument = RCA, form CMD3
   ARG23_16 = SDVar.RCA[ 0 ];
   ARG15_08 = 0;//argument dont't care
   ARG07_00 = 0;
   CMDCON = LONGRSP | WAITRSP;
   CMDINDEX = SEND_CSD;
   while( !( STATUS07_00 & CMDSEND ));
   while( !( STATUS07_00 & RSPRXVP ))
   {
      /*if(( STATUS07_00 & RSPTIMEOUT )
         ||( STATUS07_00 & CRC7ERROR ))*/
      if( STATUS07_00 & RSPTIMEOUT )
      {
         //STATUS07_00 = 0xFF;
         //return KO;
         status = KO;
         break;
      }
      if( STATUS07_00 & CRC7ERROR )
      {
         for( deleycnt = 0; deleycnt < 0xF0; deleycnt++ );  // for MMC Mason@1020 --> Must
         status = KO;
         break;
      }
   }
   STATUS07_00 = 0xFF;
/*
   (( Byte *)&sd_mem_size )[ 0 ] = 0;
   (( Byte *)&sd_mem_size )[ 1 ] = 0;
   (( Byte *)&sd_mem_size )[ 2 ] = RREP079_072 & CSD_MSK_CSH;
   (( Byte *)&sd_mem_size )[ 3 ] = RREP071_064;
   sd_mem_size <<= 2;
   (( Byte *)&sd_mem_size)[ 3 ] |= ( RREP063_056 & CSD_MSK_CSL )>> 6;
   // read C_SIZE_MULT
   tmp = RREP055_048 << 1;
   tmp = ( tmp |( RREP047_040 >> 7 ))& CSD_MSK_CSM;

   sd_mem_size = (( sd_mem_size + 1 )<<( tmp + 2 ));
   sd_mem_size--;
*/
   //return OK;
   return status;
}
/************************************************
函 数 名: SDCIF_CMD10()
功    能:Addressed card sends its card identification (CID) on the CMD line
说    明:
调    用:
全局变量:RCA
入口参数:无
出口参数:无
返 回 值:无
************************************************/
#if 0
Bool SDCIF_CMD10( void )
{
   Bool status = OK;
   
   ARG31_24 = SDVar.RCA[ 1 ]; //argument = RCA, form CMD3
   ARG23_16 = SDVar.RCA[ 0 ];
   //ARG15_08 = 0;   //argument dont't care
   //ARG07_00 = 0;
   CMDCON = LONGRSP | WAITRSP;
   CMDINDEX = SEND_CID;
   while( !( STATUS07_00 & CMDSEND ));
   while( !( STATUS07_00 & RSPRXVP ))
   {
      /*if(( STATUS07_00 & RSPTIMEOUT )
         ||( STATUS07_00 & CRC7ERROR ))*/
      if( STATUS07_00 &( RSPTIMEOUT | CRC7ERROR ))
      {
         status = KO;
         //SYSDelay();
         break;
      }
   }
   STATUS07_00 = 0xFF;
   return status;
}
#endif
/************************************************
函 数 名: SDCIF_CMD12()
功    能:Terminates a multiple block read/write operation
说    明:
调    用:
全局变量:
入口参数:无
出口参数:无
返 回 值:无
************************************************/
Bool SDCIF_CMD12( void )
{
   Bool status = OK;
   
   //argument dont't care
   //ARG31_24 = SDVar.RCA[ 1 ];
   //ARG23_16 = SDVar.RCA[ 0 ];
   //ARG15_08 = 0;
   //ARG07_00 = 0;
  
   CMDCON = STOP | WAITRSP;
   CMDINDEX = STOP_TRANSMISSION;
   while( !( STATUS07_00 & CMDSEND ));
   while( !( STATUS07_00 & RSPRXVP ))
   {
      /*if(( STATUS07_00 & RSPTIMEOUT )
         ||( STATUS07_00 & CRC7ERROR ))*/
      if( STATUS07_00 &( RSPTIMEOUT | CRC7ERROR ))
      {
         //STATUS07_00 = 0xFF;
         //return KO;
         status = KO;
         break;
      }
   }
   STATUS07_00 = 0xFF;
   STATUS15_08 = BUSYEND;
   //return OK;
   return status;
}
/************************************************
函 数 名: SDCIF_CMD13()
功    能:Addressed card sends its status register
说    明:
调    用:
全局变量:RCA
入口参数:无
出口参数:无
返 回 值:无
************************************************/
Bool SDCIF_CMD13_CHKRDY( void )
{
   Bool status = OK;

   ARG31_24 = SDVar.RCA[ 1 ]; //argument = RCA, form CMD3
   ARG23_16 = SDVar.RCA[ 0 ];
   ARG15_08 = 0;   //argument dont't care
   ARG07_00 = 0;
   CMDCON = WAITRSP;
   CMDINDEX = SEND_STATUS;
   while( !( STATUS07_00 & CMDSEND ));
   while( !( STATUS07_00 & RSPRXVP ))
   {
      /*if(( STATUS07_00 & RSPTIMEOUT )
         ||( STATUS07_00 & CRC7ERROR ))*/
      if( STATUS07_00 &( RSPTIMEOUT | CRC7ERROR ))
      {
         //STATUS07_00 = 0xFF;
         //STATUS15_08 = 0x03;
         //return KO;
         status = KO;
         break;
      }
   }
   STATUS07_00 = 0xFF;
   STATUS15_08 = BUSYEND;//0x03;
   //return OK;

   SDVar.CardStatus[ 1 ] = RREP103_096;
   SDVar.CardStatus[ 1 ] &= 0x1E;   // decode 12~9 bits
   SDVar.CardStatus[ 1 ] >>= 1;
   if( SDVar.CardStatus[ 1 ] != CIF_TRANS )
      status = KO;

   /*if((( RREP103_096 & 0x1E )>> 1 )!= CIF_TRANS )
      status = KO;*/
   return status;
}
/************************************************
函 数 名: SDCIF_CMD16()
功    能:Selects a block length (in bytes) for all following block commands (read and write)
说    明:
调    用:
全局变量:ErrVal, SD_lba(FlashAddr[3:0])
入口参数:无
出口参数:无
返 回 值:无
************************************************/
#if 0
Bool SDCIF_CMD16( void )
{
   Bool satus = OK;
   
   ARG31_24 = SDVar.FlashAddr[ 0 ]; //argument = SD_lba(FlashAddr[3:0])	= block length
   ARG23_16 = SDVar.FlashAddr[ 1 ];
   ARG15_08 = SDVar.FlashAddr[ 2 ];
   ARG07_00 = SDVar.FlashAddr[ 3 ];
   CMDCON = WAITRSP;
   CMDINDEX = SET_BLOCKLEN;
   while( !( STATUS07_00 & CMDSEND ));
   while( !(STATUS07_00 & RSPRXVP ))
   {
      /*if(( STATUS07_00 & RSPTIMEOUT )
         ||( STATUS07_00 & CRC7ERROR ))*/
      if( STATUS07_00 &( RSPTIMEOUT | CRC7ERROR ))
      {
         status = KO;
         //STATUS07_00 = 0xFF;
         //return;
         break;
      }
   }
   STATUS07_00 = 0xFF;
   return status;
}
#endif
/************************************************
函 数 名: SDCIF_CMD17()
功    能:Reads a block of the size selected by the SET_BLOCKLEN command
说    明:数据存放地址由SDH_DMA_CS决定
调    用:
全局变量:SD_lba(FlashAddr[3:0])
入口参数:无
出口参数:无
返 回 值:OK or KO
************************************************/
//读单块
Bool SDCIF_CMD17( void )
{
   Bool status = OK;
   
   BLKLEN11_08 = 0x02;  //SET_BLOCKLEN
   BLKLEN07_00 = 0x00;
   DATACON = XFER_MODE_0;  //block read
   ARG31_24 = SDVar.FlashAddr[ 0 ]; //argument = SD_lba(FlashAddr[3:0])
   ARG23_16 = SDVar.FlashAddr[ 1 ];
   ARG15_08 = SDVar.FlashAddr[ 2 ];
   ARG07_00 = SDVar.FlashAddr[ 3 ];
   CMDCON = WAITRSP | DATA_WITH;
   CMDINDEX = READ_SINGLE_BLOCK;
   while( !( STATUS07_00 & CMDSEND ));
   while( !( STATUS07_00 & RSPRXVP ))
   {
      /*if(( STATUS07_00 & RSPTIMEOUT )
         ||( STATUS07_00 & CRC7ERROR ))*/
      if( STATUS07_00 &( RSPTIMEOUT | CRC7ERROR ))
      {
         //STATUS07_00 = 0xFF;
         //STATUS15_08 = 0x03;
         //return KO;
         status = KO;
         break;
      }
   }
   //SDH_DMA_ACK &= ~DMA_ACK_F;

   while( !( STATUS07_00 & XFEREND ))
   {
      /*if(( STATUS07_00 & DTIMEOUT )
         ||( STATUS07_00 & CRC16ERROR ))*/
      if( STATUS07_00 &( DTIMEOUT | CRC16ERROR ))
      {
         //STATUS07_00 = 0xFF;
         //STATUS15_08 = 0x03;
         //return KO;
         status = KO;
         break;
      }
   }
   STATUS07_00 = 0xFF;
   /*STATUS15_08 = BUSYEND;//0x03;

   if( !SDCIF_CMD13_CHKRDY())
      //return KO;
      status = KO;*/
   //return OK;
   return status;
}
/************************************************
函 数 名: SDCIF_CMD18()
功    能:Reads multiple block of the size selected by the SET_BLOCKLEN command
说    明:
调    用:
全局变量:SD_lba(FlashAddr[3:0])
入口参数:无
出口参数:无
返 回 值:OK or KO
************************************************/
#if 0
Bool SDCIF_CMD18( void )
{
   Bool status = OK;
  
   SDCIF_CMD13_CHKRDY();
   // setting how many sector to be read
   BLKCNT11_08 = ( varAl.SDHost_DMA_Cnt >> 8 )& 0x0F;
   BLKCNT07_00 = varAl.SDHost_DMA_Cnt & 0xFF;

   //p->blklen=0x0200;  // 0x200 for 512 Bytes transfer length
   BLKLEN11_08 = 0x02;
   BLKLEN07_00 = 0x00;

   // p->datacon=0x3;   // xfer_mode=0: Block Read, Multi:1 for multi-block read.
   DATACON = CHK_BC | MULTI | XFER_MODE_0;   // xfer_mode=0: Block Read, Multi:1 for multi-block Read,chk_bc:1

   ARG31_24 = SDVar.FlashAddr[ 0 ];
   ARG23_16 = SDVar.FlashAddr[ 1 ];
   ARG15_08 = SDVar.FlashAddr[ 2 ];
   ARG07_00 = SDVar.FlashAddr[ 3 ];
  
   CMDCON = WAITRSP | DATA_WITH; // cmd_con - 0110 - data, short resp
   CMDINDEX = READ_MULTI_BLOCK;  // CMD18
   while( !( STATUS07_00 & CMDSEND ));
   while( !( STATUS07_00 & RSPRXVP ))  //while(!(p->status&BIT0));
   {
      //if( STATUS07_00 & RSPTIMEOUT )
      if( STATUS07_00 &( RSPTIMEOUT | CRC7ERROR ))
      {
         status = KO;
         break;
      }
      /*if( STATUS07_00 & CRC7ERROR )
      {
         status = KO;
         break;
      }*/
   }

   // @0522 
/*
   while( !( STATUS07_00 & BIT7 ))
   {
      if( STATUS07_00 & DTIMEOUT )
      {
         status = KO;
         break;
      } 	
      if( STATUS07_00 & CRC16ERROR )
      {
         status = KO;
         break;              	
      } 	         
   }
*/ 

   // @0522  
   // what follows is much important for SD_CIF in USB mode,Mason@20060303
   //while( !( STATUS15_08 & BUSYEND ));  // not used in single-block write,Mason@20061030
   
   //while( !( STATUS15_08 & BUSYEND ));  // enable it will occur bugs....
   //SDH_DMA_ACK &= ~DMA_ACK_F;
   
   // @0522   STATUS07_00 = 0xFF;
   // @0522   STATUS15_08 = 0x01;
   return status;
}
#endif
/************************************************
函 数 名: SDCIF_CMD24()
功    能:Writes a block of the size selected by the SET_BLOCKLEN command
说    明:数据存放地址由SDH_DMA_CS决定
调    用:
全局变量:SD_lba(FlashAddr[3:0])
入口参数:无
出口参数:无
返 回 值:OK or KO
************************************************/
Bool SDCIF_CMD24( void )
{
   Bool status = OK;
   //U8 tmpbyte;
   
   BLKLEN11_08 = 0x02;  //SET_BLOCKLEN
   BLKLEN07_00 = 0x00;
   DATACON = XFER_MODE_1;  //block write
   ARG31_24 = SDVar.FlashAddr[ 0 ]; //argument = SD_lba(FlashAddr[3:0])
   ARG23_16 = SDVar.FlashAddr[ 1 ];
   ARG15_08 = SDVar.FlashAddr[ 2 ];
   ARG07_00 = SDVar.FlashAddr[ 3 ];
   CMDCON = WAITRSP | DATA_WITH;
   CMDINDEX = WRITE_BLOCK;
   while( !( STATUS07_00 & CMDSEND ));
   while( !( STATUS07_00 & RSPRXVP ))
   {
      /*if(( STATUS07_00 & RSPTIMEOUT )
         ||( STATUS07_00 & CRC7ERROR ))*/
      if( STATUS07_00 &( RSPTIMEOUT | CRC7ERROR ))
      {
         //STATUS07_00 = 0xFF;
         //STATUS15_08 = BUSYEND;
         //return KO;
         status = KO;
         break;
      }
   }
   while( !( STATUS07_00 & XFEREND ))
   {
      /*if(( STATUS07_00 & DTIMEOUT )
         ||( STATUS07_00 & CRC16ERROR ))*/
      if( STATUS07_00 &( DTIMEOUT | CRC16ERROR ))
      {
         //STATUS07_00 = 0xFF;
         //STATUS15_08 = BUSYEND;
         //return KO;
         status = KO;
         break;
      }
   }

   // what follows is much important for SD_CIF in USB mode,Mason@20060303
   while( !( STATUS15_08 & BUSYEND ));
   SDH_DMA_ACK &= ~DMA_ACK_F; //DMA acknowledge flag

   STATUS07_00 = 0xFF;
   STATUS15_08 = BUSYEND;
/*
   do
   {
      if( SDCIF_CMD13())
      {
         //ChkCurrentState();
         //if( SDVar.CardStatus[ 1 ] == CIF_TRANS )
         if((( RREP103_096 & 0X1E )>> 1 )== CIF_TRANS )
         {
            //return OK;
            break;
         }
      }
      else
      {
         for( tmpbyte = 0; tmpbyte < 0x10; tmpbyte++ );  // a delay for next CMD13
      }
  }
  while( 1 );
*/
  return status;
}
/************************************************
函 数 名: SDCIF_CMD25_MakeReady()
功    能:
说    明:
调    用:
全局变量:
入口参数:无
出口参数:无
返 回 值:无
************************************************/
#if 0
Bool SDCIF_CMD25_MakeReady( void )
{
   Bool status = OK;

   SDCIF_CMD13_CHKRDY();
   SDH_DMA_ACK = DMA_AUTO;
    
   // setting how many sector to be written
   BLKCNT11_08 = ( varAl.SDHost_DMA_Cnt >> 8 )& 0x0F;
   BLKCNT07_00 = varAl.SDHost_DMA_Cnt & 0xFF;   // 
  	
   BLKLEN11_08 = 0x02;
   BLKLEN07_00 = 0x00;
  
   DATACON = CHK_BC | MULTI | XFER_MODE_1;   // xfer_mode=01: Block write, Multi:1 for multi-block write,chk_bc:1
   //DATACON = 0x06;
  
   ARG31_24 = SDVar.FlashAddr[ 0 ];
   ARG23_16 = SDVar.FlashAddr[ 1 ];
   ARG15_08 = SDVar.FlashAddr[ 2 ];
   ARG07_00 = SDVar.FlashAddr[ 3 ];
  
   CMDCON  = WAITRSP | DATA_WITH;
/*
   //CMD25 is separated ~
   CMDINDEX = WRITE_MULTIPLE_BLOCK; // CMD25
   while( !( STATUS07_00 & CMDSEND ));
   while( !( STATUS07_00 & RSPRXVP ))  //while(!(p->status&BIT0));
   {

⌨️ 快捷键说明

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