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