历史上的今天
今天是:2024年12月26日(星期四)
2018年12月26日 | STM32笔记--SDIO(SD卡读取)
2018-12-26 来源:eefocus
学习这里首先要了解一下SD卡基本资料:


SD卡的协议部分太多,也比较复杂,建议资料:《Simplified_Physical_Layer_Spec.pdf》其主要复杂在繁多的命令,一共有64个命令,各个命令代表什么可查资料。



关于这里大部分都是熟悉函数然后直接调用库就行,但还是需要每个函数都去读一下的,后面会有具体函数的使用实例,到时候再补充。
我们代码中一般用到的是ARM官方给的SD卡的库,但是库中存在问题,SD_Error SD_ReadBlock()缺少代码:(有标注,可直接替换)
SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize)
{
SD_Error errorstatus = SD_OK;
#if defined (SD_POLLING_MODE)
uint32_t count = 0, *tempbuff = (uint32_t *)readbuff;
#endif
TransferError = SD_OK;
TransferEnd = 0; //传输结束标置位,在中断服务置1
StopCondition = 0; //怎么用的?
SDIO->DCTRL = 0x0;
if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)
{
BlockSize = 512;
ReadAddr /= 512;
}
/*******************add,没有这一段容易卡死在DMA检测中*************************************/
/* Set Block Size for Card,cmd16,
* 若是sdsc卡,可以用来设置块大小,
* 若是sdhc卡,块大小为512字节,不受cmd16影响
*/
SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize;
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; //r1
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdResp1Error(SD_CMD_SET_BLOCKLEN);
if (SD_OK != errorstatus)
{
return(errorstatus);
}
/*********************************************************************************/
SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
SDIO_DataInitStructure.SDIO_DataLength = BlockSize;
SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) 9 << 4;
SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
SDIO_DataConfig(&SDIO_DataInitStructure);
/*!< Send CMD17 READ_SINGLE_BLOCK */
SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)ReadAddr;
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdResp1Error(SD_CMD_READ_SINGLE_BLOCK);
if (errorstatus != SD_OK)
{
return(errorstatus);
}
#if defined (SD_POLLING_MODE)
/*!< In case of single block transfer, no need of stop transfer at all.*/
/*!< Polling mode */
while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)))
{
if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET)
{
for (count = 0; count < 8; count++)
{
*(tempbuff + count) = SDIO_ReadData();
}
tempbuff += 8;
}
}
if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
{
SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
errorstatus = SD_DATA_TIMEOUT;
return(errorstatus);
}
else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
{
SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
errorstatus = SD_DATA_CRC_FAIL;
return(errorstatus);
}
else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)
{
SDIO_ClearFlag(SDIO_FLAG_RXOVERR);
errorstatus = SD_RX_OVERRUN;
return(errorstatus);
}
else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
{
SDIO_ClearFlag(SDIO_FLAG_STBITERR);
errorstatus = SD_START_BIT_ERR;
return(errorstatus);
}
while (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)
{
*tempbuff = SDIO_ReadData();
tempbuff++;
}
/*!< Clear all the static flags */
SDIO_ClearFlag(SDIO_STATIC_FLAGS);
#elif defined (SD_DMA_MODE)
SDIO_ITConfig(SDIO_IT_DATAEND, ENABLE);
SDIO_DMACmd(ENABLE);
SD_DMA_RxConfig((uint32_t *)readbuff, BlockSize);
#endif
return(errorstatus);
}
史海拾趣
|
近年来,基于计算机软硬件技术的自动化技术发展到了一个新的水平,并显现出了强劲的生命力和应用前景,可以肯定,基于计算机网络技术的自动控制技术将是今后一段时期的应用主流。 与西方发达国家相比,自动化技术在我国汽车行业的应用总体上处于起 ...… 查看全部问答> |
|
开启PB5.0出错unable to initialize the catalog 最近我在acer笔记本上面安装了PB5.0。安装完成以后,一打开就跳出unable to initialize the catalog的错误对话框。然后再PB的主界面打开manager catalog item,里面什么都没有。也不能创建工程。 请问各位大侠,有没有遇到此问题的?谢谢 … 查看全部问答> |
|
本从现在有大量的空闲时间,现在承接与fpga相关的项目,欢迎有相关项目外包的人与我联系QQ:774615731,email:szfpga@gmail.com 项 目 经 验 2008/7--2009/2:国标地面数字电视(DMB-TH)调制器 软件环境: window xp ...… 查看全部问答> |
|
我想自学单片机,在网上看了下,都说不推荐买开发板,最好自己做,请问有什么教程或者书是从组建最小系统开始讲的? 还有要买些什么元件?我们学校这里不知道哪有电子市场,所以打算在网上一次买齐,求教需要哪些元件,还有数量。… 查看全部问答> |
|
我用DMA发送和接收,如果设定Usart3接收30字节,我要连续给他发送超过30个字节,下次我再设定接收的时候无论如何都再也一个字节都接收不了了,查看各个DMA和串口相关寄存器的状态也都是打开的。但是发送依然是正常的。如果我每次接收完之后再 ...… 查看全部问答> |
|
我要用12864LCD显示一些2430的数据,就用了2430的IO口P1(接了上拉电阻)驱动LCD显示屏(型号:HJ12864ZW),采用的是串行连接方式,经示波器检测控制时序没有问题,可是显示屏就是对任何命令都没有响应,不 ...… 查看全部问答> |
|
实时数字信号处理、超大规模集成电路技术的飞速发展,不断地推动着数字信号处理器性能的提高,使其在信号处理、军事及民用电子技术领域发挥着越来越重要的作用,其应用广度和深度也在不断地扩展和深化。数字信号处理相对于模拟信号处理有很大的优越 ...… 查看全部问答> |




