0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-06-14 17:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式开发中经常会用到对外部SD卡进行相关的读写操作。下图是CPU硬件连接示意图

poYBAGKoTYqAQogKAAKby66bF-c220.pngCPU硬件连接

引脚配置瑞如下:

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、TFSD的应用领域大揭秘

    在如今这个数据爆炸的时代,各类存储设备犹如繁星般闪耀,而SD NAND、TFSD更是其中的佼佼者。它们看似相似,实则各有千秋,在不同的领域和场景中发挥着独特的作用。今天,就让我们
    的头像 发表于 11-30 15:16 401次阅读
    <b class='flag-5'>SD</b> NAND、TF<b class='flag-5'>卡</b>、<b class='flag-5'>SD</b><b class='flag-5'>卡</b>的应用领域大揭秘

    解锁SD NAND、TFSD的应用密码

    在科技飞速发展的今天,数据存储的需求渗透到生活与工作的每一个角落——从手腕上的智能手表,到专业摄影师的相机,再到工厂里的工业路由器,都离不开高效可靠的存储介质。SD NAND、TFSD
    的头像 发表于 11-24 11:04 238次阅读
    解锁<b class='flag-5'>SD</b> NAND、TF<b class='flag-5'>卡</b>、<b class='flag-5'>SD</b><b class='flag-5'>卡</b>的应用密码

    深度剖析Nios II 处理器的硬件抽象

    )与ANSI C标准库综合在一起,可使用类似C语言的库函数来访问硬件设备或文件,如printf()、fopen()、fwrite()等函数。软件工程师可非常方便的使用这些函数来与底层
    的头像 发表于 10-31 15:25 4508次阅读
    深度剖析Nios II 处理器的<b class='flag-5'>硬件</b>抽象<b class='flag-5'>层</b>

    如何将SD驱动模块挂载至外设总线

    我们的队伍编号是CICC2962,这是我们第五次分享,接下来我将分享一下如何将SD驱动模块挂载至外设总线上,并且发送一条读指令。 这是外设总线上被保留的接口信号,我们将所写的代码
    发表于 10-30 06:12

    解锁存储密码:SD NAND、TFSD的应用全景

    在数据洪流的时代,存储介质就如同数字世界的基石,支撑着各类设备的正常运转。SD NAND、TFSD,虽同属NAND Flash存储介质家族,却因各自独特的“个性”,在不同领域绽放
    的头像 发表于 10-29 14:24 214次阅读

    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
    的头像 发表于 08-15 14:32 496次阅读
    SDIO <b class='flag-5'>SD</b><b class='flag-5'>卡</b>电路设计速成攻略:核心步骤+调试技巧 !

    使用 emfile 库读取/写入外部 SD 遇到的问题求解

    我正在使用 emfile 库读取/写入外部 SD ,但遇到了一个挑战,那就是 emfile 库没有 SPI 驱动程序。有人可以帮我实现一个 spi
    发表于 08-04 07:42

    SD—雷龙 SD NAND

    一、SD介绍 1.基本介绍 本质:nand flash + 控制芯片 1.SD ,Secure Digital Card,称为安全数字
    的头像 发表于 07-21 17:59 3234次阅读
    <b class='flag-5'>SD</b><b class='flag-5'>卡</b>—雷龙 <b class='flag-5'>SD</b> NAND

    【嵌入式开发】SD—雷龙 SD NAND

    完全相同的代码驱动 三、SDIO模式 1.SD常用命令介绍 SD总线上的通信基于命令和数据位流传输。 命令 :应用相关命令(ACMD)
    发表于 07-21 17:56

    第二十五章 SDIO——SD读写测试

    本章介绍了W55MH32的SDIO接口,其可与SD 等通信,采用9针接口,分识别与数据传输模式。还提及SDIO功能框图、初始化结构体,并有SD
    的头像 发表于 06-20 14:01 1625次阅读
    第二十五章 SDIO——<b class='flag-5'>SD</b><b class='flag-5'>卡</b>读写测试

    贴片式SD如何在STM32硬件实现高效日志记录#贴片式sd #贴片式tf #stm32 #硬件

    硬件
    深圳市雷龙发展有限公司
    发布于 :2025年06月18日 17:10:22

    【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 和SDSD NAND)存储扇区分配表异同

    NAND)接口与主机设备连接,主机设备通过文件系统接口来访问 SDSD NAND),对存储扇区分配表的操作是通过文件系统的函数和接口来间接实现
    发表于 03-13 10:45