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

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值