您的位置:首页 > 其它

SD调试笔记

2012-03-05 18:41 155 查看
SD调试笔记

捣鼓了好久的SD卡,遇见很多问题,怕以后忘记,记一下吧,省的下次抓耳挠腮的。

SD卡的操作分为SDIO和SPI两种,我用的是前者,据说后者更稳定,但是速度慢,没试过。默认方式时SDIO的,要想进入SPI方式需要在CS引脚低电平时发送复位信号。

程序是下载的官方的例程,在网上搜STM32+SDIO+FAT就能搜到,但是这个程序没跑成功,原因是:

1、 时钟 SD卡的时钟是比较难伺候的,STM32有专门的时钟,要自己配置,最大是48M,在操作过程中我们要关心的是两个时钟一个是卡的初始化时钟,与SDIO_INIT_CLK_DIV有关,在400k以内,另一个就是传输的时钟,与SDIO_TRANSFER_CLK_DIV,这个不能超过24M,有时与卡本身有关,调试时多试验几次。

2、 在SD_Error SD_PowerON(void)函数中,发送复位SD卡命令后,要加入74个时钟延时,这个是协议中要求的,64+10,是啥记不得了。

3、 复位引脚设置 这个不知道大家遇到没有,在引脚初始化时这样写 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12设置复用不成功,呵呵,我也不知道怎么回事,就单独写可以

4、 还有人说在wuFindSCR函数中SDIO_DataConfig之后加入一段延时,以便SD卡处理,这个我没加也调试通过了,据说和卡有关,我大概比较幸运吧。

卡的初始化貌似是没错了,文件系统这遇到几个让人头疼的问题:

1、 在调用f_opendir后返回错误,返回没有文件系统,主要原因有(1)卡没有被初始化,格式化下就好了,格式化函数如下:

void format(void)

{

f_mount(0, &fs);

if(f_mkfs(0,0,512)!=FR_OK)

while(1);

}

还有个函数要改

DRESULT disk_ioctl (BYTE Drive,BYTE Command, void* Buffer )

{

int32u x,y,z;

switch(Drive)

{

case 0: /* 读片上 Flash */

{

switch(Command)

{

case CTRL_SYNC:

return RES_OK;

case GET_SECTOR_SIZE:

*(DWORD*)Buffer = 512;

return RES_OK;

case GET_SECTOR_COUNT:

// wvSD_GetCardInfo(&cardinfo);

// x=SDeviceSize+1; //C_SIZE + 1

// y=SDeviceSizeMul+2; //C_SIZE_MULT+2

// z=SdRdBlockLen+y;

// *(DWORD*)Buffer =(x<<z)/512;

*(DWORD*)Buffer =(0x75e00000)/512;

return RES_OK;

case GET_BLOCK_SIZE:

*(WORD*)Buffer = 0x0400;

return RES_OK;

case CTRL_ERASE_SECTOR:

return RES_OK;

default:

return RES_PARERR;

}

}

case 1: /* 读外部 NAND FLASH */

return RES_NOTRDY;

default:

return RES_PARERR;

}

}

格式化有点慢,但是好用,试过了。有的新卡还会在check_fs时返回1,并且finfo_fattrib为unArctive.(2)第二个返回没有文件系统的原因是速度,就是时钟太高,试着降低一下(3)有时硬件有问题也会这样,检查引脚接线,上拉电阻等。

2、 在调试中还出现程序卡在wuFindSCR中的死循环里了,程序可以获得正确的CSD,CID,就是往下执行不了,最终修改硬件就好了,这个我还没问明白,大概是通信不稳定。

程序只是调通了,但是有些东西我还没弄懂,出现新的问题还是会措手不及,大家如果有这方面的建议提一下哦,拜托啦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: