📄 sdi.c
字号:
{
Wide=1;
SET_BUSWIDTH();
printf("\n****4bit bus****\n");
}
void Set_4bit_bus_MoviNand(void)
{
Wide=1;
SET_BUSWIDTH_MoviNand();
printf("\n****4bit bus****\n");
}
void SET_BUSWIDTH(void)
{
SDIO_Command((RCA<<16), 55, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);//befoe using ACMD
while((Check_CMDend(55, 1) !=1))
{
SDIO_Command((RCA<<16), 55, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);//befoe using ACMD
}
SDIO_Command((Wide<<1), 6, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);//ACMD6 select bus width
while((Check_CMDend(6, 1) !=1))
SDIO_Command((Wide<<1), 6, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);//ACMD6 select bus width
rSDICSTA |= CMD_END|RESP_END;
}
void SET_BUSWIDTH_MoviNand(void)
{
int uArg;
uArg=((3<<24)|(183<<16)|(1<<8));
SDIO_Command(uArg, 6, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);//ACMD6 select bus width
while((Check_CMDend(6, 1) !=1))
SDIO_Command(uArg, 6, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);//ACMD6 select bus width
rSDICSTA |= CMD_END|RESP_END;
}
void CARD_SEL_DESEL(U8 sel_desel)
{
printf("\nCMD7 : Command toggles a card between the stand-by and transfer state\n");
if(sel_desel)
{
printf("\nCMD7 : Select\n");
SDIO_Command((RCA<<16), 7, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
if((Check_CMDend(7, 1) !=1)||(rSDIRSP0 != 0x800))//entering the standby mode
SDIO_Command((RCA<<16), 7, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
rSDICSTA |=CMD_END|RESP_END;
printf("\nEntered to the Transfer state\n");
}
else
{
printf("\nCMD7 : Deselect\n");
SDIO_Command((RCA<<16), 7, SDIO_NO_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
if((Check_CMDend(7, 0) !=1))
SDIO_Command((RCA<<16), 7, SDIO_NO_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
rSDICSTA |= CMD_END;
printf("\nEntered to the Stand-by State\n");
}
}
void SDIO_PrescalerSetting(U32 BaudRate)
{
rSDIPRE = (PCLK/BaudRate) - 1;
}
void SDIO_Command(U32 CmdArg, U32 Command, U32 WaitResp, U32 LongResp, U32 WithData)
{
U32 CmdIndex;
rSDICARG = rSDICARG & ~(0xffffffff) | CmdArg;
CmdIndex = Command | 0x40;
rSDICCON = (WithData<<11)|(LongResp<<10)|(WaitResp<<9)|(CmdIndex);
//Command Start
rSDICCON |= (1<<8);
}
void SDIO_BlockSizeSetting(U32 Size)
{
rSDIBSIZE = (Size & 0xFFF);
}
void SDIO_TypeSetting(U32 ClkType, U32 ByteType)
{
if(ClkType == SDIO_SD_TYPE)
rSDICON &= ~CLOCK_TYPE;
else if(ClkType == SDIO_MMC_TYPE)
rSDICON |= CLOCK_TYPE;
if(ByteType == SDIO_TYPE_A)
rSDICON &= ~BYTE_ORDER;
else if(ByteType == SDIO_TYPE_B)
rSDICON |= BYTE_ORDER;
}
#if 1
int Check_CMDend(int cmd, int be_resp)
//0: Timeout
{
int finish0;
if(!be_resp) // No response
{
finish0=rSDICSTA;
while((finish0&CMD_END)!=CMD_END) // Check cmd end
finish0=rSDICSTA;
rSDICSTA=finish0;// Clear cmd end state
return 1;
}
else // With response
{
finish0=rSDICSTA;
while( !( ((finish0&RESP_END)==RESP_END) | ((finish0&CMD_TOUT)==CMD_TOUT) )) // Check cmd/rsp end
finish0=rSDICSTA;
if(cmd==1 | cmd==41) // CRC no check, CMD9 is a long Resp. command.
{
if( (finish0&0xf00) != CMD_END|RESP_END ) // Check error
{
rSDICSTA=finish0; // Clear error state
if(((finish0&CMD_TOUT)==CMD_TOUT))
return 0; // Timeout error
}
rSDICSTA=finish0; // Clear cmd & rsp end state
}
else // CRC check
{
if( (finish0&0x1f00) != CMD_END|RESP_END) // Check error
{
//printf("CMD%d:rSDICSTA=0x%x, rSDIRSP0=0x%x\n",cmd, rSDICSTA, rSDIRSP0);
rSDICSTA=finish0; // Clear error state
if(((finish0&CMD_TOUT)==CMD_TOUT))
return 0; // Timeout error
}
rSDICSTA=finish0;
}
return 1;
}
}
#else
int Check_CMDend(int cmd, int be_resp)
//0: Timeout
{
int finish0;
if(!be_resp) // No response
{
finish0=rSDICSTA;
while((finish0&0x800)!=0x800) // Check cmd end
finish0=rSDICSTA;
rSDICSTA=finish0;// Clear cmd end state
return 1;
}
else // With response
{
finish0=rSDICSTA;
while( !( ((finish0&0x200)==0x200) | ((finish0&0x400)==0x400) )) // Check cmd/rsp end
finish0=rSDICSTA;
if(cmd==1 | cmd==41) // CRC no check, CMD9 is a long Resp. command.
{
if( (finish0&0xf00) != 0xa00 ) // Check error
{
rSDICSTA=finish0; // Clear error state
if(((finish0&0x400)==0x400))
return 0; // Timeout error
}
rSDICSTA=finish0; // Clear cmd & rsp end state
}
else // CRC check
{
if( (finish0&0x1f00) != 0xa00 ) // Check error
{
printf("CMD%d:rSDICSTA=0x%x, rSDIRSP0=0x%x\n",cmd, rSDICSTA, rSDIRSP0);
rSDICSTA=finish0; // Clear error state
if(((finish0&0x400)==0x400))
return 0; // Timeout error
}
rSDICSTA=finish0;
}
return 1;
}
}
#endif
int Check_BUSYend(void)
{
int finish;
finish=rSDIDSTA;
//printf("\nBusy end =%x",finish);
while( !( ((finish&0x08)==0x08) | ((finish&0x20)==0x20) ))
finish=rSDIDSTA;
while( (finish&(0x1<<3)) != 0x8 )
{
// printf("\nDATA:finish=0x%x\n", finish);
finish=rSDIDSTA;
//return 0;
}
rSDIDSTA=0xf4; //clear error state
return 1;
}
int Check_MMC_OCR(void)
{
int i;
//-- Negotiate operating condition for MMC, it makes card ready state
for(i=0;i<200;i++) //Negotiation time is dependent on CARD Vendors.
{
SDIO_Command(0xff8000, 1, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
if(Check_CMDend(1, 1) && (rSDIRSP0>>16)==0x80ff) //[31]:Card Power up status bit (busy)
{
//rSDICSTA=0xa00; // Clear cmd_end(with rsp)
rSDICSTA |= CMD_END|RESP_END;
return 1; // Success
}
}
//rSDICSTA=0xa00; // Clear cmd_end(with rsp)
rSDICSTA |= CMD_END|RESP_END;
return 0; // Fail
}
#if 0
int Check_DATend(void)
{
int finish;
finish=rSDIDSTA;
while( !( ((finish&0x10)==0x10) || ((finish&0x20)==0x20) ))// Chek timeout or data end
{
//printf("\nData End Check =%x",finish);
finish=rSDIDSTA;
}
if( (finish &0x10) != 0x10 )
{
//printf("\nDATA:finish=0x%x\n", finish);
rSDIDSTA=finish; // Clear error state
return 0;
}
return 1;
}
#else
int Check_DATend(void)
{
int finish;
finish=rSDIDSTA;
//printf("DATA:finish=0x%x\n", finish);
//printf("DATA end check\n");
while( !((finish&DATA_FINISH)==DATA_FINISH))// Chek timeout or data end
{
//printf("\nData End Check =%x",finish);
finish=rSDIDSTA;
}
if( (finish&0xfc) != DATA_FINISH )
{
//printf("DATA:finish=0x%x\n", finish);
rSDIDSTA=0xec; // Clear error state
return 0;
}
return 1;
}
#endif
int Check_SD_OCR(void)
{
int i,j=0;
//-- Negotiate operating condition for SD, it makes card ready state
for(i=0;i<200;i++) //If this time is short, init. can be fail.
{
SDIO_Command((RCA<<16), 55, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
while(Check_CMDend(55, 1) != 1)
{
printf("\nCommand55 Fail...");
return 0;
}
SDIO_Command(0xff8000, 41, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
if( Check_CMDend(41, 1) & rSDIRSP0==0x80ff8000 )
{
rSDICSTA=0xa00; // Clear cmd_end(with rsp)
return 1; // Success
}
Delay(200); // Wait Card power up status
}
rSDICSTA=0xa00; // Clear cmd_end(with rsp)
return 0; // Fail
}
void __irq DMA_end(void)
{
//printf("\nDMA ISR\n");
rSUBSRCPND |= BIT_SUB_DMA0;
ClearPending(BIT_DMA);
TR_end=1;
}
void __irq Rd_Int(void)
{
U32 i,status;
ClearPending(BIT_SDI0);
rINTMSK |= (BIT_SDI0);
status=rSDIFSTA;
if( (status&0x200) == 0x200 ) // Check Last interrupt?
{
for(i=(status & 0x7f)/4;i>0;i--)
{
*Rx_buffer++=rSDIDAT;
rd_cnt++;
}
rSDIFSTA=rSDIFSTA&0x200; //Clear Rx FIFO Last data Ready, YH 040221
}
else if( (status&0x80) == 0x80 ) // Check Half interrupt?
{
for(i=0;i<8;i++)
{
*Rx_buffer++=rSDIDAT;
rd_cnt++;
}
}
rINTMSK &= ~(BIT_SDI0);
}
void __irq Wt_Int(void)
{
ClearPending(BIT_SDI0);
rINTMSK |= (BIT_SDI0);
rSDIDAT=*Tx_buffer++;
wt_cnt++;
if(wt_cnt==128*BlockNum)
{
rINTMSK |= BIT_SDI0;
rSDIDAT=*Tx_buffer;
TR_end=1;
}
rINTMSK &= ~(BIT_SDI0);
}
void CalculationBPS_NORMALSD_MMC(int Time)
{
float x=0;
int y=0;
float bps=0;
x = (float)((float)1000000/(float)Time); //Unit is usec
y = (BlockNum+1) * 512 * 8;
bps = x*(float)y;
printf("\n\n\nTransfer Time = %dusec",Time);
printf("\nTransferSize = %dKByte",y/(8*1024));
printf("\nBPS = %fMByte/sec\n\n",bps/(1000000*8));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -