历史上的今天
返回首页

历史上的今天

今天是:2024年10月16日(星期三)

正在发生

2020年10月16日 | 野火STM32 Flash&sd卡模拟U盘

2020-10-16 来源:eefocus

在USB库文件mass_mal.c中添加对flash和sd读写的函数,USB库调用这些函数从而实现模拟U盘的功能


 1 //mass_mal.c

 2 /* Includes ------------------------------------------------------------------*/

 3 #include "..Usersdcardbsp_sdio_sdcard.h"

 4 #include "..Userspi_flashfatfs_flash_spi.h"

 5 #include "mass_mal.h"

 6 #include

 7 /* Private typedef -----------------------------------------------------------*/

 8 /* Private define ------------------------------------------------------------*/

 9 /* Private macro -------------------------------------------------------------*/

10 /* Private variables ---------------------------------------------------------*/

11 uint32_t Mass_Memory_Size[2];

12 uint32_t Mass_Block_Size[2];

13 uint32_t Mass_Block_Count[2];

14 __IO uint32_t Status = 0;

15 //#define  sFLASH_ID              0xEF3015     //W25X16

16 //#define  sFLASH_ID              0xEF4015     //W25Q16

17 #define  sFLASH_ID              0XEF4017    //W25Q64

18 extern SD_CardInfo SDCardInfo;      //ÓÃÓÚ´æ´¢¿¨µÄÐÅÏ¢


 1 /*******************************************************************************

 2 * Function Name  : MAL_Init

 3 * Description    : Initializes the Media on the STM32

 4 * Input          : None

 5 * Output         : None

 6 * Return         : None

 7 *******************************************************************************/

 8 uint16_t MAL_Init(uint8_t lun)

 9 {

10   uint16_t status = MAL_OK;

11 

12   switch (lun)

13   {

14     case 0:

15             FLASH_SPI_disk_initialize();

16             if(SPI_FLASH_ReadID()==sFLASH_ID)

17             {

18                 printf("flash init succseen");

19                 Status = MAL_OK;

20             }

21             else

22                 Status = MAL_FAIL;

23       break;

24         case 1:

25       Status = SD_Init();

26       break;

27     default:

28       return MAL_FAIL;

29   }

30   return status;

31 }


 1 /*******************************************************************************

 2 * Function Name  : MAL_Write

 3 * Description    : Write sectors

 4 * Input          : None

 5 * Output         : None

 6 * Return         : None

 7 *******************************************************************************/

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

 9 {

10   switch (lun)

11   {

12     case 0:

13             Memory_Offset+=(512*4096);//扇区偏移,外部flash文件系统空间放在外部flash 6M空间14             //printf("write add =%d.length=%dn",Memory_Offset/4096,Transfer_Length/4096);

15             SPI_FLASH_SectorErase(Memory_Offset);

16             SPI_FLASH_BufferWrite((uint8_t *)Writebuff,Memory_Offset,Transfer_Length);

17       break;

18         case 1:

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

20             Status = SD_WaitWriteOperation();  

21             while(SD_GetStatus() != SD_TRANSFER_OK);

22       if ( Status != SD_OK )

23       {

24         return MAL_FAIL;

25       }      

26       break;

27     default:

28       return MAL_FAIL;

29   }

30   return MAL_OK;

31 }


 1 /*******************************************************************************

 2 * Function Name  : MAL_Read

 3 * Description    : Read sectors

 4 * Input          : None

 5 * Output         : None

 6 * Return         : Buffer pointer

 7 *******************************************************************************/

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

 9 {

10 

11   switch (lun)

12   {

13     case 0:

14             Memory_Offset+=(512*4096);//扇区偏移15             //printf("read add =%d.length=%dn",Memory_Offset/4096,Transfer_Length/4096);

16             SPI_FLASH_BufferRead((uint8_t *)Readbuff, Memory_Offset, Transfer_Length);

17       break;

18         

19         case 1:

20       SD_ReadBlock((uint8_t*)Readbuff, Memory_Offset, Transfer_Length);

21             Status = SD_WaitReadOperation();

22       while(SD_GetStatus() != SD_TRANSFER_OK)

23       {

24       }

25       if ( Status != SD_OK )

26       {

27         return MAL_FAIL;

28       }

29       break;

30     default:

31       return MAL_FAIL;

32   }

33   return MAL_OK;

34 }


 1 /*******************************************************************************

 2 * Function Name  : MAL_GetStatus

 3 * Description    : Get status

 4 * Input          : None

 5 * Output         : None

 6 * Return         : None

 7 *******************************************************************************/

 8 uint16_t MAL_GetStatus (uint8_t lun)

 9 {

10   uint32_t DeviceSizeMul = 0, NumberOfBlocks = 0;

11     switch (lun)

12   {

13     case 0:

14         {

15             FLASH_SPI_disk_initialize();

16             if(SPI_FLASH_ReadID()==sFLASH_ID)

17             {

18                 Mass_Block_Size[0]  =4096;

19                 Mass_Block_Count[0] =1536;

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

21                 return MAL_OK;

22             }

23         }

24         case 1:

25             if (SD_Init() == SD_OK)

26             {

27                 SD_GetCardInfo(&SDCardInfo);

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

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

30 

31                 if(SDCardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)

32                 {

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

34                 }

35                 else

36                 {

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

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

39                 }

40                 Mass_Block_Size[1]  = 512;

41 

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

43                 Status = SD_EnableWideBusOperation(SDIO_BusWide_4b); 

44                 if ( Status != SD_OK )

45                 {

46                     return MAL_FAIL;

47                 }          

48 

49                 Mass_Memory_Size[1] = Mass_Block_Count[1] * Mass_Block_Size[1];

50                 return MAL_OK;

51             }

推荐阅读

史海拾趣

Actel公司的发展小趣事

除了热水领域,AOS公司还积极拓展其业务范围,涉足了水处理、空气净化等多个领域。公司坚持创新驱动的发展战略,不断投入研发资源,推出了一系列具有创新性和高性能的产品。这些产品的推出不仅丰富了AOS的产品线,也进一步提升了其在全球市场的竞争力。

HI Microwave Technology Limited公司的发展小趣事

人才是企业最宝贵的资源。HI Microwave高度重视人才培养和团队建设,通过引进和培养高素质的技术人才和管理人才,不断提升企业的核心竞争力。公司建立了完善的人才激励机制和培训体系,鼓励员工不断学习和创新。同时,公司还注重营造和谐、开放的企业文化氛围,激发员工的积极性和创造力。这些措施为公司的持续发展提供了有力的人才保障和智力支持。

Hayashi Denko Co Ltd公司的发展小趣事

在稳固国内市场的同时,HI Microwave积极开拓国际市场,与全球多家知名企业建立了长期稳定的合作关系。公司凭借优质的产品和服务,赢得了国内外客户的广泛赞誉。此外,HI Microwave还积极参与国际展览和交流活动,不断提升品牌知名度和影响力。通过与国际同行的交流与合作,公司不断吸收先进的管理理念和技术成果,为企业的持续发展注入了新的活力。

Digital View公司的发展小趣事

随着数字化技术的不断进步和应用领域的不断扩大,Digital View公司也加快了数字化转型和升级的步伐。公司加大了对云计算、大数据、人工智能等前沿技术的研发和应用力度,推出了一系列智能化、数字化的产品和服务。这些产品和服务不仅提高了客户的运营效率和管理水平,还为公司带来了新的增长点。

ENSIGN公司的发展小趣事

ENSIGN在资本市场上的表现也备受关注。近年来,ENSIGN的股价稳步上涨,市值不断扩大。多家投资机构对ENSIGN的前景表示乐观,并上调了其目标股价。ENSIGN凭借其稳健的财务表现、强大的研发能力和广阔的市场前景,吸引了众多投资者的关注。

这些故事概述了ENSIGN在电子行业中的发展历程和多元化战略。通过不断创新和拓展业务领域,ENSIGN逐渐成为了电子行业中备受瞩目的企业之一。

Directed Energy Inc公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。Directed Energy Inc深知这一点,因此始终将品质保障作为公司的核心竞争力之一。公司建立了严格的质量管理体系,从原材料采购到生产制造、再到产品检验和售后服务,每一个环节都严格把控,确保产品的高品质。这种对品质的执着追求赢得了客户的广泛信赖和好评,为公司赢得了更多的市场份额。

问答坊 | AI 解惑

示波器基础系列—— 增强分辨率(ERES)

示波器基础系列—— 增强分辨率(ERES)…

查看全部问答>

工作一月,有一种漂泊的感觉

好久没有来坛子逛逛,回复,发帖什么的了,不好意思哈。;P   倒不是因为工作忙,是因为我处于这个时间,不知道和大家交流一点什么。 今天中午QQ上收到琳子姐的留言,提醒了我。我是觉得有必要和大家分享一下我现在的工作状态了。 让你们 ...…

查看全部问答>

【分享】IAR 3.41注册机

http://zoglab.vicp.net/bbs/viewthread.php?tid=3419…

查看全部问答>

fpga

quartusii 中图片数据信息怎么通过matlab显示出来,非常感谢!!!…

查看全部问答>

诚聘电池项目管理工程师

项目管理工程师: 年薪10-15万 执行项目计划及维护工程体系(新产品导入及量产) 编制锂离子电芯生产工艺指示 推动工艺分析及改善 提高原材料利用率和产品良率 提高生产效率 改善产品可靠性和安全性 本科五年工作经验/硕士三年工作经验 ...…

查看全部问答>

MSP430程序库<十>ADC12模块

msp430内部含有ADC12模块,可以完成12位的模数转换,当对精度或其他指标要求不高时,可以选用430单片机内部的ADC12完成模数转换工作。这里主要实现了一个比较通用的ADC12模块初始化程序,具体的数据存储和处理需要自己在中断处理函数中添加。 &nbs ...…

查看全部问答>

求教

本人电子信息工程专业想学习嵌入式开发,但不知道从哪学起,需要有那些基础知识做铺垫,目前只学习了51单片机,希望各位大神指教!…

查看全部问答>

拒绝忽悠 移动GPU全解读(一)

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 本文将从移动GPU的结构、参数、兼容性、跑分几方面让读者全方位对移动GPU有一定的概念。由于篇幅较长,分成两部分介绍,这是第一部分,讲解的是移动GPU的结构和相关参数。 前言现在移动设备的 ...…

查看全部问答>

电子设计清单

本帖最后由 paulhyde 于 2014-9-15 03:45 编辑 清单是今天出来吗? 有没有人看到?    …

查看全部问答>