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

  1. //mass_mal.c
  2. /* Includes ------------------------------------------------------------------*/
  3. #include "..\User\sdcard\bsp_sdio_sdcard.h"
  4. #include "..\User\spi_flash\fatfs_flash_spi.h"
  5. #include "mass_mal.h"
  6. #include <stdio.h>
  7. /* Private typedef -----------------------------------------------------------*/
  8. /* Private define ------------------------------------------------------------*/
  9. /* Private macro -------------------------------------------------------------*/
  10. /* Private variables ---------------------------------------------------------*/
  11. uint32_t Mass_Memory_Size[];
  12. uint32_t Mass_Block_Size[];
  13. uint32_t Mass_Block_Count[];
  14. __IO uint32_t Status = ;
  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 :
  15. FLASH_SPI_disk_initialize();
  16. if(SPI_FLASH_ReadID()==sFLASH_ID)
  17. {
  18. printf("flash init succsee\n");
  19. Status = MAL_OK;
  20. }
  21. else
  22. Status = MAL_FAIL;
  23. break;
  24. case :
  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 :
  13. Memory_Offset+=(*);//扇区偏移,外部flash文件系统空间放在外部flash 6M空间 //printf("write add =%d.length=%d\n",Memory_Offset/4096,Transfer_Length/4096);
  14. SPI_FLASH_SectorErase(Memory_Offset);
  15. SPI_FLASH_BufferWrite((uint8_t *)Writebuff,Memory_Offset,Transfer_Length);
  16. break;
  17. case :
  18. Status = SD_WriteBlock((uint8_t*)Writebuff, Memory_Offset, Transfer_Length);
  19. Status = SD_WaitWriteOperation();
  20. while(SD_GetStatus() != SD_TRANSFER_OK);
  21. if ( Status != SD_OK )
  22. {
  23. return MAL_FAIL;
  24. }
  25. break;
  26. default:
  27. return MAL_FAIL;
  28. }
  29. return MAL_OK;
  30. }
  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 :
  14. Memory_Offset+=(*);//扇区偏移 //printf("read add =%d.length=%d\n",Memory_Offset/4096,Transfer_Length/4096);
  15. SPI_FLASH_BufferRead((uint8_t *)Readbuff, Memory_Offset, Transfer_Length);
  16. break;
  17.  
  18. case :
  19. SD_ReadBlock((uint8_t*)Readbuff, Memory_Offset, Transfer_Length);
  20. Status = SD_WaitReadOperation();
  21. while(SD_GetStatus() != SD_TRANSFER_OK)
  22. {
  23. }
  24. if ( Status != SD_OK )
  25. {
  26. return MAL_FAIL;
  27. }
  28. break;
  29. default:
  30. return MAL_FAIL;
  31. }
  32. return MAL_OK;
  33. }
  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 = , NumberOfBlocks = ;
  11. switch (lun)
  12. {
  13. case :
  14. {
  15. FLASH_SPI_disk_initialize();
  16. if(SPI_FLASH_ReadID()==sFLASH_ID)
  17. {
  18. Mass_Block_Size[] =;
  19. Mass_Block_Count[] =;
  20. Mass_Memory_Size[] =Mass_Block_Size[]*Mass_Block_Count[];
  21. return MAL_OK;
  22. }
  23. }
  24. case :
  25. if (SD_Init() == SD_OK)
  26. {
  27. SD_GetCardInfo(&SDCardInfo);
  28. SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << ));
  29. DeviceSizeMul = (SDCardInfo.SD_csd.DeviceSizeMul + );
  30.  
  31. if(SDCardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
  32. {
  33. Mass_Block_Count[] = (SDCardInfo.SD_csd.DeviceSize + ) * ;
  34. }
  35. else
  36. {
  37. NumberOfBlocks = (( << (SDCardInfo.SD_csd.RdBlockLen)) / );
  38. Mass_Block_Count[] = ((SDCardInfo.SD_csd.DeviceSize + ) * ( << DeviceSizeMul) << (NumberOfBlocks/));
  39. }
  40. Mass_Block_Size[] = ;
  41.  
  42. Status = SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << ));
  43. Status = SD_EnableWideBusOperation(SDIO_BusWide_4b);
  44. if ( Status != SD_OK )
  45. {
  46. return MAL_FAIL;
  47. }
  48.  
  49. Mass_Memory_Size[] = Mass_Block_Count[] * Mass_Block_Size[];
  50. return MAL_OK;
  51. }
  52. default:break;
  53. }
  54. return MAL_FAIL;
  55. }

野火STM32 Flash&sd卡模拟U盘的更多相关文章

  1. STM32之SD卡

    目录 一.SD卡概述 1.定义 2.容量等级 3.SD卡框图 4.SD卡与TF卡的区别 二. SD卡内部结构 1. SD卡内部结构简图 2. 存储阵列结构图 3.Buffer 4.“存储阵列Block ...

  2. STM32平台SD卡的FatFS文件系统开发

    STM32平台SD卡的FatFS文件系统开发 系统平台: STM32系列的STM32F103ZE SPI方式与SD卡通信 SD上移植FatFS系统 1 FatFS文件系统 1.1 FatFS简介 Fa ...

  3. 2019 SD卡、U盘无法格式化怎么办的解决方法

    有天 闲的没事, 格式化一下U盘 ,结果突然断电了,我的天.我还在格式化的U盘 ,果然 ,我在此启动电脑后,的U盘直接 就不能用了.于是 我格式化. 然后,我的U盘就怎么也格式化不好了 ,找到了几种解 ...

  4. 嵌入式linux 实现mdev SD卡和U盘自己主动挂载和卸载的方法 mdev.conf

    首先先參考这些博客做一些了解:http://linux.chinaunix.net/techdoc/install/2009/11/18/1144936.shtml http://www.cnblog ...

  5. stm32和sd卡

    SD卡从容量上讲分两种:标准容量和大容量,最小的是标准容量,小于等于2G 其中的访问关系如下: SD卡分为两种模式:认证模式和传输模式,每一个模式包含着不同的状态,如下 以下主要讲其初始化过程: SD ...

  6. Android操作外置SD卡和U盘相关文章

    Android设备与外接U盘实现数据读取操作https://blog.csdn.net/true100/article/details/77775700 usbdisklibhttps://githu ...

  7. Android监听外部存储设备的状态(SD卡、U盘等等)

    近期在项目中须要对外部存储设备的状态进行监听,所以整理了此笔记,以便日后查看. 外部存储设备的状态变化时发出的广播 对照不同状态下的广播 1. 插入外部SD卡时: 2. 移除外部SD卡时: 3. 连接 ...

  8. 关于ARM Linux下的SD卡及U盘的挂载问题

    内核配置并运行后,挂载SD卡,出现问题: zynq> mount -t /dev/mmcblk1 /mntmount: mounting /dev/mmcblk0 on /mnt failed: ...

  9. SD卡 模拟SPI总线控制流程

    SD卡为移动设备提供了安全的,大容量存储解决方法.它本身可以通过两种总线模式和MCU进行数据传输,一种是称为SD BUS的4位串行数据模式,另一种就是大家熟知的4线SPI Bus模式.一些廉价,低端的 ...

随机推荐

  1. HDU 5344 MZL's xor (水题)

    题意:给一个序列A,设序列B的中的元素有(Ai+Aj)(1≤i,j≤n),那么求B中所有元素的异或之和.而序列A是这样来的:A1=0,Ai=(Ai−1∗m+z) mod l. 思路:相同的元素异或结果 ...

  2. SQLServer的最大连接数 超时时间已到 但是尚未从池中获取连接

    很多做架构设计.程序开发.运维.技术管理的朋友可能或多或少有这样的困惑: SQLServer到底支持多少连接数的并发? SQLServer是否可以满足现有的应用吗? 现有的技术架构支持多少连接数的并发 ...

  3. 【英语】Bingo口语笔记(51) - 相信怀疑的表达

  4. phonegap 检查是否有网络

    在主active onCreate函数中实现 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(sa ...

  5. 【转】15 个用于 GitHub 的 Chrome 插件

    原文网址:http://webres.wang/15-useful-chrome-extensions-for-github/ 对于 GitHub 你了解多少呢?其实,它是一个基于 Git 托管的 W ...

  6. 构建高性能web站点--读书大纲

    用户输入你的站点网址,等了半天..还没打开,裤衩一下就给关了.好了,流失了一个用户.为什么会有这样的问题呢.怎么解决自己站点“慢”,体验差的问题呢. 在这段等待的时间里,到底发生了什么?事实上这并不简 ...

  7. web app 页面旋转整体样式问题

    $(window).bind("orientationchange", function (event) { if (event.orientation) { //portrait ...

  8. uglifyjs使用

    1.安装Nodejs:去这里下载并安装. 2.打开cmd,运行npm,node应该会有输出东西 3.如果在window上运行Node.js的npm报Error: ENOENT, stat 'C:\Us ...

  9. php的header()大全

    <?php /*** Function: PHP header() examples (PHP) ** Desc: Some examples on how to use the header( ...

  10. centos mysq table is read only

    1.进入mysql数据库目录,使用命令"chown -R mysql <数据库文件夹名称>" 2. "chgrp -R mysql <数据库文件夹名称& ...