STM32 USB SD读卡器(SDIO)

发布者:AngelicJourney最新更新时间:2020-10-29 来源: eefocus关键字:STM32  USB  SD读卡器  SDIO 手机看文章 扫描二维码
随时随地手机看文章

这次是做一个SD卡的USB读卡器的功能,我们就在上次NAND Flash模拟出的U盘的工程上修改了,这样的话只要修改一小部分了。

工程的绝大部分不需要修改,只要将fsmc_nand.c文件移除工程,添加上官方的关于SDIO的SD卡的驱动代码文件stm32_eval_sdio_sd.c,我讨厌出现eval,所以将该文件直接改为sdio_sdcard.c。同时,既然我们使用SDIO来驱动SD卡,所以在外设库文件组里要添加stm32_sdio.c文件,否则会出现很多未定错误。

STM32 USB SD读卡器(SDIO) 

 

我们接下去修改的就只有mass_mal.c这个文件了。更NAND Flash工程一样,我们改成简洁点:

uint32_t Mass_Memory_Size[2];

uint32_t Mass_Block_Size[2];

uint32_t Mass_Block_Count[2];

__IO uint32_t Status = 0;


#ifdef USE_STM3210E_EVAL

SD_CardInfo SDCardInfo;

#endif


/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/

/*******************************************************************************

* Function Name  : MAL_Init

* Description    : 初始化STM32的媒体设备

* Input          : lun

* Output         : None

* Return         : None

*******************************************************************************/

uint16_t MAL_Init(uint8_t lun)

{

  uint16_t status = MAL_OK;


  switch (lun)

  {

    case 0:    //SD卡

      Status = SD_Init();  //调用SD初始化函数

      break;

    default:

      return MAL_FAIL;    //都不是

  }

  return status;

}


uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length)

{

  switch (lun)

  {

    case 0:

      Status = SD_WriteBlock((uint8_t*)Writebuff, Memory_Offset, Transfer_Length);

      SD_WaitWriteOperation();     //等待dma传输结束

      while(SD_GetStatus() != SD_TRANSFER_OK); //等待sdio到sd卡传输结束

      if ( Status != SD_OK )

      {

        return MAL_FAIL;

      }      

      break;

    default:

      return MAL_FAIL;

  }

  return MAL_OK;

}


uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length)

{


  switch (lun)

  {

    case 0:

      Status = SD_ReadBlock((uint8_t*)Readbuff, Memory_Offset, Transfer_Length);

     SD_WaitReadOperation();  //循环查询dma传输是否结束  


     while(SD_GetStatus() != SD_TRANSFER_OK);

      if ( Status != SD_OK )

      {

        return MAL_FAIL;

      }    

      break;

    default:

      return MAL_FAIL;

  }

  return MAL_OK;

}


uint16_t MAL_GetStatus (uint8_t lun)

{

  uint32_t temp_block_mul = 0;

  uint32_t DeviceSizeMul = 0;

  if (lun == 0)

  {

#ifdef USE_STM3210E_EVAL

    if (SD_Init() == SD_OK)

    {

      SD_GetCardInfo(&SDCardInfo);

      SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << 16));

      DeviceSizeMul = (SDCardInfo.SD_csd.DeviceSizeMul + 2);


      if(SDCardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)

      {

        Mass_Block_Count[0] = (SDCardInfo.SD_csd.DeviceSize + 1) * 1024;

      }

      else

      {

        NumberOfBlocks  = ((1 << (SDCardInfo.SD_csd.RdBlockLen)) / 512);

        Mass_Block_Count[0] = ((SDCardInfo.SD_csd.DeviceSize + 1) * (1 << DeviceSizeMul) << (NumberOfBlocks/2));

      }

      Mass_Block_Size[0]  = 512;


      Status = SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << 16)); 

      Status = SD_EnableWideBusOperation(SDIO_BusWide_4b); 

      if ( Status != SD_OK )

      {

        return MAL_FAIL;

      }

      Mass_Memory_Size[0] = Mass_Block_Count[0] * Mass_Block_Size[0];

      LED2_ON();

      return MAL_OK;

    }

    else

   {

LED2_OFF();

    }

  }

  return MAL_FAIL;

}


  

这样SDIO接口的SD卡读卡器就修改完毕了。我使用8G的SD卡测试的,不知道为什么写这么慢,才60KB/秒左右,读的速度为230KB/秒左右。

STM32 USB SD读卡器(SDIO) - ziye334 - ziye334的博客 STM32 USB SD读卡器(SDIO) 


关键字:STM32  USB  SD读卡器  SDIO 引用地址:STM32 USB SD读卡器(SDIO)

上一篇:STM32 USB SD卡读卡器和NAND FLASH模拟U盘
下一篇:STM32 USB 大容量存储器Mass Storage工程的讲解

推荐阅读最新更新时间:2024-11-07 11:58

纽约即将推出高科技公交系统:WiFi覆盖、USB充电口、LCD显示屏
    3月10日,纽约州州长安德鲁-库默(Andrew Cuomo)曾在上月宣布,纽约大都市圈的公共交通系统将迎来一次重大更新,纽约政府将总计斥资13亿美元购买2042辆全新的公交车来满足新时代的需求。     不过从现在的情况来看,纽约市民或许很快便能体验到这一全新高科技公交车了,因为有消息称纽约大都会运输署(Metropolitan Transportation Authority,MTA)有望在今年第二、第三季度就率先在纽约皇后区投入使用70辆全新公交车。       据悉,这些公交车将拥有Wifi覆盖、多达55个USB充电口以及可显示丰富互动公交、换乘信息的LCD显示屏幕。其中,这一新型电子数字信息告示牌将会
[汽车电子]
STM32学习日志——RTC实时时钟
以前刚买手机时,有一个困惑,为什么时钟拔掉电池后时间就暂停了,而手机拔掉电池后,时间照样在走,为了证明是否是联网的原因,将网络关掉后还是一样。后来学了单片机才明白系统有一个实时时钟,由一个小纽扣电池供电。手机应该也是类似的原因。 首先RTC的时钟源由RCC_BDCR的RTCSEL位控制,一般选择LSE振荡器,接着通过RTCPRL位将其分频,假设LSE为32.768kHZ,则PRL写入32767可得到周期为1秒的信号。而RTC_DIV是一个递减的计数器,用PRL的数据装载,每次归零后重新装载,通过读取DIV的当前值,可以获得更精确的时间,比如DIV的当前值为3276,说明还有(3276/32767=0.1s)完成一个周期,说明这个周
[单片机]
iOS 12用户需每小时解锁iPhone以保持USB连接
到目前为止,USB限制模式仅出现在beta版中,而不是iOS的完全发布版本,因此它在第一个iOS 12 beta版中的出现并不一定意味着安全特性在移动操作系统发布时将可供公众使用。Apple在iOS 12的第一个测试版中增强了USB限制模式功能,要求用户每小时解锁一次iPhone以允许通过Lightning端口进行数据传输, 以保护iOS设备上存储的用户数据免遭执法人员通过解锁服务获取。 首先出现在iOS 11.3的beta版中,但在iOS 11.4 beta版中变得更加突出,最新iOS 12 beta版中的USB限制模式需要解锁 iPhone 以便数据通过Lightning端口传输。根据Motherboard的说法,如
[手机便携]
SMSC推出具备多路复用、端口保护的USB 2.0开关
致力于实现多样化系统连接的领先半导体厂商SMSC今天发表两款最新可提供Hi-Speed USB 2.0连接功能的新产品─USB3750和USB3740。这两款SMSC领先业界Hi-Speed USB连接产品中的新增成员,是专为便携设备所设计,可为以电池供电的移动应用带来绝佳的USB解决方案。 尺寸精巧,且连接头数量很少的最新移动设备,将能够透过单一端口实现USB数据传输和USB充电的功能。SMSC的低功率USB3750端口保护和侦测组件,是特别为需要共享USB连接的移动嵌入式应用所设计。运用SMSC的RapidCharge Anywhere™功能,USB3750能无缝提供USB电池充电侦测以及业界标准SE1类型充电器侦测功能。此
[嵌入式]
STM32 独立看门狗IWDG 时限
STM32 独立看门狗IWDG 时限 的确定 看门狗定时时限= IWDG_SetReload()的值 / 看门狗时钟频率 看门狗时钟频率=LSI(内部低速时钟)的频率(40KHz)/ 分频数 1.STM32 看门狗的 例子 IWDG的时限定为280微秒。这个时限可能会随着LSI(内部低速时钟)的频率漂移而产生微 小的变化。 /* IWDG timeout equal to 280 ms (the timeout may varies due to LSI frequency dispersion) ------------------
[单片机]
基于双模式USB接口的便携式比色计设计
  引言:   目前市场上的光电比色计一般都是通过 RS232串口与计算机通信,随着计算机技术的发展,这种接口实现已经无法满足 PC与外部设备之间不断提高的速度以及稳定性、易用性等要求,给用户使用带来了诸多不便。USB接口技术凭借其易用、稳定、可扩展等优点,越来越广泛应用于 PC机外设和便携式系统中,为满足客户要求,本文设计了一种基于 USB接口的比色计仪器。该仪器可以实现 USB主机和从机两种功能,做主机时,能实现数据的快速采集及 U盘存储;做从机时,能实现与计算机相连。   1.CH375简介   CH375是一种 USB总线的通用接口芯片,支持 USB-HOST主机方式和 USB-DEVICE/SLAVE设备方式,兼
[测试测量]
基于双模式<font color='red'>USB</font>接口的便携式比色计设计
莱迪思半导体扩展USB Type-C产品系列
推出更多端口控制器,为设计工程师提供成本优化、低功耗的解决方案 莱迪思的全新端口控制器可实现空间、成本和功耗方面表现优异的设计以支持最新的USB Type-C接口,使得设计工程师能够快速开发下一代产品。 三款全新的设计加入莱迪思现有的USB Type-C端口控制器系列,为客户提供了更加丰富全面的产品系列。 上述三款高性价比的USB Type-C端口控制器可提供制造商所需的关键功能 正反皆可插拔的接口、智能供电以及USB数据支持。 美国俄勒冈州波特兰市 2015年8月18日 莱迪思半导体公司 (NASDAQ: LSCC),客制化智能互连解决方案市场的领先供应商,今日宣布推出三款全新的端口控制器 SiI7012、
[手机便携]
STM32通过命令行编译和下载keil和IAR工程的方法
可能很多人都不习惯使用Keil、IAR自带的编辑器,可能代码补全、错误提示、高亮等编辑功能相对来说支持的不是很好。 虽然Keil MDK 从 V5.25版本开始对编辑功能改善了很多,但是很多人还是青睐于第三方的编辑器。 使用第三方的编辑器,如果需要编译和下载,就需要借助通过额外的方式实现,比如本文即将描述的通过命令行编译和下载的方式,可以让我们在使用第三方编辑器编辑的时候,进行代码编译和下载。 下面我们来描述以下内容: 常用代码编辑器 Keil 命令行编译下载 IAR 命令行编译下载 编译下载使用方法 1、常用的代码编辑器 下面介绍几款常用的代码编辑器: 1.VS Code VS Code 是绝大部分软件工程师都在使用
[单片机]
<font color='red'>STM32</font>通过命令行编译和下载keil和IAR工程的方法
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved