运用SD卡第一步,认识SDIO接口
做毕业设计需要用到大量的音频文件,一般的存储器满足不了存储要求,故选择SD卡作为存储器件。在这里记录一下自己的学习经历,学习一个新的IC,无非是要么根据时序图写出Read和Write函数,要么是根据通信总线和IC相关操作指令去完成Read和Write函数。只有能与对应IC“说话”,我们才能去开发它更多地可能性。这里以原子探索者为例,为大家介绍一下SD卡相关知识。
简要的介绍一下什么是SDIO接口
SDIO与外围设备的命令与响应均是通过SDIO_CMD来完成的。这里我们可以调用SDIO_SendCommand()这个库函数,用来通过SDIO总线的SDIO_CMD以SDIO_CK这样的频率,对外围设备如SD卡发送CMD命令,并且可以获取响应数据。
SDIO_InitStructure.SDIO_ClockDiv = SDIO_INIT_CLK_DIV; /* HCLK = 72MHz, SDIOCLK = 72MHz, SDIO_CK = HCLK/(178 + 2) = 400 KHz */ SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable; //不使用bypass模式,直接用HCLK进行分频得到SDIO_CK SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; // 空闲时不关闭时钟电源 SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b; //1位数据线 SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;//硬件流 SDIO_Init(&SDIO_InitStructure);
这里SDIO_INIT_CLK_DIV = 0x76,计算一下就可以知道SDIO_CK的时钟为400KHz,数据宽度为1位。看到这里大家能可会问,这么慢的频率,这么短的数据传输位数,传输的效率能高吗?其实这里对SD卡的初始化只是为了激活SD卡,开启SDIO总线与SD卡之间的通信。真正的初始化需要一大串命令。
初始化完以后我们需要使能SDIO_CK这个时钟,SDIO->CLKCR|=1<<8; 这个寄存器我们后面再说。
SD卡与SDIO的接口
SDIO的命令与响应
SDIO的命令分为:应用相关命令(ACMD)和通用命令(CMD)两部分。发送ACMD时,需先发送CMD55。
这样一看SD卡的初始化其实就是一个端口的发送和接收,是不是感觉简单了很多呢?
SD卡读写多块数据过程
读取多块数据过程


怎么说呢,就是我们发送命令,然后接收到响应的响应后通过SDIO_D数据线接收来自SD卡的数据,直到发送了STOP命令。
写入多块数据过程


至此,SD卡基本的初始化和读写信息已经介绍完毕了,SDIO总线的通信方式相信大家也很了解了,但是SD卡本身是一个非常复杂的存储IC,下一篇文章我将介绍SD卡初始化和读写数据的详细步骤。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210587.html原文链接:https://javaforall.net
