STM32 USB SD卡读卡器和NAND FLASH模拟U盘

发布者:脑力舞者最新更新时间:2016-12-20 来源: eefocus关键字:STM32  USB  SD卡读卡器  NAND  FLASH  模拟U盘 手机看文章 扫描二维码
随时随地手机看文章

本次工程是要同时实现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模拟出来的。



STM32 USB SD卡读卡器和NAND FLASH模拟U盘 - ziye334 - ziye334的博客

 在调是这个代码之前,曾经粗心,把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盘 引用地址:STM32 USB SD卡读卡器和NAND FLASH模拟U盘

上一篇:STM32 USB SD读卡器(SDIO)
下一篇:STM32 USB NAND Flash模拟U盘无法格式化问题的解决

推荐阅读最新更新时间:2024-03-16 15:26

STM32 串口发不出来数,或全0的问题
开始调试STM32串口的时候,怎么尝试,上位机都只收到0。对照例程自己一步一步写下来都不行。最后无奈,把例程直接全部复制粘贴过来,发现好使了。 后来几次用到串口的时候,又调了几次,貌似发现了一些问题。串口的初始化的顺序会造成输出全0的情况。正确初始化顺序如下: RCC_Configuration(); USART_GPIO_Configuration(); USART_Configuration(); NVIC_Configuration(); 或者: RCC_Configuration(); NVIC_Configuration(); USART_GPIO_Configuration();
[单片机]
<font color='red'>STM32</font> 串口发不出来数,或全0的问题
USB3.0插座示意图
USB 3.0插座是可以向下兼容USB 2.0的,相对于旧插座来说,USB 3.0插座增加了5pin的金属触片,对应USB 3.0线缆中A型接口的USB3_TX、GND以及USB3_RX触片。         USB 3.0插座示意图及实物图         USB 3.0 A型接口示意图以及实物   USB 3.0线缆A型接口触片增加到了9pin,其中下方的4pin可兼容旧有的USB 2.0/1.1/1.0标准,而后方增加的5pin则属于USB 3.0,分别为USB3_TX、USB3_TX、GND、USB3_RX及USB3_RX。      USB 3.0标准B型接口以
[模拟电子]
<font color='red'>USB</font>3.0插座示意图
XMOS为Revolabs Executive Elite中的AVB和USB提供强力支持
XMOS和Revolabs®近日共同宣布:Revolabs的四通道和八通道无线麦克风系统Executive Elite™采用了XMOS的xCORE多核微控制器,从而提供业界领先的音频视频桥接(AVB)功能。 Executive Elite系统由一系列麦克风和支持配套单元组成,它专为易于安装和设置、同时提供顶级音频质量而设计。通过提供采用了XMOS xCORE技术的AVB功能,可使Executive Elite能够与配置了AVB功能的第三方产品实现互通,确保了一种基于开放IEEE标准的、未来不过时的并且是灵活的系统。 “我们需要在Executive Elite中实现一种能够提供通用通信功能的解决方案,它可与USB音频、AVB
[嵌入式]
VSS-USBP-100平板电视USB多媒体播放器
  VSP100作为多媒体协处理器为产品提供完美的多媒体解码功能。   基于VSP100,支持网络流行的各种格式多媒体文件解码。   该方案可用于任何需要支持USB移动存储设备播放所支持的产品。 基本特征: 支持的视频标准:MPEG2, MPEG4, H.264, AVS, WMV9, Real Media 10等 支持的音频标准:MP3, AAC, Dolby, WMA, RMA等 支持的媒体格式:ASF,AVI,DivX,MP4,QT,RM10,VC-1,VOB,WMV9,xVid等 支持的图片标准:JPEG 存储支持:低速, 全速USB存储设备 控制接口:UART, I2C, SPI 音频输出:立体声输出 视频输出:CC
[家用电子]
STM32非DMA模式下读取多通道AD采样值
折腾了几天了,还没有把DMA弄得明白,现在把自己做的双通道的AD采样记录一下,免得忘得太快了。 上篇文章已经讲得很详细了,对于ADC的采样,有几个结构需要初始化: RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);// 使能 ADC1时钟线 /* ADC1 configuration */ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立工作模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //扫描模式 //为了保证单次通道
[单片机]
stm32之断言详细讲解
最近公司不忙,就想着充实下自己,偶然看到了“断言机制”,也认真试验了一番,便赶紧记录下来,也是为了温故而知新,再者与大家分享一下! 首先看一个应用:(网络不好,图片不好上传,原谅我偷懒) void TIM_DeInit(TIM_TypeDef* TIMx) { /* Check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); if (TIMx == TIM1) { RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphResetCmd(RCC_AP
[单片机]
<font color='red'>stm32</font>之断言详细讲解
STM32 Cotex-M3处理器系列编程】串口调试
#include stm32f10x.h //#include stm32f10x_lib.h void Delay(unsigned int x); void UART_Init(void); int main(void) { while (1) { Delay(300000); UART_Init(); //初始化串口 USART_SendData(USART1,0x1A); //从串口发送数据到计算机 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//RESET是0,等待发送完毕
[单片机]
基于STM32的MDK程序启动
;//HeapSize(inBytes) 0x0-0xFFFFFFFF:8 ;// Heap_SizeEQU0x00000020;//定义堆空间大小 AREAHEAP,NOINIT,READWRITE,ALIGN=3;//定义一个数据段,8字节对齐 __heap_base Heap_MemSPACEHeap_Size;//保留Heap_Size的堆空间 __heap_limit;//标号,代表堆末尾地址,后面有用 PRESERVE8;//指示编译器8字节对齐 THUMB;//指示编译器为THUMB指令 ;VectorTableMappedtoAddress0atReset AREARESET,DATA,READONLY;//
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved