找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3925|回復(fù): 8
收起左側(cè)

單片機(jī)驅(qū)動(dòng)SD卡初始化失敗,一直卡在CMD0寫(xiě)入失敗 求解

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 25 黑幣 回復(fù)本帖可獲得 5 黑幣獎(jiǎng)勵(lì)! 每人限 1 次(中獎(jiǎng)概率 50%)
ID:743654 發(fā)表于 2020-11-3 17:08 | 顯示全部樓層 |閱讀模式
本帖最后由 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ō)明初始化操作成功
}



SD卡讀寫(xiě) 程序.docx

16.9 KB, 下載次數(shù): 13

回復(fù)

使用道具 舉報(bào)

ID:743654 發(fā)表于 2020-11-4 16:56 | 顯示全部樓層
沒(méi)人回答么,自己頂以下
回復(fù)

使用道具 舉報(bào)

ID:743654 發(fā)表于 2020-11-5 13:45 | 顯示全部樓層
寫(xiě)入CMD0,返回值是FF,收不到回應(yīng)0x01,是什么原因呢,哪位大神有成功驅(qū)動(dòng)過(guò)SD卡的幫忙指導(dǎo)一下
回復(fù)

使用道具 舉報(bào)

ID:487909 發(fā)表于 2021-5-10 11:40 | 顯示全部樓層
sd卡cmd0寫(xiě)入失敗的問(wèn)題解決了嗎
回復(fù)

使用道具 舉報(bào)

ID:1039438 發(fā)表于 2023-3-2 14:31 | 顯示全部樓層
cheney03 發(fā)表于 2020-11-5 13:45
寫(xiě)入CMD0,返回值是FF,收不到回應(yīng)0x01,是什么原因呢,哪位大神有成功驅(qū)動(dòng)過(guò)SD卡的幫忙指導(dǎo)一下

我的回復(fù)也是0xff,更換硬件線(xiàn)路和mcu頻率都無(wú)效果,
回復(fù)

使用道具 舉報(bào)

ID:1039438 發(fā)表于 2023-3-2 14:33 | 顯示全部樓層
unsigned char pcmd[] = {0x40,0x00,0x00,0x00,0x00,0x95};
我在別的程序中看到CMD0不是這樣的,
MCU_write_SD_command(0x00,0x00000000,0x95);//發(fā)送命令0將MMC置于SPI模式
回復(fù)

使用道具 舉報(bào)

ID:139866 發(fā)表于 2023-3-2 14:52 | 顯示全部樓層
直接上示波器或者邏輯分析儀抓波形,比你在這問(wèn)快得多
回復(fù)

使用道具 舉報(bào)

ID:79094 發(fā)表于 2024-5-5 21:41 | 顯示全部樓層
我 cmd0 可以過(guò)  但是 cmd1  sd卡是過(guò)不了的   那是mmc卡 的代碼  剛找到原因
回復(fù)

使用道具 舉報(bào)

ID:878800 發(fā)表于 2024-5-6 08:52 | 顯示全部樓層
有沒(méi)有發(fā)現(xiàn)你的延時(shí)程序 int  time    整型數(shù)據(jù)  只有8位    256最大   哪來(lái)的1000 。想要1000的延時(shí)  只能做嵌套循環(huán)實(shí)現(xiàn)1000 。用C來(lái)寫(xiě)延時(shí)程序不是很準(zhǔn)。最好還是上指令集吧,算周期的時(shí)間是最準(zhǔn)確的。實(shí)在不行,那就只能單獨(dú)編譯延時(shí)程序,模跑一下,看時(shí)間咯。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表