SD卡SPI模式 读写block

2023-11-04

声明:第一次写教程,如若有错误,请指出更正。

看了很多网上的教程,还是觉得很多教程中,写多个块的时候有些问题,因此经过3天的奋斗,写出自己的教程。

本教程中,没有挂载文件系统,单纯读写Block,会破坏分区和数据。

下节再 装上文件系统Fatfs,使得应用更好。

 

硬件平台:stm8单片机

软件平台:IAR

参考文档:SD卡协议(物理层)(附件中的PDF)

作者:小强

PDF的查看链接: http://wenku.baidu.com/view/b08b868e84868762caaed5fc.html

一、概述

SD卡的通信模式有两种:SDIO和SPI模式,其中SPI模式比较简单,而SDIO模式速度快。

暂时只讲述SPI模式。本文不讲述各种错误的检查,只讲述有用的 初始化和读写操作。

硬件连接图:SD卡 <wbr>SPI模式 <wbr>读写block

 

 

SPI工作模式为:MSB在前,数据在 CLK 上升沿采集

每发送一个命令,SD将会返回8位或16位的 Response

读写必须以一个扇区为单位(Sector) 512字节或 它的倍数

二、命令结构(PDF中P101)

SD卡 <wbr>SPI模式 <wbr>读写block

 

u8 Write_Command(u8 cmd, u32 arg, u8 crc)

{

u8 r1,retry;

 

   CLR_SD_CS();//Select SD Card

   SPI_SendByte( cmd | 0x40);//bit47 = 0, bit46 = 1

   SPI_SendByte( arg >> 24 );

   SPI_SendByte( arg >> 16 );

   SPI_SendByte( arg >> 8 );

   SPI_SendByte( arg );

   SPI_SendByte( crc | 0x01);//bit0 = 1

   

   retry = 0;

   do{

       r1 = SPI_SendByte(0xff);

       if( retry ++ > 200 ) break;

   }while(r1 == 0xff);//Get Response

   

   SET_SD_CS();//Release SD Card

   

   return r1;

}

 

三、初始化过程:

CMD0进入挂起状态

CMD1选择SD

CMD59关闭CRC校检

CMD16设定Block  Length

参考文档P109 的R1 结构:

SD卡 <wbr>SPI模式 <wbr>读写block

CMD0发送后,SD卡处于 Idle状态,因此Response0x01

而其他命令发送后,R1应该为0x00

由于 大容量SD的读写Block大小固定为512bytes

 

 

u8 SD_IDLE(void)

{

   u8 r1, retry = 0;

   

   do{

       r1 = Write_Command(CMD0, 0, 0x95);//发送就绪命令

       if(retry ++ > 200) return 1;

   }while(r1 != 0x01 );//等待返回为0x01

   

   retry = 0;

   do{

       r1 = Write_Command(CMD1, 0, 0x95);

       if(retry ++ > 200) return 1;

   }while(r1 != 0x00 ); //等待返回为 0x00

   

   r1 = Write_Command(CMD59, 0, 0x95);//关闭CRC

   r1 = Write_Command(CMD16, 512, 0xff);//设定block块大小为512

   

   return 0;

}

 

四、Read_Single_Block

时序图 详细:参考资料P96

 SD卡 <wbr>SPI模式 <wbr>读写block

 

要点:CRC16bit,即2字节

        Start  Block  0xFE

        SD卡 <wbr>SPI模式 <wbr>读写block

参考资料P112

        要点: 2~513个字节

 

u8  GetResponse(u8 Res)

{

   u8 retry = 0,r1;

   do{

     r1 = SPI_SendByte(0xFF);

     if( retry++ > 250) return 1;

   }while(r1 != Res);

   

   return 0;

}

 

 

u8 ReceiveData(u8 *buffer, u16 len)

{

   u16 i;

   u8 r1;

   CLR_SD_CS();

   

   r1 = GetResponse(0xFE);//等待起始标志 0xFE

   if( r1 ){

       SET_SD_CS();//返回非0 发生错误

       return r1;

   }

   

   for(i=0; i

       *buffer++ = SPI_SendByte(0xFF); //接收数据

   }

   

   SPI_SendByte(0xFF);//CRC 8+8位 = 16位CRC

   SPI_SendByte(0xFF);//CRC

   

   SET_SD_CS();

 

   return 0;

}

 

 

u8 ReadSingleBlock(u8 *buffer, u32 sector)

{

   u8 r1;

   if(sector<1)  return 1;// 保护0扇区

   

   r1 = Write_Command(CMD17, sector<<9, 0xFF);//由于512字节对齐,所以sector<<9

   if(r1) return r1;//发生错误

   

   r1 = ReceiveData(buffer, 512);//接收512个字节数据

   if(r1) return r1;//发生错误

   

   return 0;

}

 

五、Read_Multiple_Block

SD卡 <wbr>SPI模式 <wbr>读写block

与读取单个块,不同点:结束时,需要发送CMD12

 

 

u8 ReadMultipleBlock(u8 *buffer, u32 sector, u8 count)

{

   u8 r1;

   u16 i;

   if(sector<1)  return 1;// 保护0扇区

   

   r1 = Write_Command(CMD18, sector<<9, 0xFF);//由于512字节对齐,所以 sector<<9

   if(r1) return r1;

   

   CLR_SD_CS();

   

   while( SPI_SendByte(0xFF) != 0xFE );//Wait for Start Block Taken

   

   do{

       for( i=0; i <512; i++)

           *buffer++ = SPI_SendByte(0xFF);

   

       SPI_SendByte(0xFF);//CRC

       SPI_SendByte(0xFF);//CRC

       

   }while(--count);

       

SET_SD_CS();//Release

 

   r1 = Write_Command(CMD12, 0, 0); //Stop Tran

   if(r1) return r1;

   

   return count;

}

 

 

 

 

 

六、Write_Single_Block

详细查看参考资料P97页

SD卡 <wbr>SPI模式 <wbr>读写block
要点:每个块都以 Start Block Token (0xFE) 开始  与读取数据一样

        CRCRead_Single_Block一样,即16

        Busy时,SD卡会把总线拉低

  Data_Response SD卡 <wbr>SPI模式 <wbr>读写block

资料P111

即后6位数据为0x05为数据正常

 

 

u8 WriteSingleBlock(u8 *buffer, u32 sector)

{

   u8 r1;

   u16 i;

   if(sector<1)  return 1;

   

   r1 = Write_Command(CMD24, sector<<9, 0xFF);

   if(r1) return r1;

   

   CLR_SD_CS();

   SPI_SendByte(0xFE);//Start Block Taken

   

   for( i=0; i <512; i++)

       SPI_SendByte( *buffer++ );//Write Data

   

   SPI_SendByte(0xFF);//CRC 16位

   SPI_SendByte(0xFF);//CRC

   

   r1 = SPI_SendByte(0xFF) & 0x1F;//data_Response

   

   if( r1 != 0x05) return r1;//Data accepted 0x05

   

   while( !SPI_SendByte(0xFF) );//busy

   

   SET_SD_CS();//Release

   

   return 0;

}

七、Write_Multiple_Block

资料P98

 SD卡 <wbr>SPI模式 <wbr>读写block

 

SD卡 <wbr>SPI模式 <wbr>读写block

资料P112

 

 写入单个块不同的是:

Start Block Token 0XFC

停止传送数据 要发送Stop Tran Token 0xFD

 

以下是实践证明的,资料中没有

 

而且:发送Stop Tran Token后,

        还要发送 2个字节或以上,参考 读取数据中的 Start Block Token 的说明

之后还要检查 第二次 Busy (在写多个块的时序图说明)

 

 

u8 WriteMultipleBlock(u8 *buffer, u32 sector, u8 count)

{

   u8 r1;

   u16 i;

   if(sector<1)  return 1;

   

   r1 = Write_Command(CMD25, sector<<9, 0xFF);

   if(r1) return r1;

   

   CLR_SD_CS();

   

   SPI_SendByte(0xFF);

   SPI_SendByte(0xFF);

   

   do{

       SPI_SendByte(0xFC);//Start Block Taken

       for( i=0; i <512; i++)

           SPI_SendByte( *buffer++ );

   

       SPI_SendByte(0xFF);//CRC

       SPI_SendByte(0xFF);//CRC

       

       r1 = SPI_SendByte(0xFF) & 0x1F;//data_Response

       

       if( r1 != 0x05) return r1;//Data accepted

       

       while( !SPI_SendByte(0xFF) );//busy

       

   }while(--count);

   

   SPI_SendByte(0xFD);//Stop Tran Taken

   

   //以下三步是重点

   //写入数据 最少为 2个字节

   SPI_SendByte(0xFF);//CRC 16位

   SPI_SendByte(0xFF);//CRC

   

   while( !SPI_SendByte(0xFF) );// 第二个 busy

           

   SET_SD_CS();//Release

       

   return count;

}

 

http://blog.sina.com.cn/s/blog_6ade392501015vv7.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SD卡SPI模式 读写block 的相关文章

  • SPI协议读写SD卡介绍

    前言 在前面的文章中 我们主要介绍了如何利用SDIO协议对SD卡进行读写操作的流程及注意事项 虽然SDIO协议读写SD卡的效率很高 但是 操作却比较麻烦 另外 还需要使用的芯片具有SDIO外设 这对于不具备SDIO外设的芯片而言 绝对是一个
  • 基于SD卡的FatFs文件系统(FatFs移植到STM32)

    平台 STM32ZET6 核心板 ST LINK V2 SD卡 USB串口线 一 移植 工程介绍 主要文件在USER组中 bsp sdio sdcard c bsp sdio sdcard h和main c 另外FatFs是用来后面移植文件
  • FATFS文件系统详解

    FATFS文件系统详解 文章目录 FATFS文件系统详解 1 简介 2 基础概念 3 FAT文件系统组成介绍 4 FAT文件系统分析 4 1 采用FAT格式格式化SD nand sd卡 4 2 引导扇区分析 4 3 分区偏移及大小计算 4
  • FATFS 0.13 f_mount(&fs,““,1)挂载失败的原因

    这两天学着用了一下FATS文件系统 虽然工作中没用到 但是对个人的经验积累还是有用的 看了一下 代码并不多 但是精简啊 指针跳来跳去的一不小心就晕了 所以也遇到了不少问题啊 这里就讲一下我遇到的第一步就懵逼的问题 那就是 FRESULT f
  • STM32的简单的SD卡读写

    导读 SD卡一般支持两种读写模式 SPI和SDIO模式 SD卡的引脚排序如下图所示 SPI模式下有几个重要的操作命令 分别是 SD卡R1回应的格式如下SPI模式下的典型初始化过程如下 1 初始化硬件配置 SPI配置 IO配置等 SD卡一般支
  • S3C2440读写sd卡的一些总结

    整理硬盘的时候发现这个文档 以前写2440操作sd卡程序的时候总结的 1 我的2440 sdi对sd卡发送ACMD41时总是反馈crc fail 但是可以得到正确的response sd卡可以正常使用 2 sd卡可以没有mbr 在物理的 0
  • SD卡SPI模式 读写block

    声明 第一次写教程 如若有错误 请指出更正 看了很多网上的教程 还是觉得很多教程中 写多个块的时候有些问题 因此经过3天的奋斗 写出自己的教程 本教程中 没有挂载文件系统 单纯读写Block 会破坏分区和数据 下节再 装上文件系统Fatfs
  • STM32+FATFS文件系统连续在同一个txt文件里写入内容

    移植好fatfs文件系统之后 我们经常要在一个txt文件下写入数据 但是这些数据可能需要多次写入 那怎么办呢 通过这几天的学习 有以下函数可以帮助我们进行多次写入数据 1 打开文件 f open filescr2 0 201711022 t
  • SD卡/TF卡简记

    文章目录 MicroSD卡与SD卡关系与区别 对比NM卡 XQD卡 CFexpress卡 SD规格标识 FAQ 拍摄1080p或2k视频需要什么速度的sd卡 拍摄4k视频需要什么速度的sd卡 拍摄8k视频需要什么速度的sd卡 MicroSD
  • STM32 SPI方式读写SD卡

    前段时间在51上模拟SPI实现了对SD卡的读取 效果还算不错 最近将其移植到STM32上 不过使用硬件SPI和使用软件SPI还是有差别的 代码如下 void User SPIInit void GPIO InitTypeDef GPIO I
  • fatfs移植和使用(在SPI_FLASH上建立文件系统)

    文件系统对于嵌入式系统的重要性是不言而喻的 有了文件系统管理数据和外设变得方便许多 同时简化了应用的开发 今天我们来以在SPI FLASH上建立文件系统为例 看看FATFS文件系统怎么移植和使用 需要准备的材料有 1 FATFS文件系统源码
  • MMC、SD、TF、SDIO、SDMMC简介

    MMC 概念 MMC的全称是 MultiMediaCard 所以也通常被叫做 多媒体卡 是一种小巧大容量的快闪存储卡 特别应用于移动电话和数字影像及其他移动终端中 外形及接口定义 如上图所示 MMC存贮卡只有7pin 可以支持MMC和SPI
  • 发布一个在读写sd卡时,此时sd卡拔出造成死机的处理方法

    发布一个在读写sd卡时 此时sd卡拔出造成死机的处理方法 同时也在此记录一下 以备后用及有需要人们参考 stm32f4xx hal sd c 红色的代码是增加上去的 函数名称 static HAL SD ErrorTypedef SD Cm
  • STM32F407移植FATFS文件系统(版本 R0.09b)支持长文件名和中文名称

    FatFs文件系统 默认是不支持长文件名和中文名称的 要想支持长文件名和中文名称 需要打开ffconf h文件进行配置 一 支持长文件名 FatFs文件系统 默认是不支持长文件名的 要想支持长文件名 需要打开ffconf h文件进行配置 找
  • SD卡、TF卡读写速率测试

    请注意 可以在未经过博主同意下转载 但必须注明出处 谢谢 1 运行HDBENCH软件 点击确定 2 弹出如下图所示界面 配置选项并测试 选择待测TF卡 Removable可移动存储设备 图示所插入的TF卡是 I 盘 请根据实际情况选择 选择
  • SD卡 FATFS CSV 文件中的 逗号和换行

    RFC 4180 Common Format and MIME Type for Comma Separated Values CSV Files 要点有 1 CSV的换行符号要使用CRLF 即 回车符 换行符 的形式 2 文字可以使用双引
  • FATFS实现数据追加功能(原文不覆盖)

    在对FATFS的应用中我们经常需要把采集的数据存入的文件中 用作保存 也许我们的系统是一个长期的运行过程 但是我们的数据可能不是持续采集的 所以我们这样写代码 注册一个工作区域 f mount 0 fs 打开创建一个新文件 res f op
  • SD卡初始化以及命令详解

    SD卡是嵌入式设备中很常用的一种存储设备 体积小 容量大 通讯简单 电路简单所以受到很多设备厂商的欢迎 主要用来记录设备运行过程中的各种信息 以及程序的各种配置信息 很是方便 有这样几点是需要知道的 SD 卡是基于 flash 的存储卡 S
  • 关于如何修复烧写镜像文件失败的SD卡

    前言 使用某些软件 比如 win32 Disk Imager 向SD卡烧写镜像文件时 很有可能出现烧写失败的情况 通常如果烧写失败 系统会弹出请求格式化SD卡的提示框 此时不要点格式化 点了可能会造成不可挽救的结果 也可能不会 而是进行以下
  • 【正点原子探索者STM32F407开发板例程连载+教学】第30章 SPI通信实验

    第三十章 SPI 实验 mw shl code c true 1 硬件平台 正点原子探索者STM32F407开发板 2 软件平台 MDK5 1 3 固件库版本 V1 4 0 mw shl code 本章我们将向大家介绍STM32F4的SPI

随机推荐

  • S3C2440读写sd卡的一些总结

    整理硬盘的时候发现这个文档 以前写2440操作sd卡程序的时候总结的 1 我的2440 sdi对sd卡发送ACMD41时总是反馈crc fail 但是可以得到正确的response sd卡可以正常使用 2 sd卡可以没有mbr 在物理的 0
  • 推理规则的具体应用

    小伙伴们 大家好呀 相信步入大二的同学们肯定会学到离散数学 而推理规则是离散数学中最fundmental and important 的知识体系 今天我们来说说基本的推理规则 Firstly 推理 inference rules 是 前提
  • hibernate--lazy(懒加载)属性

    关联映射文件中
  • 线性表之单链表

    include stdafx h include
  • WebRTC学习(二)Windows10平台WebRTC编译(VS2017)

    1 Visual Studio 2017安装 WebRTC用到了很多C 最新特性 所以编译最新WebRTC代码VS要求为2017 gt 15 7 2 版本 2 安装SDK调试工具 由于最新WebRTC源码要求10 0 18362及以上Win
  • wordpress线上部署&更新主题

    目录 新增主题 主题介绍 部署到线上 更新主题 新增主题 随便复制一个主题到test文件夹 test主题文件cnpm I npm i 失败的可以使用淘宝镜像 cpm i 热更新 主题介绍 test目录下的style css Theme Na
  • 论文笔记:LightGCL: Simple Yet Effective Graph Contrastive Learning for Recommendation

    ICLR 2023 1 intro GNN在基于图的推荐系统中展现了良好的效果 这得益于其整合相邻结点信息以进行协同过滤的能力 在用户 物品交互图上进行多层的信息传递 以此挖掘高阶的连接信息 很大一部分基于 GNN 的协同过滤模型采用了监督
  • vue跨域处理(vue项目中baseUrl设置问题)

    一 方法一 在公用文件common js中设置baseUrl export var baseUrl process env NODE ENV production window g ApiUrl api 该方法的优点 在项目打包时 stat
  • jvm关闭

    关闭方式 正常关闭 最后一个普通线程 非守护线程 结束 调用了System exit 发送SIGINT信号 相当于不带参数的kill命令 或者键入Ctrl C 强制关闭 调用Runtime halt 发送SIGKILL信号 kill 9 命
  • 认证鉴权与API权限控制在微服务架构中的设计与实现(一)

    引言 本文系 认证鉴权与API权限控制在微服务架构中的设计与实现 系列的第一篇 本系列预计四篇文章讲解微服务下的认证鉴权与API权限控制的实现 1 背景 最近在做权限相关服务的开发 在系统微服务化后 原有的单体应用是基于Session的安全
  • JavaScript中的backgroundPosition的设置

    在CSS中background position有对值的设置有两种 一是用数值 绝对的 另一个使用百分比 相对的 这两种方式会有不同的浏览器兼容问题 主要是IE和FF 基本代码如下 style overflow y scroll heigh
  • 从RPA+AI到IPA,RPA是如何进化的?

    随着RPA 机器人流程自动化 的深入发展 如今对于该技术今后的走向业内也形成了共识 那就是RPA不能 独行 一定要加个 伴儿 至于加 谁 则见仁见智 比较常见的则是加AI 人工智能 RPA AI 其实并不是件新鲜事 我们将时间拨回到5年前
  • Windbg分析高内存占用问题

    打Dump 远程客户应用服务器 32G内存占用已经消耗了78 而现场已经反馈收银系统接近奔溃了 要求先强制回收内存 反正也要奔溃了 先打Dump再说吧 PS 打Dump会挂起进程 导致应用无法响应 而打Dump的耗时 也是根据当时进程的内存
  • 循环打印数字文件名

    循环打印以顺序数字为标识 且格式为 0 的文件名 for s in range 10 a f train id s 03 tif print a train004 tif train005 tif train006 tif train007
  • 基于接口设计原则-java

    7种设计坏味道 1 僵化性 很难对系统进行改动 因为每个改动都会迫使许多对系统其他部分的其它改动 2 脆弱性 对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题 3 牢固性 很难解开系统的纠结 使之成为一些可在其他系统中重用
  • PyTorch中squeeze()和unsqueeze()函数理解

    squeeze arg 表示若第arg维的维度值为1 则去掉该维度 否则tensor不变 即若tensor shape arg 1 则去掉该维度 例如 一个维度为2x1x2x1x2的tensor 不用去想它长什么样儿 squeeze 0 就
  • 小程序:TypeError: Cannot read property ‘restore‘ of undefined

    去看了一些文字说肯能是data里面定义了 restore 而且还是引用类型 数据没有出来就渲染了也就导致了报错undefind 但是自己去看了一些data里面没有定义 restore 也是看了许久的文章才发现一篇文章说是 小程序的版本要降低
  • 笔试

    文章目录 前言 39 跨时钟域问题 1 从亚稳态入手 2 跨时钟域传输的几种情况 3 单bit信号的跨时钟域传输 3 1单bit信号从慢时钟域到快时钟域传输 3 2单bit信号从快时钟域到慢时钟域传输 脉冲同步器 窄脉冲捕捉电路 下期预告
  • 缓动 css,[CSS3] CSS缓动曲线整理

    常用效果 easeInSine cubic bezier 0 47 0 0 745 0 715 easeOutSine cubic bezier 0 39 0 575 0 565 1 easeInOutSine cubic bezier 0
  • SD卡SPI模式 读写block

    声明 第一次写教程 如若有错误 请指出更正 看了很多网上的教程 还是觉得很多教程中 写多个块的时候有些问题 因此经过3天的奋斗 写出自己的教程 本教程中 没有挂载文件系统 单纯读写Block 会破坏分区和数据 下节再 装上文件系统Fatfs