STM32F407使用SPI读写SD TF卡(不能读取 会卡死)
问题描述:
使用spi的TF卡模块,卡为京东联名的32g的HC卡,使用核心板外接模块,发现前面的初始和卡的检验可以通过,但读取不到扇区数,也不能读取扇区0,读取会卡死。核对了软硬件都毫无头绪,同样的代码在另一块407的带sd卡槽的板子上是读写没问题的。
解决:
由于使用的核心板和拓展模块,所以之间使用了不短的杜邦线,所以我怀疑是干扰,而且显然前面400k以下的速率设置和校验是没问题的,所以我怀疑是后面的高速模式才有问题。本着频率越低,越能抗干扰的朴素科学观。修改<400k初始化化之后切换为高速模式,如下位置(倒数第五行的SD_SPI_SpeedHigh();//高速)
u8 SD_Initialize(void)
{u8 r1; // 存放SD卡的返回值u16 retry; // 用来进行超时计数u8 buf[4]; u16 i;SD_SPI_Init(); //初始化IOSD_SPI_SpeedLow(); //设置到低速模式 for(i=0;i<10;i++)SD_SPI_ReadWriteByte(0XFF);//发送最少74个脉冲 一个FF就是大于8个脉冲 这里大于80个脉冲了retry=20;do{r1=SD_SendCmd(CMD0,0,0x95);//进入IDLE状态}while((r1!=0X01) && retry--);SD_Type=0;//默认无卡if(r1==0X01){if(SD_SendCmd(CMD8,0x1AA,0x87)==1)//SD V2.0{for(i=0;i<4;i++)buf[i]=SD_SPI_ReadWriteByte(0XFF); //Get trailing return value of R7 respif(buf[2]==0X01&&buf[3]==0XAA)//卡是否支持2.7~3.6V{retry=0XFFFE;do{SD_SendCmd(CMD55,0,0X01); //发送CMD55r1=SD_SendCmd(CMD41,0x40000000,0X01);//发送CMD41}while(r1&&retry--);if(retry&&SD_SendCmd(CMD58,0,0X01)==0)//鉴别SD2.0卡版本开始{for(i=0;i<4;i++)buf[i]=SD_SPI_ReadWriteByte(0XFF);//得到OCR值if(buf[0]&0x40)SD_Type=SD_TYPE_V2HC; //检查CCSelse SD_Type=SD_TYPE_V2; }}}else//SD V1.x/ MMC V3{SD_SendCmd(CMD55,0,0X01); //发送CMD55r1=SD_SendCmd(CMD41,0,0X01); //发送CMD41if(r1<=1){ SD_Type=SD_TYPE_V1;retry=0XFFFE;do //等待退出IDLE模式{SD_SendCmd(CMD55,0,0X01); //发送CMD55r1=SD_SendCmd(CMD41,0,0X01);//发送CMD41}while(r1&&retry--);}else//MMC卡不支持CMD55+CMD41识别{SD_Type=SD_TYPE_MMC;//MMC V3retry=0XFFFE;do //等待退出IDLE模式{ r1=SD_SendCmd(CMD1,0,0X01);//发送CMD1}while(r1&&retry--); }if(retry==0||SD_SendCmd(CMD16,512,0X01)!=0)SD_Type=SD_TYPE_ERR;//错误的卡}}SD_DisSelect();//取消片选SD_SPI_SpeedHigh();//高速if(SD_Type)return 0;else if(r1)return r1; return 0xaa;//其他错误
}
进入这个函数,修改慢一点,修改为1/4,之前是1/2(SPI_SPEED_2)。
//SD卡正常工作的时候,可以高速了
void SD_SPI_SpeedHigh(void)
{SPI1_SetSpeed(SPI_SPEED_4);//设置到高速模式
}
STM32F407使用SPI读写SD TF卡(不能读取 会卡死)相关推荐
- SD/TF卡驱动(二)--------SD卡程序初始化流程以及读写
说明: ①测试的SD卡为高容量卡,支持SD卡2.0协议,容量为16G ②采用GPIO模拟SPI时序的方式对SD卡进行驱动,很方便移植到没有硬件SPI或者SDIO的MCU,对于这类MCU,只需要将对应的 ...
- STM32利用SPI读写SD卡的程序详解
STM32利用SPI读写SD卡的一些程序详解 关于SD卡的基础知识这里不做过多陈述,如果有对这方面感兴趣的朋友可以直接百度一下,有很多讲SD卡的文章,这里主要是针对SD卡的读写程序实现做一些详细说明. ...
- 迅为4418/6818开发板实现最小Linux系统自动挂载SD/TF卡/U盘等存储设备
本文转自迅为论坛:http://www.topeetboard.com 在论坛里找到的,先做个笔记以后用到随时看 通过 mdev 工具实现 U 盘和 SD/TF 卡的自动挂载步骤如下: 一.配置内核 ...
- 全志A64平台由于没有SD/TF卡座进不了系统
在进行硬件的裁剪之后发现进不了系统,报错信息如下. sunxi-mmc 1c0f000.sdmmc: smc 1 p0 err, cmd 1 这时需要修改内核设备树文件,全志的硬件设备信息写在了以fe ...
- 警惕不良商家利用Panasonic SDFormatter 软件对SD/TF卡容量造假
警惕不良商家利用Panasonic SDFormatter 软件对SD/TF卡容量造假 简单的一个操作,就完成了对便携式存储卡,扩容造假,不管你怎么格式化,仍然是会显示虚假 容量,骗过一般的操作行为, ...
- SPI读写SD卡速度有多快?
SD卡是一个嵌入式中非常常用的外设,可以用于存储一些大容量的数据.但用单片机读写SD卡速度一般都有限(对于高速SD卡,主要是受限于单片机本身的接口速度),在高速.实时数据存储时可能会有影响.但具体速度 ...
- ESP32 ESP-IDF SD(TF)卡保存GPS北斗模块数据
陈拓 2022/05/13-2022/05/15 1. 简介 在<ESP32 ESP-IDF 获取GPS北斗模块的经纬度和日期时间> https://zhuanlan.zhihu.com/ ...
- SD/TF卡测试与比较
存储卡的读写速度的区别:class 10,UHS-1(U1 U3),UHS-3 – 艾文心 http://ivan.xin/?p=4793 SD/TF的A1,U3协议简单对比 & 掉速问题解决 ...
- 如何用U盘启动树莓派,没有SD/TF卡怎么启动树莓派
在收到树莓派3B+之后,我发现必须要用tf卡才能启动,但是手头没有tf卡,所以上网寻找其他方法. 在看了很多教程,问了一些同学之后,我了解到树莓派3B+是可以通过U盘启动的,而且不像网上那些既要用到U ...
最新文章
- whoosh学习(1)
- CKeditor3.6.2 配置与精简
- python与办公自动化-用 Python 自动化办公,我与大神之间的差距一下就拉小了
- android中获取版本号,如何获取Android应用程序的构建/版本号?
- excel函数vloopup使用方法
- 关于屏幕分辨率的一些操作
- Ubuntu系统---WeChat安装
- ======第二章进程管理======
- python入门经典代码-【python】编程语言入门经典100例--12
- 安卓java其他类改变view_安卓自定义控件(三)实现自定义View
- 关 于语义语法的逻辑界定
- python爬腾讯视频地址_腾讯视频爬虫
- 【DFT】DFT入门介绍
- 在Ubuntu中连接Vultr虚拟主机远程桌面
- QRCode生成二维码和解析二维码
- UI设计中的12个基本动效
- 中国工程院谭建荣:人工智能应用得再好,最核心的算法不行,创新能力就不行丨MEET2021
- Flume安装及几个入门案例
- 阿里巴巴2015研发工程师B笔试卷
- 给在校学生的科普文:数字芯片后端工程师的日常