加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SD调试笔记

发布时间:2020-12-15 06:20:36 所属栏目:百科 来源:网络整理
导读:? ??????????????????????????????????????????????????????????????????????????????????????????????????? SD调试笔记 捣鼓了好久的SD卡,遇见很多问题,怕以后忘记,记一下吧,省的下次抓耳挠腮的。 ?????? SD卡的操作分为SDIO和SPI两种,我用的是前者,
?

??????????????????????????????????????????????????????????????????????????????????????????????????? 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,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,就是往下执行不了,最终修改硬件就好了,这个我还没问明白,大概是通信不稳定。

?????????? 程序只是调通了,但是有些东西我还没弄懂,出现新的问题还是会措手不及,大家如果有这方面的建议提一下哦,拜托啦!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读