历史上的今天

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

正在发生

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

发布者:风暴使者 来源: eefocus关键字:野火  STM32  Flash&sd卡  模拟U盘 手机看文章 扫描二维码
随时随地手机看文章

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             }

[1] [2]
关键字:野火  STM32  Flash&sd卡  模拟U盘 引用地址:野火STM32 Flash&sd卡模拟U盘

上一篇:SPI移位寄存器
下一篇:USB开发库STSW-STM32121文件分析

推荐阅读

可能刚开始接触nRF24L01的童鞋都会注意到例程函数中有两个定义的地址const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; 这个非常让人疑惑,为什么地址还是数组,而且网上一搜,几乎所有的例程地址都是这一个,为什么呢,换一个不行吗?下面我们从数...
(文章来源:钛媒体) 国际机器人联合会(R)发布的年度《世界机器人报告》显示, 2018年全球机器人年销售额为165亿美元,中国占据了最大市场份额。 在服务机器人领域,2018年专业服务机器人的销售额增长了32%,达到92亿美元,其中,自动引导车辆(AGV)等物流系统占总销量的41%,占比最大,全球销售物流系统近11.1万台,比2017年(6.9万台)增长60%...
半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM) 宣布发起LaSAR(增强现实激光扫描)技术联盟,与市场领先的技术开发商、供应商和制造商组建生态系统,合作开发和加快开发增强现实(AR)智能眼镜解决方案。除了意法半导体外,LaSAR联盟的发起者还包括Applied Materials、Dispelix、Mega1和欧司朗。 联盟致力于应对全天候佩戴智能...
10月14日晚间,永太科技发布三季报显示,公司主营收入32.73亿元,同比上升32.25%;归母净利润3.75亿元,同比上升65.25%;扣非净利润4.11亿元,同比上升200.79%;负债率57.47%,投资收益5019.73万元,财务费用9422.4万元,毛利率34.56%。永太科技称,报告期内业绩同比增长较多,主要来源于公司锂电材料产品的业绩增长。其中:六氟磷酸锂产品的下游市场需求...

史海拾趣

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

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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