历史上的今天
返回首页

历史上的今天

今天是:2024年10月29日(星期二)

正在发生

2020年10月29日 | STM32 USB SD读卡器(SDIO)

2020-10-29 来源:eefocus

这次是做一个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) 


推荐阅读

史海拾趣

Gazelle Microcircuits Inc公司的发展小趣事
随着个人电脑市场的不断发展,用户对主板性能的需求也在不断变化。现代主板更加注重的是高速数据传输、稳定性、能效比等方面,而不再是传统的模拟电路或特殊模块的需求。
AIC [Analog Intergrations Corporation]公司的发展小趣事
在早期的电脑主板中,-5V电压被广泛用于某些模拟电路,如硬盘控制器、串口通讯等。然而,随着技术的进步和元件的更新换代,-5V电压的需求已经大大减少,甚至在一些新的主板设计中已经不再提供-5V输出。尽管如此,在一些老旧的设备或特定应用中,-5V电压仍然可能被需要。
Fermionics Lasertech Inc公司的发展小趣事

随着技术的不断完善,Fermionics Lasertech Inc公司的产品线逐渐丰富,从单一的激光切割设备扩展到激光打标、焊接、打孔等多个领域。公司开始加大市场推广力度,积极参加国内外各类电子展会,与潜在客户建立联系。同时,公司还注重品牌建设,通过优质的产品和服务赢得了良好的口碑,逐渐在电子行业树立了品牌形象。

Carroll & Meynell Transformers Ltd公司的发展小趣事

在电子行业的初期,Carroll & Meynell Transformers Ltd公司以其卓越的技术创新能力脱颖而出。公司研发团队不断突破传统变压器的设计局限,推出了一系列高效、稳定的变压器产品。这些产品不仅满足了当时市场对电力传输和分配的基本需求,还以其卓越的性能赢得了客户的广泛认可。随着市场需求的不断增长,公司逐渐扩大了生产规模,成为了电子行业中的佼佼者。

Frequency Devices公司的发展小趣事

面对快速变化的市场需求,Frequency Devices公司展现出了敏锐的市场洞察力。在21世纪初,随着无线通信技术的快速发展,对高频电子元件的需求急剧增加。公司及时调整产品策略,加大了对无线通信领域高频产品的研发投入,并成功推出了一系列适用于手机、基站等通信设备的高频滤波器、功率放大器等关键元件。这些产品不仅满足了市场需求,还进一步巩固了公司在行业内的市场地位。

Akros[台湾超硕股份有限公司]公司的发展小趣事

Akros公司成立于XXXX年,由一群怀揣梦想的电子工程师创立。创业初期,公司面临着资金短缺、市场竞争激烈等诸多困难。然而,创始团队凭借着对技术的热爱和对市场的敏锐洞察,坚持自主研发,不断推出具有创新性的电子产品。通过不懈的努力,Akros逐渐在市场中站稳脚跟,为后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

工程勾通,友好交流、扩大共识,相互借鉴

有归属、没宗派,有尊重、没辈分,有针对、没争竞,有奉献、没名利 相互尊重、友好交流、扩大共识,倡导不同文化间增进了解、相互借鉴 电子工程师,结构工程师,软件工程师,硬件工程师,FPGA研发。另有数码产品,影音视听产品,手机,微型硬盘播放机,R ...…

查看全部问答>

阿牛哥系列故事大嘴歪评世界杯

阿牛哥冒着七月的艳阳酷暑,晚上听完国际广播电台的新闻,西瓜荔枝,要看世界杯球赛了。晚上的这场要看,凌晨的那场要听。电视电脑收音机都需要,就是不能影响白天的工作。先说说世界杯比赛,不能在家里看,太影响家人.去哥们马六家看;啤酒不喝 ...…

查看全部问答>

高性能低成本S3C2416微型ARM9嵌入式模块

◆ 全面替代S3C2440,且性价比更优 ◆ 模块背面无任何器件,方便直接贴焊或通过插针与底板相连 ◆ 商业级(0°~70°)、工业级(-40°~85°) ◆ 微尺寸(40x40x4mm)、低价格(千片价…

查看全部问答>

初学嵌入开发,请问看哪些书籍会比较合适

大家好,我是初学嵌入开发,请问看哪些书籍会比较合适。 谢谢。 …

查看全部问答>

wince 是否支持"微软雅黑"字体?

wince 是否支持\"微软雅黑\"字体? 看到linux下显示的字体比较漂亮,font文件下看到msyh.ttf,也就是雅黑字体了,EVC下显示的字效果比较一般,要是wince支持msyh.ttf的话,应该怎样添加呢? …

查看全部问答>

紧急求救!!用c开发手机或PDA需要看什么方面的书籍资料!!谢谢各位拉

本人用vc写过应用程序,用c写过mp3的程式,但是c++不太好,在vc里面基本用的都是c,现在想转做手机或pda方面,请教需要看哪些书啊?我看些资料,一般都是在用WinCE或在Linux下开发,哪个发展更好些?不知道这方面薪水待遇怎么样?敢请各位不啬赐教 ...…

查看全部问答>

跪求MSP430的开发实例

小弟初来乍到,是MSP430的初学者,跪求适合初学者做的案例来作参考,请各位大神多多照顾 …

查看全部问答>

关于RC522对M1卡操作中断方式实现的可能性探讨。

大家好,我最近在做RC522读卡方面的程序,在板子上实现了卡的密码校验,修改密码,加数据减数据的操作。我想问一下大家尝试过没有中断方式实现对读卡器的操作的?就是我开启天线寻卡,这个时候单片机去干其他的事情,如果寻到卡直接给单片机一个中 ...…

查看全部问答>

★★★四轴飞行diy全套入门教程★★★

本帖最后由 paulhyde 于 2014-9-15 03:20 编辑 【概述】 1、diy四轴需要准备什么零件 无刷电机(4个) 电子调速器(简称电调,4个,常见有好盈、中特威、新西达等品牌) 螺旋桨(4个,需要2个正浆,2个反浆) 飞行控制板(常见有KK、FF、玉兔 ...…

查看全部问答>

周计划+基于瑞萨RL78/G14得自动喂狗器

周计划:宠物自动喂食器 提交者:zca123 序号 内容 论坛提交内容 9.16-9.22  (第一周) 熟悉开发板,搭建开发平台,,编译Hello World或者点灯程序 上靓照,分享启动过程 9.23-9.29  (第二周) 熟悉硬件平台,熟悉外设 分享对 ...…

查看全部问答>