正点原子学习笔记
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 1 | DAT3/CS | 数据线3 | 片选信号 |
Pin 2 | CMD/MOSI | 命令线 | 主机输出,从机输入 |
Pin 3 | VSS1 | 电源线 | 电源地 |
Pin 4 | VDD | 电源 | 电源 |
Pin 5 | CLK | 时钟 | 时钟 |
Pin 6 | VSS2 | 电源地 | 电源地 |
Pin 7 | DAT0/MISO | 数据线0 | 主机输入,从机输出 |
Pin 8 | DAT1 | 数据线1 | 保留 |
Pin 9 | DAT2 | 数据线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(校验)
47 | 46 | 45:40 | 39:8字节2~5(参数内容) | 7:1 | 0 |
0 | 1(命令)/0(响应) | command | 命令参数 | CRC7 | 1(停止位) |
在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模式
命令 | 参数 | 响应 | 描述 |
CMD0 | NONE | 无 | 复位SD卡 |
CMD8 | VHS+Check pattern | R7 | 主机发送接口状态命令 |
ACMD41 | HCS+VDD电压 | R3 | 主机发送容量支持信息HCS和ORC寄存器内容 |
CMD2 | NONE | R2 | 读取SD卡的CID寄存器值 |
CMD3 | NONE | R6 | 要求SD卡发布新的相对地址 |
CMD9 | RCA | R2 | 获取选定卡的CSD寄存器内容 |
CMD7 | RCA | R1b | 选中SD卡 |
CMD16 | block length | R1 | 设置SD卡的块大小(字节) |
CMD17 | 地址 | R1 | 读取一个块的数据 |
CMD18 | 地址 | R1 | 连续读取多个块的数据 |
CMD12 | NONE | R1b | 多块读取强制卡停止传输 |
CMD13 | RCA | R1 | 被选中的卡返回其状态 |
ACMD23 | Number of block | R1 | 设置需要预擦除的数据块数,提高SD卡多数据块写入性能(速度) |
CMD24 | 地址 | R1 | 写入一个块的数据 |
CMD25 | 地址 | R1 | 连续写入多个块的数据 |
CMD55 | NONE | R1 | 通知SD卡,接下来发送是应用命令 |
黄色背景的是SD卡初始化过程
发送CMD8后主机询问SD卡是否支持电压范围由R1响应
发送ACMD41后主机告诉SD卡支持高容量由R3响应并返回OCR寄存器
发送CMD2后 获取CID寄存器由R2响应
发送CMD3后 SD卡获得相对地址
SPI模式
命令 | 参数 | 响应 | 描述 |
CMD0 | NONE | R1 | 复位SD卡 |
CMD8 | VHS+Check pattern | R7 | 主机发送接口状态命令 |
ACMD41 | HCS | R3 | 主机发送容量支持信息,激活卡的初始化过程 |
CMD58 | NONE | R3 | 读取SD卡的OCR寄存器值 |
CMD17 | 地址 | R1 | 读取一个块的数据 |
CMD18 | 地址 | R1 | 连续读取多个块的数据 |
CMD12 | NONE | R1b | 多块读取强制卡停止传输 |
ACMD23 | Number of block | R1 | 设置需要预擦除的数据块数,提高SD卡多数据块写入性能(速度) |
CMD24 | 地址 | R1 | 写入一个块的数据 |
CMD25 | 地址 | R1 | 连续写入多个块的数据 |
CMD55 | NONE | R1 | 通知SD卡,接下来发送是应用命令 |
CMD9 | NONE | R1 | 读取卡特定数据寄存器(CSD) |
CMD10 | NONE | R1 | 读取卡标志数据寄存器(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,禁止片选,完成数据写入
萌新,想细致了解,理的比较乱,后续改进