读写注意事项
SD 卡的读写要分情况,虽然每次读写都是以块为单位,但是 SD 卡的指令寻址有区分,指令寻址就是命令的参数部分,如下图的 CMD17 命令的 data address 部分


从数据手册可以看出,这个寻址方式在 SDSC(<=2GB)上是按字节寻址,在 SDHC(4GB-32GB) 和 SDXC(64GB-2TB) 上是按块寻址,具体是什么类型的卡,可以通过读取 OCR 寄存器的 CCS 位的得知
读写时的每个块的大小可以通过 CMD16 进行设置,默认是 512 字节
SD 卡的读
SD 卡读块分为单块读取和连续读取
单块读(CMD17)和多块读(CMD18)其实操作差不多,时序图如下

读相关的令牌描述如下

具体操作顺序如下
- 发送读命令
- 连续读,等待 SD 卡发送 0xfe
- 连续读 512 字节
- 读取末尾2字节 CRC
- 需要连续读时重复 2-4 步骤,末尾发送 CMD12
具体实现代码如下
void recv_datablock(u8 *data_buf, u32 block_len)
{
u32 cnt = 0;
while (spi_read_byte() != 0xfe);
while (cnt < block_len) data_buf[cnt++] = spi_read_byte();
spi_send_clock(2*8);
}
void sd_read_blocks(u8 *data_buf, u32 sector, u32 count)
{
u32 tmp_cnt = 0;
sd_send_cmd_spi_enter

本文详细介绍了SD卡通过SPI接口进行读写块操作的注意事项和步骤,包括SD卡的字节寻址与块寻址的区别,CMD17和CMD18的单块读取与连续读取,以及CMD24和CMD25的单块写入和连续写入。内容涵盖了操作顺序、时序图和实现代码示例。
最低0.47元/天 解锁文章
4216

被折叠的 条评论
为什么被折叠?



