|
本帖最后由 cheney03 于 2020-11-4 11:11 編輯
最近在調(diào)試SD卡時(shí),初始化時(shí)一直卡在CMD0寫(xiě)入失敗 。SD卡從128M/256M/512/1G/2G都試過(guò),SD卡讀寫(xiě)模塊也試了幾個(gè),不知道什么原因。還有一個(gè)問(wèn)題,在初始化時(shí)速度不能高于400KHz,這個(gè)速度怎么計(jì)算?下面是我的延時(shí)函數(shù)和復(fù)位初始化過(guò)程。
單片機(jī)型號(hào):STC89C52RC,晶振:11.0592MHz
void delay(unsigned int time) //time取1000
{
while(time--);
}
******************************************************************
- 功能描述:復(fù)位SD卡,用到CMD0,使用SD卡切換到SPI模式
- 隸屬模塊:SD/SDHC模塊
- 函數(shù)屬性:內(nèi)部
- 參數(shù)說(shuō)明:SD卡的命令是6個(gè)字節(jié),pcmd是指向命令字節(jié)序列的指針
- 返回說(shuō)明:調(diào)用成功,返回0x00,否則返回INIT_CMD0_ERROR (sdx.h中有定義)
******************************************************************/
unsigned char SD_Reset()
{
unsigned char time,temp,i;
unsigned char pcmd[] = {0x40,0x00,0x00,0x00,0x00,0x95};
is_init=1; //is_init置為1,讓SPI速度慢下來(lái)
SD_CS=1;
for(i=0;i<0x0f;i++) //初始時(shí),首先要發(fā)送最少74個(gè)時(shí)鐘信號(hào),這是必須的。!
{
SD_spi_write(0xff); //120個(gè)時(shí)鐘
}
SD_CS=0;
time=0;
do
{
temp=SD_Write_Cmd(pcmd);//寫(xiě)入CMD0
time++;
if(time==TRY_TIME)
{
return(INIT_CMD0_ERROR);//CMD0寫(xiě)入失敗
}
}while(temp!=0x01);
SD_CS=1;
SD_spi_write(0xff); //按照SD卡的操作時(shí)序在這里補(bǔ)8個(gè)時(shí)鐘
Beep=0;
return 0;//返回0,說(shuō)明復(fù)位操作成功
}
/******************************************************************
- 功能描述:初始化SD卡,使用CMD1
- 隸屬模塊:SD/SDHC模塊
- 函數(shù)屬性:內(nèi)部
- 參數(shù)說(shuō)明:無(wú)
- 返回說(shuō)明:調(diào)用成功,返回0x00,否則返回INIT_CMD1_ERROR (sd.h中有定義)
******************************************************************/
unsigned char SD_Init()
{
unsigned char time,temp;
unsigned char pcmd[] = {0x41,0x40,0x00,0x00,0x00,0xff};//第2個(gè)字節(jié)為0x40 HCS置位,說(shuō)明主機(jī)支持高容量卡
SD_CS=0;
time=0;
do
{
temp=SD_Write_Cmd(pcmd);
time++;
if(time==TRY_TIME)
{
return(INIT_CMD1_ERROR);//CMD1寫(xiě)入失敗
}
}while(temp!=0);
is_init=0; //初始化完畢,將is_init設(shè)置為0,為了提高以后的數(shù)據(jù)傳輸速度
SD_CS=1; //關(guān)閉SD卡的片選
SD_spi_write(0xff); //按照SD卡的操作時(shí)序在這里補(bǔ)8個(gè)時(shí)鐘
Beep=0;
return(0); //返回0,說(shuō)明初始化操作成功
}
|
|