基于AT89C52單片機(jī)的SD卡的讀寫設(shè)計(jì)
{ CLK=0;
DataI=0; // write
if(val0x80) DataI=1;
val=1;
CLK=1;
if(DataO)val|=1; // read
}
CLK=0;
return val;
}
SD卡的初始化
對SD卡進(jìn)行操作首先要對SD卡進(jìn)行初始化,初始化的過程中設(shè)置SD卡工作在SPI模式,其流程圖如圖3所示。
在復(fù)位成功之后可以通過CMD55和ACMD41判斷當(dāng)前電壓是否在工作范圍內(nèi)。主機(jī)還可以繼續(xù)通過CMD10讀取SD卡的CID寄存器,通過CMD16設(shè)置數(shù)據(jù)Block長度,通過CMD9讀取卡的CSD寄存器。從CSD寄存器中,主機(jī)可獲知卡容量,支持的命令集等重要參數(shù)。SD卡初始化的C語言程序如下:
unsigned char SD_Init(void)
{ unsigned char retry,temp;
unsigned char i;
for (i=0;i0x0f;i++)
{ SPI_TransferByte(0xff); //延遲74個(gè)以上的時(shí)鐘
}
SD_Enable(); //開片選
SPI_TransferByte(SD_RESET); //發(fā)送復(fù)位命令
SPI_TransferByte(0x00);
SPI_TransferByte(0x00);
SPI_TransferByte(0x00);
SPI_TransferByte(0x00);
SPI_TransferByte(0x95);
SPI_TransferByte(0xff);
SPI_TransferByte(0xff);
retry=0;
do{ temp=Write_Command_SD(SD_INIT,0);
//發(fā)送初始化命令
retry++;
if(retry==100) //重試100次
{SD_Disable(); //關(guān)片選
return(INIT_CMD1_ERROR);
//如果重試100次失敗返回錯(cuò)誤號
}
}while(temp!=0);
SD_Disable(); //關(guān)片選
return(TRUE); //返回成功
}
評論