SD卡学习

正点原子学习笔记

SD卡简介

        SD卡,Secure Digital Card,称为安全数字卡(安全数码卡)。
        本质:nand flash + 控制芯片
        SD卡系列主要有三种:SD卡(full size)、MiniSD卡和MicroSD卡(TF卡).
SD卡遵循SD卡协议

特点:容量大,高安全性,体积小,传输速度快,接口简单

stm32的微控制器里面的SDIO外设支持SD卡2.0协议
为此选择SD卡存储容量等级为SDHC 文件系统为FAT32 由2GB-32GB
由此可知STM32最大支持32GB SD卡

文件系统:存储设备上组织文件的方法

SD卡经常被用在Window操作系统上存数据,就得使用操作系统支持的FAT文件系统

SD卡驱动方式 

微处理器对SD卡进行操作,可通过SPI接口、SDIO接口。不同接口,SD卡引脚功能不一样。

引脚编号引脚名称功能(SDIO模式)功能(SPI模式)
Pin 1DAT3/CS数据线3片选信号
Pin 2CMD/MOSI命令线主机输出,从机输入
Pin 3VSS1电源线电源地
Pin 4VDD电源电源
Pin 5CLK时钟时钟
Pin 6VSS2电源地电源地
Pin 7DAT0/MISO数据线0主机输入,从机输出
Pin 8DAT1数据线1保留
Pin 9DAT2数据线2保留

SDIO接口通信线:CLK/CMD/DAT0~3
SPI   接口通信线:CS/CLK/MOSI/MISO

CLK:时钟线,由SDIO主机产生,由STM32微控制器SDIO外设输出
CMD:命令线,SDIO主机通过该线发送命令控制SD卡,若命令要求SD卡响应,SD卡也是通过该线传输响应信息。
DAT0~3:数据线,用于接收或发送数据;SD卡可将DAT0拉低表示处于忙状态


 

SD卡寄存器


        SD卡有8个寄存器,但不能直接进行读写操作,需要通过命令来控制。SD卡协议定义了一些命令用于实现某一特定功能,SD卡根据收到的命令要求内部寄存器进行修改。

SDIO模式

SD总线上的通信基于命令数据位流传输
命令:应用相关命令(ACMD)和通用命令(CMD),通过命令线CMD传输,固定长度48位
响应:SD卡接收到命令,会有一个响应,用来反应SD卡状态。有两种响应类型:短响应(48位,格式与命令一样)和长响应(136位)。
数据:主机发送的数据/SD发送的数据。SD数据是以块(Block)形式传输,SDHC卡数据块长度一般为512字节。数据块需要CRC保证数据传输成功。

SPI模式

SD总线上的通信基于命令数据位流传输
命令:应用相关命令(ACMD)和通用命令(CMD),通过命令线Dataln传输,固定长度48位
响应:SD卡接收到命令,会有一个响应,用来反应SD卡状态
数据:主机发送的数据/SD发送的数据。SD数据是以块(Block)形式传输,SDHC卡数据块长度一般为512字节。数据块需要CRC保证数据传输成功。

SD卡命令格式

SD卡的命令格式由6个字节组成,发送数据时高位在前,SD卡的写入命令格式如下:

                                  字节1(cmd)                                                             字节6(校验)

474645:4039:8字节2~5(参数内容)7:10
01(命令)/0(响应)command命令参数CRC71(停止位)
 

在SDIO,46位如表所示,在SPI模式,46位固定为1

Byte1:命令字的第一个字节为命令号 (如CMD0、CMD1等),格式为“01xxxxxx”

Byte2~Byte5:命令参数,有些命令参数是保留位,没有定义参数的内容,保留位应设置为0

Byte6:用于校验命令传输内容正确性,前7位为CRC校验位,最后一位为停止位0

注意:使用SDIO接口驱动,CRC7校验值必须正确;而SPI接口驱动,CRC7校验默认关闭,
即伪CRC
注意:
在SPI模式下,CRC必须发,但SD卡会读到CRC时会自动忽略它,校验位全设为1即可,某些命令的CRC是固定的 CMD0 CRC:0X95        CMD8 CRC:0X87

SD卡命令

SDIO模式和SPI模式,可使用的命令和特定类支持的命令有所不同。(协议V2.0

SDIO模式

命令参数响应描述
CMD0NONE复位SD卡
CMD8VHS+Check patternR7主机发送接口状态命令
ACMD41HCS+VDD电压 R3主机发送容量支持信息HCS和ORC寄存器内容
CMD2NONER2读取SD卡的CID寄存器值
CMD3NONER6要求SD卡发布新的相对地址
CMD9RCAR2获取选定卡的CSD寄存器内容
CMD7RCAR1b选中SD卡
CMD16block lengthR1设置SD卡的块大小(字节)
CMD17地址R1读取一个块的数据
CMD18地址R1连续读取多个块的数据
CMD12NONER1b多块读取强制卡停止传输
CMD13RCAR1被选中的卡返回其状态
ACMD23Number of blockR1设置需要预擦除的数据块数,提高SD卡多数据块写入性能(速度)
CMD24地址R1写入一个块的数据
CMD25地址R1连续写入多个块的数据
CMD55NONER1通知SD卡,接下来发送是应用命令


黄色背景的是SD卡初始化过程

发送CMD8后主机询问SD卡是否支持电压范围由R1响应
发送ACMD41后主机告诉SD卡支持高容量由R3响应并返回OCR寄存器
发送CMD2后 获取CID寄存器由R2响应
发送CMD3后 SD卡获得相对地址

SPI模式

命令参数响应描述
CMD0NONER1复位SD卡
CMD8VHS+Check patternR7主机发送接口状态命令
ACMD41HCSR3主机发送容量支持信息,激活卡的初始化过程
CMD58NONER3读取SD卡的OCR寄存器值
CMD17地址R1读取一个块的数据
CMD18地址R1连续读取多个块的数据
CMD12NONER1b多块读取强制卡停止传输
ACMD23Number of blockR1设置需要预擦除的数据块数,提高SD卡多数据块写入性能(速度)
CMD24地址R1写入一个块的数据
CMD25地址R1连续写入多个块的数据
CMD55NONER1通知SD卡,接下来发送是应用命令
CMD9NONER1读取卡特定数据寄存器(CSD)
CMD10NONER1读取卡标志数据寄存器(CID)

SD响应(SPI模式)

SD卡和单片机的通信采用发送应答机制
每发送一个命令,SD卡都会给出一个应答,以告知主机该命令的执行情况,或者返回主机需要获取的数据。使用SPI接口时,通过MISO传输。
SD卡响应使用接口不同,格式也不同。响应具体有R1,R1b,R2,R3,R7。

SD卡初始化(SPI模式)

1,上电后选择SPI模式(CMD0+CS0)
2,发送CMD8,主机询问SD卡是否支持电压范围(R1响应)
3,发送ACMD41,主机告诉SD卡支持高容量(R3响应)
4,发送CMD58,判断是高容量还是标准,响应R3中返回OCR寄存器

SD卡的操作模式(了解)

在SD卡系统(主机和SD卡)定义了两种操作模式:卡识别模式和数据传输模式。

系统复位后,主机和SD卡都处于卡识别模式,主机在总线上找设备;当SD卡被主机识别后,SD卡进入数据传输模式,而主机在总线上所有卡都被识别后也进入数据传输模式。

卡识别模式:识别总线上的SD卡类型;
空闲状态、准备状态、识别状态
数据传输模式:读写操作
待机状态、传输状态、发送数据状态、接受数据状态、编程状态、断开连接状态 

SDIO模式(读取写入操作)

SD卡单块数据块读取流程

1,发送CMD16指令,设置数据块大小  ;一般为512字节,设置后SD卡默认的块大小自动失效
2,等待CMD16响应(R1)
3,发送CMD17指令,开始读数据块
4,等待CMD17响应(R1)
5,读一个数据块的数据

SD卡多块数据块读取流程

1,发送CMD16指令,设置数据块大小  
2,等待CMD16响应(R1)
3,发送CMD18指令,开始读数据块
4,等待CMD18响应(R1)
5,读一个数据块的数据
6,读第二个数据块的数据
7,读取第N个数据块的数据
n,发送CMD12指令,结束数据块读取
n+1,等待CMD12响应(R1)
结束多块数据块读取

SD卡单块数据块写入流程

1,发送CMD16指令,设置数据块大小
2,发送CMD13指令,查询卡状态
3,等待READY_FOR_DATA位=1,否则返回2步重新发送
4,发送CMD24指令,开始写入数据
5,写一个数据块的数据

SD卡多块数据块写入流程

1,发送CMD16指令,设置数据块大小
2,发送ACMD23指令,预擦除数据块
        注意:ACMD指令仅对SD卡有效,另外需要先发送CMD55指令
3,发送CMD25指令,开始写数据块
4,写一个数据块的数据
n,写入第N个数据块的数据
n+1,发送CMD12指令,结束数据块写入
n+2,发送CMD13指令,查询卡状态
n+3,等待SD卡写入过程结束,否则返回n+2步骤重新查询
完成多块数据块写入

SPI模式(读取写入操作)

SD卡单块数据块读取流程

1,发送CMD17指令,开始读数据块 ;
2,等待CMD17响应(R1)
3,等待数据起始令牌:0xFE
4,接收数据
5,禁止片选,完成数据读取

SD卡多块数据块读取流程

1,发送CMD18指令,开始读数据块 ;
2,等待CMD18响应(R1)
3,等待数据起始令牌:0xFE
4,接收第一个数据块的数据
5,等待数据起始令牌:0xFE
4,接收第二个数据块的数据
5,等待数据起始令牌:0xFE
6,发送CMD12指令,结束数据块读取
7,等待CMD12响应(R1)
8,禁止片选,完成数据读取

SD卡单块数据块写入流程

1,发送CMD24指令,开始写入数据
2,发送写数据起始令牌:0xFE
3,写入一个块的数据
4,发送2字节的伪CRC(0xFF)
5,
禁止片选,完成数据写入
注意:SD卡收完一个数据块以后,会拉低MISO,直到数据块编程结束

SD卡多块数据块写入流程

1,发送CMD23指令,预擦除数据块,先预擦除,后面写入后不进行擦除
2,发送CMD25指令,开始写数据块
3,发送多块写数据起始令牌:0xFC
4,写入第一个数据块的数据
5,
发送2个字节的伪CRC(0xFF)
6,发送多块写数据起始令牌:0xFC
7,写入第二个数据块的数据
8,发送多块写数据结束令牌:0xFD
9,禁止片选,完成数据写入

萌新,想细致了解,理的比较乱,后续改进
 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只猫123456

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值