[应用相关] STM32之SD卡

[复制链接]
615|38
 楼主 | 2019-7-22 15:27 | 显示全部楼层 |阅读模式
目录
一、SD卡概述
  1、定义
  2、容量等级
  3、SD卡框图
  4、SD卡与TF卡的区别
二、 SD卡内部结构
  1、 SD卡内部结构简图
  2、 存储阵列结构图
  3、Buffer
  4、“存储阵列Block”--最小的存储单元
  5、SD卡的特殊功能寄存器
三、SDIO接口
四、SD卡协议的核心--数据读、写、擦除
  1、SD卡写数据块
  2、SD卡读数据块
  3、擦除SD卡
五、SD卡物理层协议
  1、接口
  2、命令格式
  3、响应格式
  4、SD卡的工作状态
  5、SD卡的两种状态信息
六、STM32与SD卡相配的外设--SDIO适配器
  1、SDIO adapter 结构图
  2、命令状态机(CPSM)
  3、数据通道状态机(DPSM)
  4、SDIO的FIFO
  5、SDIO的特殊功能寄存器
七、SD卡编程
  1、SD卡编程的内容
  2、SD卡初始化
  3、读SD卡的一个块
  4、写SD卡的一个块
八、SD卡疑惑
  1、SD卡擦除后,其中的内容是0,还是1 ?
  2、在SDIO_DCTRL中设置传输Block的要求
3、STM32固件库“stm32_eval_sdio_sd.c version v4.5.0”偶遇BUG
   4、SD卡写Block是怎样进行的?
九、SD卡参数测试

使用特权

评论回复
 楼主 | 2019-7-22 15:28 | 显示全部楼层
一、SD卡概述

1、定义

  SD卡(安全数码卡),是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(外语缩写PDA)和多媒体播放器等。

使用特权

评论回复
 楼主 | 2019-7-22 15:29 | 显示全部楼层
2、容量等级
容量等级

容量范围
磁盘格式
SD
上限至2GB
FAT 12, 16
SDHC
2GB至 32GB
FAT 32
SDXC
32GB至2TB
exFAT


使用特权

评论回复
 楼主 | 2019-7-22 15:31 | 显示全部楼层
3、SD卡框图

815405d35665228c18.png

引脚说明:

797945d356661ce2b1.png

使用特权

评论回复
 楼主 | 2019-7-22 15:32 | 显示全部楼层
4、SD卡与TF卡的区别

  TF卡又名micro SD卡,个头是比SD卡的1/4还小,可以通过“TF转SD卡套”转换成SD卡。

  详细区别参考:https://jingyan.baidu.com/article/c1465413696ff80bfcfc4cfe.html

使用特权

评论回复
 楼主 | 2019-7-22 15:32 | 显示全部楼层
二、 SD卡内部结构

  (摘自SanDisk Secure Digital Card Product Manual Version 1.9)

1、 SD卡内部结构简图

   由SD卡控制器和存储阵列组成,SD卡与外界的通讯接口是SD Bus或者SPI Bus。

411055d356693b51f7.png

使用特权

评论回复
 楼主 | 2019-7-22 15:32 | 显示全部楼层
2、 存储阵列结构图

102265d3566aa1ac62.png

Block:      

  读写时的单元(数据传输单元),它的单位是“字节”。

Sector:     

  如果CSD寄存器ERASE_BLK_EN = 0时,Sector是最小的擦除单元,它的单位是“块”。Sector的值等于CSD寄存器中的SECTOR_SIZE的值+1。

WP Group:   

  最小的写保护单元,它的单位是“扇区”。

使用特权

评论回复
 楼主 | 2019-7-22 15:33 | 显示全部楼层
3、Buffer

303975d3566c1b4405.png

  SD Card的Buffer最大容量定义在CSD寄存器的READ_BL_LEN和WRITE_BL_LEN。它们的值是一样的,而且有可能超过512字节,尽管这样Block还是要设置成512字节,因为512字节是数据边界(这句话不是太理解)。也就是SD卡上有数据传输缓冲器Buffer,不同的产品可能不一样,但是在使用时要将Buffer设置成512字节。

参考资料:  

  The card buffer size is described as maximum block length in the Card Specif ic Data (CSD) register for memory cards (for cards compliant with the Physical Layer Specification, READ_BL_LEN and WRITE_BL_LEN shall be the same) and in the Card Information Structure (CIS) for SDIO cards. Physical Layer Specification re-defines that maximum block length is only used to calculate capacity of memory card. Even though it indi cates larger than 512 bytes, block length shall be set to 512 byte for data transfer. This is because 512 bytes block l ength is required to keep compatibility with 512 bytes data boundary.

(摘自《Simplified_SD_Host_Controller_Spec.pdf》)

使用特权

评论回复
 楼主 | 2019-7-22 15:33 | 显示全部楼层
4、“存储阵列Block”--最小的存储单元

  资料上的Block通通指的是数据传输时的最小单元,定义这个数值是为了数据传输、CRC校验等。

  存储阵列通常采用NandFlash的结构,显然不能按字节存取,而这里讨论的“存储阵列Block”就是指这个概念。可惜的是目前,我还没有找到资料讨论这个问题,所以这一章节是笔者自己的推测。

  据我推测存储阵列Block应该是512Byes,因为众多的数据都围绕着512Bytes在转。比如说最小的擦除单元是512Byes,最小的读写单位应该被设置成512Bytes,那么有理由推测是这个数值。

使用特权

评论回复
 楼主 | 2019-7-22 15:34 | 显示全部楼层
5、SD卡特殊功能寄存器

CID:  宽度128位,卡标识号
RCA:  宽度16位,卡相对地址,在初始化的时候确定
CSD:  宽度128位,卡描述数据:卡操作条件的信息
SCR:  宽度64位,SD卡配置寄存器:SD卡特定信息数据
OCR:  宽度32位,操作条件寄存

使用特权

评论回复
 楼主 | 2019-7-22 15:34 | 显示全部楼层
三、SDIO接口

980245d3566f71819f.png

使用特权

评论回复
 楼主 | 2019-7-22 15:34 | 显示全部楼层
四、SD卡协议之数据读、写、擦除

1、SD卡写数据块 

  执行写数据块命令(CMD24-27) 时,主机把一个或多个数据块从主机传送到卡中,同时在每个数据块的末尾传送一个CRC码。主机传送数据,SD卡接收数据并将数据保存在Buffer中,累计接收数据达到Block长度的时候,SD卡把接下来的数据当做CRC校验码,并且开始数据校验。如果CRC校验错误,卡通过SDIO_D 线指示错误,传送的数据被丢弃而不被写入,所有后续(在多块写模式下)传送的数据块将被忽略。

     如果主机传送部分数据而累计的数据长度未与数据块对齐,当不允许块错位( 未设置CSD的参数WRITE_BLK_MISALIGN),卡将在第一个错位的块之前检测到块错位错误( 设置状态寄存器中的ADDRESS_ERROR 错误位) 。当主机试图写一个写保护区域时,写操作也会被中止,此时卡会设置WP_VIOLATION位。 

  数据块Block的最大长度定义在CSD中的WRITE_BL_LEN,但是在数据传输时应该用CMD16指令将其设置为512Byets,不去在意WRITE_BL_LEN是1024或者2048Bytes。

  另外需要注意的是,Block的长度设置还要参考CSD寄存器的WRITE_BL_PARTIAL。当WRITE_BL_PARTIAL为0时,那么么办法Block只能设置为512Bytes;如果WRITE_BL_PARTIAL=1,那么允许将Block设置成更小的块,比如说一个字节。协议是这样规定的,但是据我分析如果这样的话SD卡的制作会非常复杂(写入的单位可以是字节),价格也会很高。笔者测试了自己的SD卡,WRITE_BL_PARTIAL 等于0,也就是不支持“块部分写”功能。

使用特权

评论回复
 楼主 | 2019-7-22 15:34 | 显示全部楼层
2、SD卡读数据块

  在读数据块模式下,数据传输的基本单元是数据块Block。为保证数据传输的正确,传输一个数据块Blcok后都有一个CRC校验码。笔者认为主机在累计接收到Block长度数据后,软件可以把接下来的数据当做CRC校验码,并且进行校验。

  Block的最大值在CSD中(READ_BL_LEN) 给出了定义,但是在数据传输时应该用CMD16指令将其设置为512Byets,不去在意READ_BL_LEN是1024或者2048Bytes。

  如果CSD寄存器中的READ_BL_PARTIAL等于1,可以传送的较小数据块,较小数据块是指开始和结束地址完全包含在一个物理块中。事实上,协议规定READ_BL_PARTIAL永远等于1,也就说在任何SD卡上都允许“读部分块”,读的块的最小字节是1Bytes。使用这种功能,可以通过CMD16命令设置更小的Block(比如说等于128)。读取的这128字节必须在512Bytes边界内,不能跨越边界(其实因为存储阵列是以512Bytes为单位的,读取“部分块”只能在一个块内,不允许跨块读)。

使用特权

评论回复
 楼主 | 2019-7-22 15:35 | 显示全部楼层
3、擦除SD卡

  CSD寄存器ERASE_BLK_EN决定了SD卡的最小擦除单位。

  当ERASE_BLK_EN等于0的时候,主机擦除的最小单位是扇区。比如一个Sector包含32个Block,擦除时的起始地址是5,而结束地址是40,那么实际擦除的块是从0到63。

30225d35672f792a9.png

  当ERASE_BLK_EN等于1的时候,主机擦除的最小单位是512 Byetes。比如擦除时的起始地址是5,而结束地址是40,那么实际擦除的块就是从5到40。

994795d356728411f1.png

使用特权

评论回复
 楼主 | 2019-7-22 15:35 | 显示全部楼层
五、SD卡物理层协议

  SD卡的协议相对于SPI、I2C等协议的存储器来说相对复杂,包含SD卡物理层(机械封装、管脚、芯片结构、命令集等)、SD卡接口(SDIO)、SD主机控制器,甚至是软件设计的流程,都进行了详细的规定。

使用特权

评论回复
 楼主 | 2019-7-22 15:36 | 显示全部楼层
1、接口

① SDIO接口

  参考《Simplified_SDIO_Card_Spec.pdf》

33915d356761d03be.png

<1> CLK 时钟同步线

<2> CMD 命令信号线,主机发出的命令以及从机对命令的响应都是通过这条线进行传输

<3> DAT[3:0] 表示4条数据线,主机和从机的数据都是从这四条数据线上传输

② SPI接口

943835d35675681a91.png

使用特权

评论回复
 楼主 | 2019-7-22 15:36 | 显示全部楼层
2、命令格式

597985d356788a2a1a.png

使用特权

评论回复
 楼主 | 2019-7-22 15:36 | 显示全部楼层
3、响应格式

  以R1为例

301965d35679711de7.png

使用特权

评论回复
 楼主 | 2019-7-22 15:37 | 显示全部楼层
4、SD卡的工作状态

696155d3567a651531.png

使用特权

评论回复
 楼主 | 2019-7-22 15:37 | 显示全部楼层
5、SD卡的两种状态信息

① Card Status

  执行命令过程中的状态信息,比如地址不对齐错误、块长度错误、卡锁、ECC校验错误等等

② SD Status

  SD卡的专有特征,编程中不经常涉及。这个状态值有512位,不是通过命令线传送给主机,而是通过数据线。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表