本次工程是要同时实现SD卡读卡器和NAND Flash模拟U盘的功能。结合之前的两个工程,稍稍修改下就可以了。

既然要实现两个盘,当然在usb_prop.c中的Max_Lun变量赋值为1,在USB_User组中同时添加fsmc_nand.c和sdio_sdcard.c这两个文件,在外设库中挺尸添加stm32f10x_sdio.c和stm32f10x_fsmc.c两个文件。
添加完之后,可能会有些许的错误,解决完后,我们就要修改下mass_mal.c文件了,这个文件本次要同时实现SD卡和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;

uint16_t MAL_Init(uint8_t lun)
{    u16 status = MAL_OK;   switch (lun)
    {        case 0:
            Status = SD_Init();  //调用SD初始化函数
            break;
        case 1:
            FlashInit();
            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;
        case 1:
            FlashWriteOneSector(Memory_Offset,(u8*)Writebuff, Transfer_Length);
                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);   //等待sdio到sd卡传输结束
        if ( Status != SD_OK )
        {            return MAL_FAIL;
        }
        break;
    case 1:
        FlashReadOneSector(Memory_Offset, (u8*)Readbuff, Transfer_Length);
        break;
    default:
      return MAL_FAIL;
  }
  return MAL_OK;
}

uint16_t MAL_GetStatus (uint8_t lun)
{    uint32_t DeviceSizeMul = 0, NumberOfBlocks = 0;
    if (lun == 0)
    {        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;
            }
            LED2_ON();
            return MAL_OK;
        }
        else
        {            LED2_OFF();
        }
    }
    else
    {        Mass_Block_Count[1] =  FLASH_MAX_SECTOR_ADDR/FLASH_SECTOR_SIZE;  //NAND_ZONE_SIZE * NAND_BLOCK_SIZE * NAND_MAX_ZONE ;
        Mass_Block_Size[1]  =  FLASH_SECTOR_SIZE;                        //NAND_PAGE_SIZE;
        Mass_Memory_Size[1] = (Mass_Block_Count[1] * Mass_Block_Size[1]);//这里的NAND要选择Mass_Block_Count[1]和Mass_Block_Size[1]
        LED4_ON();                                                       //因为SD的的是Mass_Block_Count[0]和Mass_Block_Size[0]
        return MAL_OK;
    }
    return MAL_FAIL;
}

这样就可以在电脑上同时出现两个盘,分别是SD卡和NAND模拟出来的。

在调是这个代码之前,曾经粗心,把MAL_GetStatus()l里的NAND相关代码的下成如下:

Mass_Block_Count[0] = FLASH_MAX_SECTOR_ADDR/FLASH_SECTOR_SIZE;
Mass_Block_Size[0] = FLASH_SECTOR_SIZE;
Mass_Memory_Size[0] = (Mass_Block_Count[0] * Mass_Block_Size[0]);
数组元素都是0,与SD卡冲突,导致两个盘都显示不出来,但是你屏蔽掉SD相关的代码是可以的,或则屏蔽掉NAND相关代码也是可以的,偏偏两个代码一起的时候不行,检查了半天,才发现问题出在这里。

STM32 USB SD卡读卡器和NAND FLASH模拟U盘相关推荐

  1. linux nand flash模拟u盘,海思g_mass_storage.ko模拟U盘

    1. 基于平台:海思3556V100 2. 存储设备:nand flash 3. 驱动加载(参考<外围设备驱动 操作指南.pdf>)如下:insmod udc-hisi.ko insmod ...

  2. STM32 USB SD读卡器(SDIO)

    这次是做一个SD卡的USB读卡器的功能,我们就在上次NAND Flash模拟出的U盘的工程上修改了,这样的话只要修改一小部分了. 工程的绝大部分不需要修改,只要将fsmc_nand.c文件移除工程,添 ...

  3. HAL库USB+SD卡,读卡器设置

    HAL库USB+SD卡,读卡器设置 主控:STM32L476VE STM32CUBE设置如下 开启SDMMC的DMA,RX和TX都设置为轮询模式 开启FATFS修改红框中内容 开启USB,设置devi ...

  4. ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能)

    ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能) 之所以写裸机,也就是没有操作系统的实现方法是因为linux系统下的实现方法网上已经有很多了,之前使用的STM32实 ...

  5. VS code+STM32CubeMX 使用 FreeRTOS+FatFS+USB_DEVICE 搭建 SD卡 读卡器 和 读写 SD卡 示例项目

    文章目录 1. 新建项目 2. 配置 CubeMX 项目 3. 配置 EIDE 项目 4. 编写代码 5. 编译下载 6. 效果展示 本例介绍如何使用 vscode 插件 EIDE 和 STM32Cu ...

  6. stm32驱动sd卡(1)

    Stm32驱动sd卡知识总结(1) 1.Stm32支持SDIO接口,可以用来接入一张不超过32G的SD卡 2.CID寄存器长度为128bit,用来标记SD卡的全球唯一身份识别号 3.支持单线和四线传输 ...

  7. STM32之SD卡【写的太好了 转载 】

    https://www.cnblogs.com/amanlikethis/p/3757876.html#lab11 目录 一.SD卡概述 1.定义 2.容量等级 3.SD卡框图 4.SD卡与TF卡的区 ...

  8. STM32的SD卡与SDIO接口

    STM32的SD卡与SDIO接口 一.SD卡的简介 1.SD卡的主要参数 2.SD卡的SDIO 模式和SPI 模式 3.SD卡寄存器 二.命令和响应 1.SD卡的操作过程   主机(单片机等)发起&q ...

  9. STM32挂载SD卡记录日志

    STM32挂载SD卡记录日志 程序主要是在前一篇的基础上进行.使用CUBE配置STM32挂载TF卡,请看https://ydgd118.blog.csdn.net/article/details/11 ...

最新文章

  1. java读取文件替换字符,跳槽薪资翻倍
  2. jdbc,mybatis,hibernate各自优缺点及区别
  3. [css] css的属性content有什么作用呢?有哪些场景可以用到?
  4. 利用python处理中国地面气候资料日值数据集(V3.0)
  5. 2010软考软件设计师冲刺精选【专家压轴模拟•下】
  6. 山东大学 2020级数据库系统 实验五
  7. 去年全球勒索软件攻击收入达10亿美元
  8. java中json对象去重复_如何忽略Java中JSON对象的多个属性?
  9. wpf之DependencyProperty
  10. VMware Cloud Director Availability 4.3 下载 | 灾难恢复和迁移 | DRaaS
  11. Tomcat 的部署+虚拟主机的配置
  12. 珠峰海拔8848米,现在有足够大的纸,厚度是0.01米,折多少次高度可以超过珠穆朗玛峰。(JavaScript)
  13. 超详细,Python当中的pip常用命令大全
  14. 多重引导系统启动流程
  15. 利用c++进行程序词法分析
  16. InstructPix2Pix: 随口修图
  17. android获取系统使用的字体,android - 我如何获取已安装的Android系统字体列表并将其应用于自定义键盘 - 堆栈内存溢出...
  18. 用nginx搭建http透明代理
  19. java错误日志监控工具_(转)安装 log.io 实时日志监控工具
  20. 聚焦机器人集成应用,看未来工厂“智”变!

热门文章

  1. 怎么用html做寻找宝藏游戏,原神寻找宝藏任务怎么做 璃月寻宝隐藏任务攻略
  2. 【68】JS(4)——表达式和语句②流程控制语句(1)条件分支语句
  3. http协议详解-摘抄
  4. maven实战(一)简单mvn构建项目详解
  5. 设置hint字体大小
  6. JS页面四个颜色不同的div,鼠标进入哪个div,页面背景颜色变成该div的颜色。
  7. php域名绑定模块,迅睿CMS 模块域名绑定
  8. Objective-C基础学习心得(更新ing)
  9. Hibernate配置时易忘掉的一项-release_mode
  10. 基于Python的中医藏象辨证量化诊断系统的设计与实现