int Chk_SD_OCR(void) { int i; //-- Negotiate operating condition for SD, it makes card ready state for(i=0;i<50;i++) //If this time is short, init. can be fail. { CMD55(); // Make ACMD rSDICARG=0xff8000; //ACMD41(SD OCR:2.7V~3.6V) // rSDICARG=0xffc000; //ACMD41(MMC OCR:2.6V~3.6V) rSDICCON=(0x1<<9)|(0x1<<8)|0x69;//sht_resp, wait_resp, start, ACMD41 //-- Check end of ACMD41 if( Chk_CMDend(41, 1) & rSDIRSP0==0x80ff8000 ) { rSDICSTA=0xa00; // Clear cmd_end(with rsp) return 1; // Success } Delay(200); // Wait Card power up status } //Uart_Printf("SDIRSP0=0x%x\n",rSDIRSP0); rSDICSTA=0xa00; // Clear cmd_end(with rsp) return 0; // Fail }
void SetBus(void) { SET_BUS: CMD55(); // Make ACMD //-- CMD6 implement rSDICARG=Wide<<1; //Wide 0: 1bit, 1: 4bit rSDICCON=(0x1<<9)|(0x1<<8)|0x46; //sht_resp, wait_resp, start, CMD55 if(!Chk_CMDend(6, 1)) // ACMD6 goto SET_BUS; rSDICSTA=0xa00; // Clear cmd_end(with rsp) }
void SetBus(void) { do { CMD55(); // Make ACMD //-- CMD6 implement SDICARG = Wide << 1; //Wide 0: 1bit, 1: 4bit SDICCON = (0x1 << 9) | (0x1 << 8) | (MAGIC_NUMBER | 6); //sht_resp, wait_resp, start, CMD55 if (!Chk_CMDend(6, 1)) // ACMD6 continue; SDICSTA = 0xa00; // Clear cmd_end(with rsp) } while (0); }