SD卡初始化流程

SD/MMC 初始化流程

步骤是:1)配置时钟,慢速一般为400K,设置工作模式

        2)发送CMD0,进入空闲态,该指令没有反馈

3)发送CMD8,如果有反应,CRC值与发送的值相同,说明该卡兼容SD2.0协议。

        4)发送CMD55+ACMD41,判断SD卡的上电是否正确,短反馈成功说明该卡为SD卡(短反馈第31位置1为HC卡),否则发送CMD0,有反应说明是MMC卡

        5)发送CMD2,验证SD卡是否接入,长反馈(CID)

        6)发送CMD3,读取SD卡的RCA(地址),短反馈

7)发送CMD9,读取CSD寄存器获取卡的相关信息

        8)发送CMD7,使能SD卡

        9)配置高速时钟,准备数据传输,一般20M~25M

10)发送CMD55+ACMD51读取SCR寄存器,SD卡可以通过该值获得位宽,如果是MMC卡则需要使用主线测试来确定卡的位宽。

11)SD卡发送CMD55+ACMD6配置为4bit数据传输模式(根据SCR读出来的值确定),MMC卡发送CMD6来设置位宽

12)发送CMD7,使能SD卡,使其进入传输状态),接着发送CMD16设置块大小(根据前面读取的CSD信息确定)。

13) 把命令参数设置为0,再次发送CMD7,取消选中所有卡。

 

SD 读操作(注意:标准卡和HC卡最大区别在于单块或者多块读写时命令的起始地址参数对齐,标准卡是以字节计算为起始地址的,而HC则按块地址作为起始地址.例如,一般情况下从CSD获取的卡信息中,块长度都为512字节大小,那么要访问第一个512字节时,对于标准卡,命令的参数直接写512,而HC卡则写1.另外,标准卡所使用的SD协议有可能是1.0也有可能是2.0,但是HC的卡就一定是2.0的,大部分的SD卡都是2.0的,而最新的XC卡则使用3.0的协议.)

步骤是:1)发送CMD7,以卡的相对地址为参数,选中该卡,并使其进入Tran状态

        2)发送CMD17/CMD18,命令的参数需要根据初始化时所判断的卡类型填写,按字节或按块.

3)循环读取数据

        4)发送CMD12,强制停止所有传输.

        5)发送CMD7,以0作为命令参数,取消所有选中.

### STM32通过SPI接口初始化SD流程 #### 1. 配置硬件连接 确保STM32与SD之间的物理连线正确无误。通常情况下,需要连接MISO、MOSI、SCK以及CS四条线到相应的GPIO引脚上[^1]。 #### 2. 设置时钟频率 为了保证通信稳定性和速度,需合理配置SPI模块的工作时钟。一般建议设置为主频的一半或更低一些,具体取决于所使用的MCU型号及其性能指标。 #### 3. 初始化SPI外设 利用HAL库函数`HAL_SPI_Init()`完成对外设寄存器的基础设定工作;在此之前还需调用`MX_SPIx_Init()`来指定具体的参数选项,比如数据帧格式(Data Frame Format),波特率(Baud Rate Prescaler)等。 ```c // SPI初始化结构体定义 static void MX_SPI1_Init(void) { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; // 主模式 hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 双向传输 hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 数据大小为8位 hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // SCLK空闲状态低电平 hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // 第一跳变沿采样 hspi1.Init.NSS = SPI_NSS_SOFT; // 软件管理NSS信号 hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; // 波特率预分频系数 hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // MSB先行 hspi1.Init.TIMode = SPI_TIMODE_DISABLE; // 禁用TI模式 hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // 关闭CRC校验 HAL_SPI_Init(&hspi1); } ``` #### 4. 发送命令序列给SD 按照标准协议发送一系列指令以唤醒并准备SD进入就绪状态。这期间可能涉及到CMD0, CMD8, ACMD41等多个特定类型的请求消息传递过程。 - **CMD0**: 复位SD至idle态; - **CMD8**: 查询支持电压范围(仅适用于v2.x及以上版本); - **ACMD41**: 获取OCR寄存器内容直到返回有效响应为止; 当上述操作完成后即表明SD已被成功激活可以正常访问了。 #### 5. 检查错误条件 在整个初始化过程中应当密切关注来自设备端反馈的信息,一旦发现异常情况立即采取相应措施加以处理,防止后续读写动作受到影响而失败。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值