嵌入式开发中经常会用到对外部SD卡进行相关的读写操作。下图是CPU硬件连接示意图
CPU硬件连接引脚配置瑞如下:
void SD_LowLevel_DeInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*!< Disable SDIO Clock */
SDIO_ClockCmd(DISABLE);
/*!< Set Power State to OFF */
SDIO_SetPowerState(SDIO_PowerState_OFF);
/*!< DeInitializes the SDIO peripheral */
SDIO_DeInit();
/*!< Disable the SDIO AHB Clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SDIO, DISABLE);
/*!< Configure PC.08, PC.09, PC.10, PC.11, PC.12 pin: D0, D1, D2, D3, CLK pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*!< Configure PD.02 CMD line */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
DMA部分配置如下:
void SD_LowLevel_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_ClearFlag(SD_SDIO_DMA_FLAG_TC | SD_SDIO_DMA_FLAG_TE | SD_SDIO_DMA_FLAG_HT | SD_SDIO_DMA_FLAG_GL);
/*!< DMA2 Channel4 disable */
DMA_Cmd(SD_SDIO_DMA_CHANNEL, DISABLE);
/*!< SDIO DMA CHANNEL Config */
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferSRC;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = BufferSize / 4;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(SD_SDIO_DMA_CHANNEL, &DMA_InitStructure);
DMA_ITConfig(SD_SDIO_DMA_CHANNEL, DMA_IT_TC, ENABLE);
/*!< SDIO DMA CHANNEL enable */
DMA_Cmd(SD_SDIO_DMA_CHANNEL, ENABLE);
}
void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_ClearFlag(SD_SDIO_DMA_FLAG_TC | SD_SDIO_DMA_FLAG_TE | SD_SDIO_DMA_FLAG_HT | SD_SDIO_DMA_FLAG_GL);
/*!< SDIO DMA CHANNEL disable */
DMA_Cmd(SD_SDIO_DMA_CHANNEL, DISABLE);
/*!< SDIO DMA CHANNEL Config */
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferDST;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = BufferSize / 4;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(SD_SDIO_DMA_CHANNEL, &DMA_InitStructure);
DMA_ITConfig(SD_SDIO_DMA_CHANNEL, DMA_IT_TC, ENABLE);
/*!< SDIO DMA CHANNEL enable */
DMA_Cmd(SD_SDIO_DMA_CHANNEL, ENABLE);
}
uint32_t SD_DMAEndOfTransferStatus(void)
{
return (uint32_t)DMA_GetFlagStatus(DMA2_FLAG_TC4);
}
SDIO函数中断部分
///sd卡状态判断
void SDCARD_Config(void)
{
SD_Error Status = SD_OK;
Status = SD_Init(); //初始化SDIO
if (Status != SD_OK)
{
Display_ErrorWithoutSD((u8 *)"No_SDCard");
}
SDCARD_NVIC_Config();
}
//中断配置 部分
void SDCARD_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中断函数
void SDIO_IRQHandler(void)
{
/* Process All SDIO Interrupt Sources */
SD_ProcessIRQSrc();
}
审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
嵌入式
+关注
关注
5186文章
20146浏览量
328804 -
SD卡
+关注
关注
2文章
583浏览量
67786
发布评论请先 登录
相关推荐
热点推荐
SD NAND、TF卡、SD卡的应用领域大揭秘
在如今这个数据爆炸的时代,各类存储设备犹如繁星般闪耀,而SD NAND、TF卡和SD卡更是其中的佼佼者。它们看似相似,实则各有千秋,在不同的领域和场景中发挥着独特的作用。今天,就让我们
解锁SD NAND、TF卡、SD卡的应用密码
在科技飞速发展的今天,数据存储的需求渗透到生活与工作的每一个角落——从手腕上的智能手表,到专业摄影师的相机,再到工厂里的工业路由器,都离不开高效可靠的存储介质。SD NAND、TF卡和SD卡
深度剖析Nios II 处理器的硬件抽象层
)与ANSI C标准库综合在一起,可使用类似C语言的库函数来访问硬件设备或文件,如printf()、fopen()、fwrite()等函数。软件工程师可非常方便的使用这些函数来与底层
如何将SD卡驱动模块挂载至外设总线
我们的队伍编号是CICC2962,这是我们第五次分享,接下来我将分享一下如何将SD卡驱动模块挂载至外设总线上,并且发送一条读指令。
这是外设总线上被保留的接口信号,我们将所写的代码与
发表于 10-30 06:12
解锁存储密码:SD NAND、TF卡、SD卡的应用全景
在数据洪流的时代,存储介质就如同数字世界的基石,支撑着各类设备的正常运转。SD NAND、TF卡和SD卡,虽同属NAND Flash存储介质家族,却因各自独特的“个性”,在不同领域绽放
SD卡初始化原理讲解与实现
分享内容:SD卡
我们对 SD 的读写协议一般有 SPI 模式和SDIO 模式两种,由于SPI 在芯片管脚上只占用四根线,而且SPI实现SD
发表于 10-29 06:33
CS创世SD NAND在北京君正平台和瑞芯微RK平台的应用
,并为HOST 层的驱动提供了接口函数
3.host 层: 是这个文件夹属于 Linux 内核中 MMC/SD 子系统 的
发表于 08-22 17:01
SDIO SD卡电路设计速成攻略:核心步骤+调试技巧 !
针对时间紧迫的开发者,本攻略直击SDIO外接SD卡电路设计的核心步骤,并补充实用调试技巧,帮助你在最短时间完成从理论到可用的电路实现。 今天一起来聊聊 SDIO外接SD
使用 emfile 库读取/写入外部 SD 卡遇到的问题求解
我正在使用 emfile 库读取/写入外部 SD 卡,但遇到了一个挑战,那就是 emfile 库没有 SPI 驱动程序。有人可以帮我实现一个 spi
发表于 08-04 07:42
【嵌入式开发】SD卡—雷龙 SD NAND
完全相同的代码驱动
三、SDIO模式
1.SD卡常用命令介绍
SD总线上的通信基于命令和数据位流传输。
命令 :应用相关命令(ACMD)
发表于 07-21 17:56
【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙贴片SD卡)
5. 系统实现
5.1 系统架构
5.2 硬件连接与调试
6. 实验与测试
6.1 实验方案设计
6.2 实验过程
6.2.1 SD
发表于 05-09 16:11
Nand flash 和SD卡(SD NAND)存储扇区分配表异同
NAND)接口与主机设备连接,主机设备通过文件系统接口来访问 SD卡(SD NAND),对存储扇区分配表的操作是通过文件系统的函数和接口来间接实现
发表于 03-13 10:45

基于库函数的SD卡硬件驱动层代码实现方案
评论