📄 sd.c
字号:
//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 + -