SD调试笔记
?
??????????????????????????????????????????????????????????????????????????????????????????????????? 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,就是往下执行不了,最终修改硬件就好了,这个我还没问明白,大概是通信不稳定。 ?????????? 程序只是调通了,但是有些东西我还没弄懂,出现新的问题还是会措手不及,大家如果有这方面的建议提一下哦,拜托啦!(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |