# 2.读操作


作者是初学者，水平有限，本文仅作为个人学习笔记使用，不能保证内容的正确性。部分资料来源于网络，参考了SD卡协议2.0手册等资料，如果有歧义，可以与作者联系。

# 简介

SD卡在SPI模式下，初始化完成之后就可以进行块操作，如读操作。SD卡有两种读取数据块的方式：

- 单次读数据块
- 连续读数据块

其中，每次读取的数据块大小，数据块的长度由CMD16（ SET_BLOCKLEN）命令设置。高容量SD卡的块大小固定为512字节，因此起始地址应与块边界对齐。

# 单次读数据块

| 命令号 | 参数                                                         | 响应 | 名称              | 描述                                                         |
| ------ | ------------------------------------------------------------ | ---- | ----------------- | ------------------------------------------------------------ |
| CMD17  | \[31:0\]：数据地址，单位：字节（SDSC），单位:512字节（SDHC） | R1   | READ_SINGLE_BLOCK | 读取一个块的数据，参数为块的首地址。块的长度由CMD16设置，对于高容量卡，块大小固定为512字节 |

通过发送CMD17（READ_SINGLE_BLOCK）命令，让SD卡按照参数的地址返回一个块的数据。当发生错误的时候，SD卡会响应一个数据错误令牌。
![SD卡-SPI模式单次读操作.png](https://mirror.simgor.cn/typecho_img/2023/02/3935951914.png)

# 连续数据块

| 命令号 | 参数                                                         | 响应 | 名称                | 描述                                                         |
| ------ | ------------------------------------------------------------ | ---- | ------------------- | ------------------------------------------------------------ |
| CMD18  | \[31:0\]：数据地址，单位：字节（SDSC），单位:512字节（SDHC） | R1   | READ_MULTIPLE_BLOCK | 连续读取多块数据，直到主机发送CMD12命令，参数为块的首地址。块的长度由CMD16设置，对于高容量卡，块大小固定为512字节 |

与单次读扇区相似，通过发送CMD18（READ_MULTIPLE_BLOCK）命令，让SD卡按照参数指定的地址开始连续返回数据块，需要停止读取时，MCU发送CMD12（STOP_TRANSMISSION）命令停止读取。当发生错误的时候，SD卡会响应一个数据错误令牌。
![SD卡-SPI模式连续读数据块.png](https://mirror.simgor.cn/typecho_img/2023/02/2657434650.png)

# 数据错误令牌格式

与R2令牌的内容相似，长度为1字节，其中高4位固定为0。在发送命令CMD17、CMD18之后，如果响应的R1令牌指示发生错误，SD卡将继续响应该令牌。
![数据错误令牌格式.png](https://mirror.simgor.cn/typecho_img/2023/02/3992104664.png)

# 如果需要评论

因为是个人博客，因备案要求不能使用交互服务，如果需要评论，可以前往本文的CSDN页：
[CSDN-SD卡 SPI模式操作（2）读操作](https://blog.csdn.net/Simgo/article/details/128825969)
