STM32 USB SD卡读卡器和NAND FLASH模拟U盘
本次工程是要同时实现SD卡读卡器和NAND Flash模拟U盘的功能。结合之前的两个工程,稍稍修改下就可以了。
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_Size[0] = FLASH_SECTOR_SIZE;
Mass_Memory_Size[0] = (Mass_Block_Count[0] * Mass_Block_Size[0]);
STM32 USB SD卡读卡器和NAND FLASH模拟U盘相关推荐
- linux nand flash模拟u盘,海思g_mass_storage.ko模拟U盘
1. 基于平台:海思3556V100 2. 存储设备:nand flash 3. 驱动加载(参考<外围设备驱动 操作指南.pdf>)如下:insmod udc-hisi.ko insmod ...
- STM32 USB SD读卡器(SDIO)
这次是做一个SD卡的USB读卡器的功能,我们就在上次NAND Flash模拟出的U盘的工程上修改了,这样的话只要修改一小部分了. 工程的绝大部分不需要修改,只要将fsmc_nand.c文件移除工程,添 ...
- HAL库USB+SD卡,读卡器设置
HAL库USB+SD卡,读卡器设置 主控:STM32L476VE STM32CUBE设置如下 开启SDMMC的DMA,RX和TX都设置为轮询模式 开启FATFS修改红框中内容 开启USB,设置devi ...
- ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能)
ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能) 之所以写裸机,也就是没有操作系统的实现方法是因为linux系统下的实现方法网上已经有很多了,之前使用的STM32实 ...
- VS code+STM32CubeMX 使用 FreeRTOS+FatFS+USB_DEVICE 搭建 SD卡 读卡器 和 读写 SD卡 示例项目
文章目录 1. 新建项目 2. 配置 CubeMX 项目 3. 配置 EIDE 项目 4. 编写代码 5. 编译下载 6. 效果展示 本例介绍如何使用 vscode 插件 EIDE 和 STM32Cu ...
- stm32驱动sd卡(1)
Stm32驱动sd卡知识总结(1) 1.Stm32支持SDIO接口,可以用来接入一张不超过32G的SD卡 2.CID寄存器长度为128bit,用来标记SD卡的全球唯一身份识别号 3.支持单线和四线传输 ...
- STM32之SD卡【写的太好了 转载 】
https://www.cnblogs.com/amanlikethis/p/3757876.html#lab11 目录 一.SD卡概述 1.定义 2.容量等级 3.SD卡框图 4.SD卡与TF卡的区 ...
- STM32的SD卡与SDIO接口
STM32的SD卡与SDIO接口 一.SD卡的简介 1.SD卡的主要参数 2.SD卡的SDIO 模式和SPI 模式 3.SD卡寄存器 二.命令和响应 1.SD卡的操作过程 主机(单片机等)发起&q ...
- STM32挂载SD卡记录日志
STM32挂载SD卡记录日志 程序主要是在前一篇的基础上进行.使用CUBE配置STM32挂载TF卡,请看https://ydgd118.blog.csdn.net/article/details/11 ...
最新文章
- java读取文件替换字符,跳槽薪资翻倍
- jdbc,mybatis,hibernate各自优缺点及区别
- [css] css的属性content有什么作用呢?有哪些场景可以用到?
- 利用python处理中国地面气候资料日值数据集(V3.0)
- 2010软考软件设计师冲刺精选【专家压轴模拟•下】
- 山东大学 2020级数据库系统 实验五
- 去年全球勒索软件攻击收入达10亿美元
- java中json对象去重复_如何忽略Java中JSON对象的多个属性?
- wpf之DependencyProperty
- VMware Cloud Director Availability 4.3 下载 | 灾难恢复和迁移 | DRaaS
- Tomcat 的部署+虚拟主机的配置
- 珠峰海拔8848米,现在有足够大的纸,厚度是0.01米,折多少次高度可以超过珠穆朗玛峰。(JavaScript)
- 超详细,Python当中的pip常用命令大全
- 多重引导系统启动流程
- 利用c++进行程序词法分析
- InstructPix2Pix: 随口修图
- android获取系统使用的字体,android - 我如何获取已安装的Android系统字体列表并将其应用于自定义键盘 - 堆栈内存溢出...
- 用nginx搭建http透明代理
- java错误日志监控工具_(转)安装 log.io 实时日志监控工具
- 聚焦机器人集成应用,看未来工厂“智”变!
热门文章
- 怎么用html做寻找宝藏游戏,原神寻找宝藏任务怎么做 璃月寻宝隐藏任务攻略
- 【68】JS(4)——表达式和语句②流程控制语句(1)条件分支语句
- http协议详解-摘抄
- maven实战(一)简单mvn构建项目详解
- 设置hint字体大小
- JS页面四个颜色不同的div,鼠标进入哪个div,页面背景颜色变成该div的颜色。
- php域名绑定模块,迅睿CMS 模块域名绑定
- Objective-C基础学习心得(更新ing)
- Hibernate配置时易忘掉的一项-release_mode
- 基于Python的中医藏象辨证量化诊断系统的设计与实现