MSP430 SD卡SPI读写操作(2) —— SD卡SPI操作流程

转载:MSP430 SD卡SPI读写操作(2) —— SD卡SPI操作流程

本节介绍SD卡SPI模式基本操作流程,包括初始化、读和写的相关命令和操作流程。

一、SPI模式
二、RESET(SD卡复位)
三、SD卡初始化
四、SD卡读单块
五、SD卡读多块
六、SD卡写单块
七、SD卡写多块

一、SPI模式

SD卡SPI模式需要SD卡作为从机,MCU作为主机进行通信。可以采用三线SPI(SCLK,MISO,MOSI)外加一个片选信号线CS来进行控制和通信。需要注意一下几点:
1、SD卡的初始化速度不能大于400KHz,即复位和初始化过程SPI的速率要限制在400KHz以下,在实际测试过程中,即使速率小于400KHz,也会出现一定几率的初始化失败,最后在多次尝试后将速率设置在125KHz后比较稳定,不知道是不是和电路有关系。
2、SPI的极性 = 1 相位 = 0
3、向SD卡写入命令的过程为
(1) 拉低CS
(2) 向SD卡写入指令,然后附加发送8个时钟,使SD卡完成此次操作
(3) 接收SD卡响应
(4) 拉高CS,然后附加发送8个时钟
4、发送 ACMD 指令时,需要首先发送 CMD55 告诉SD卡下一条指令为应用程序特定指令( ACMD 指令)。

二、RESET(SD卡复位)

SD卡在上电后是处于SD模式,RESET命令使其进入SPI模式。具体流程为:
1、拉高CS,发送至少74个时钟周期使SD卡稳定
2、拉低CS,发送CMD0
3、由第一节知CMD0返回R1,需要收到回应0x01表示 in idle state
4、拉高CS,附加发送8个时钟
后面的操作因为CS的操作没有特殊情况,因此不列出了。

三、SD卡初始化

SD卡初始化可以使用CMD1 和 ACMD41 两种方式。官方文档不推荐CMD1方式,原因有两个:一是对于1.4mm厚的标准尺寸SD卡,CMD1是非法的指令;二是因为ACMD41可以很容易的区分SD卡和MMC卡。在这里只介绍ACMD41初始化方式。
1、发送CMD55,收到0x01表示 in idle state
2、发送ACMD41,返回R1,在这里R1的in idle state用来表示SD卡是否处于初始化状态,因此需要循环读取直到0x00

四、SD卡读单块

1、发送CMD17,收到0x00表示发送成功
2、连续读取知道读到0xFE
3、读一个block (通常为512字节)
4、读两个CRC字节

五、SD卡读多块

1、发送CMD18,收到0x00表示发送成功
2、连续读直到读到0xFE
3、读一个block (通常为512字节)
4、读两个CRC字节
5、如果要读取下一个block,重复步骤2-4
6、发送CMD12来停止读多块操作

六、SD卡写单块

1、发送CMD24,收到0x00表示发送成功
2、发送若干时钟
3、发送写开始标志0xFE
4、发送一个block (通常为512字节)
5、发送两个CRC字节
6、连续读直到读到二进制 xxx00101表示数据写入成功
7、连续读忙检测,直到读到0xFF表示操作完成

七、SD卡写多块

1、发送CMD25,收到0x00表示发送成功
2、发送若干时钟
3、发送写开始标志0xFC
4、发送一个block (通常为512字节)
5、发送两个CRC字节
6、连续读直到读到二进制 xxx00101表示数据写入成功
7、如果想写下一个block,则重复步骤2 - 6
8、发送写停止标志 0xFD 来停止写操作
7、连续读忙检测,直到读到0xFF表示操作完成

本节介绍SD卡SPI模式基本操作流程,包括初始化、读和写的相关命令和操作流程。

一、SPI模式
二、RESET(SD卡复位)
三、SD卡初始化
四、SD卡读单块
五、SD卡读多块
六、SD卡写单块
七、SD卡写多块

一、SPI模式

SD卡SPI模式需要SD卡作为从机,MCU作为主机进行通信。可以采用三线SPI(SCLK,MISO,MOSI)外加一个片选信号线CS来进行控制和通信。需要注意一下几点:
1、SD卡的初始化速度不能大于400KHz,即复位和初始化过程SPI的速率要限制在400KHz以下,在实际测试过程中,即使速率小于400KHz,也会出现一定几率的初始化失败,最后在多次尝试后将速率设置在125KHz后比较稳定,不知道是不是和电路有关系。
2、SPI的极性 = 1 相位 = 0
3、向SD卡写入命令的过程为
(1) 拉低CS
(2) 向SD卡写入指令,然后附加发送8个时钟,使SD卡完成此次操作
(3) 接收SD卡响应
(4) 拉高CS,然后附加发送8个时钟
4、发送 ACMD 指令时,需要首先发送 CMD55 告诉SD卡下一条指令为应用程序特定指令( ACMD 指令)。

二、RESET(SD卡复位)

SD卡在上电后是处于SD模式,RESET命令使其进入SPI模式。具体流程为:
1、拉高CS,发送至少74个时钟周期使SD卡稳定
2、拉低CS,发送CMD0
3、由第一节知CMD0返回R1,需要收到回应0x01表示 in idle state
4、拉高CS,附加发送8个时钟
后面的操作因为CS的操作没有特殊情况,因此不列出了。

三、SD卡初始化

SD卡初始化可以使用CMD1 和 ACMD41 两种方式。官方文档不推荐CMD1方式,原因有两个:一是对于1.4mm厚的标准尺寸SD卡,CMD1是非法的指令;二是因为ACMD41可以很容易的区分SD卡和MMC卡。在这里只介绍ACMD41初始化方式。
1、发送CMD55,收到0x01表示 in idle state
2、发送ACMD41,返回R1,在这里R1的in idle state用来表示SD卡是否处于初始化状态,因此需要循环读取直到0x00

四、SD卡读单块

1、发送CMD17,收到0x00表示发送成功
2、连续读取知道读到0xFE
3、读一个block (通常为512字节)
4、读两个CRC字节

五、SD卡读多块

1、发送CMD18,收到0x00表示发送成功
2、连续读直到读到0xFE
3、读一个block (通常为512字节)
4、读两个CRC字节
5、如果要读取下一个block,重复步骤2-4
6、发送CMD12来停止读多块操作

六、SD卡写单块

1、发送CMD24,收到0x00表示发送成功
2、发送若干时钟
3、发送写开始标志0xFE
4、发送一个block (通常为512字节)
5、发送两个CRC字节
6、连续读直到读到二进制 xxx00101表示数据写入成功
7、连续读忙检测,直到读到0xFF表示操作完成

七、SD卡写多块

1、发送CMD25,收到0x00表示发送成功
2、发送若干时钟
3、发送写开始标志0xFC
4、发送一个block (通常为512字节)
5、发送两个CRC字节
6、连续读直到读到二进制 xxx00101表示数据写入成功
7、如果想写下一个block,则重复步骤2 - 6
8、发送写停止标志 0xFD 来停止写操作
7、连续读忙检测,直到读到0xFF表示操作完成

猜你喜欢

转载自blog.csdn.net/redgragon0/article/details/81274016