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,就是往下执行不了,最终修改硬件就好了,这个我还没问明白,大概是通信不稳定。
程序只是调通了,但是有些东西我还没弄懂,出现新的问题还是会措手不及,大家如果有这方面的建议提一下哦,拜托啦!
捣鼓了好久的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,就是往下执行不了,最终修改硬件就好了,这个我还没问明白,大概是通信不稳定。
程序只是调通了,但是有些东西我还没弄懂,出现新的问题还是会措手不及,大家如果有这方面的建议提一下哦,拜托啦!
相关文章推荐
- IOS开发学习笔记(九)——iOS App开发阶段调试步骤
- [RK3288][Android6.0] 调试笔记 --- 系统Dump Callstack方法
- Direct2D 1.1 开发笔记 特效篇(四) 图形调试
- [RK3288][Android6.0] 调试笔记 --- 关闭音频播放停止后进入Standby功能
- LED字符设备驱动调试笔记
- 自动抄表系统web版技术笔记 ---环境安装调试篇
- 读peter 文章调试笔记
- Struts2权威指南(完整版)含源码[Zone Yan.]-调试19.4示例笔记
- Dynamic CRM 2013学习笔记(二十三)CRM JS智能提示(CRM 相关的方法、属性以及页面字段),及发布前调试
- Nsight调试笔记
- SD卡FAT32文件系统调试笔记
- 软件调试笔记49 - 异常处理代码的编译
- 聊聊自己最近调试的笔记以及想法
- OV9650----摄像头调试笔记之一:硬件调试
- Android调试笔记
- 真机调试时 无法在sdcard创建文件夹 或者push文件时没有权限
- FireBug调试工具笔记
- Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
- Apache Tez 0.7、0.83、 0.82 安装、调试笔记
- IAR调试S3C6410的笔记(三)