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

 //mass_mal.c
/* Includes ------------------------------------------------------------------*/
#include "..\User\sdcard\bsp_sdio_sdcard.h"
#include "..\User\spi_flash\fatfs_flash_spi.h"
#include "mass_mal.h"
#include <stdio.h>
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
uint32_t Mass_Memory_Size[];
uint32_t Mass_Block_Size[];
uint32_t Mass_Block_Count[];
__IO uint32_t Status = ;
//#define sFLASH_ID 0xEF3015 //W25X16
//#define sFLASH_ID 0xEF4015 //W25Q16
#define sFLASH_ID 0XEF4017 //W25Q64
extern SD_CardInfo SDCardInfo; //ÓÃÓÚ´æ´¢¿¨µÄÐÅÏ¢
 /*******************************************************************************
* Function Name : MAL_Init
* Description : Initializes the Media on the STM32
* Input : None
* Output : None
* Return : None
*******************************************************************************/
uint16_t MAL_Init(uint8_t lun)
{
uint16_t status = MAL_OK; switch (lun)
{
case :
FLASH_SPI_disk_initialize();
if(SPI_FLASH_ReadID()==sFLASH_ID)
{
printf("flash init succsee\n");
Status = MAL_OK;
}
else
Status = MAL_FAIL;
break;
case :
Status = SD_Init();
break;
default:
return MAL_FAIL;
}
return status;
}
 /*******************************************************************************
* Function Name : MAL_Write
* Description : Write sectors
* Input : None
* Output : None
* Return : None
*******************************************************************************/
uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length)
{
switch (lun)
{
case :
Memory_Offset+=(*);//扇区偏移,外部flash文件系统空间放在外部flash 6M空间 //printf("write add =%d.length=%d\n",Memory_Offset/4096,Transfer_Length/4096);
SPI_FLASH_SectorErase(Memory_Offset);
SPI_FLASH_BufferWrite((uint8_t *)Writebuff,Memory_Offset,Transfer_Length);
break;
case :
Status = SD_WriteBlock((uint8_t*)Writebuff, Memory_Offset, Transfer_Length);
Status = SD_WaitWriteOperation();
while(SD_GetStatus() != SD_TRANSFER_OK);
if ( Status != SD_OK )
{
return MAL_FAIL;
}
break;
default:
return MAL_FAIL;
}
return MAL_OK;
}
 /*******************************************************************************
* Function Name : MAL_Read
* Description : Read sectors
* Input : None
* Output : None
* Return : Buffer pointer
*******************************************************************************/
uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length)
{ switch (lun)
{
case :
Memory_Offset+=(*);//扇区偏移 //printf("read add =%d.length=%d\n",Memory_Offset/4096,Transfer_Length/4096);
SPI_FLASH_BufferRead((uint8_t *)Readbuff, Memory_Offset, Transfer_Length);
break; case :
SD_ReadBlock((uint8_t*)Readbuff, Memory_Offset, Transfer_Length);
Status = SD_WaitReadOperation();
while(SD_GetStatus() != SD_TRANSFER_OK)
{
}
if ( Status != SD_OK )
{
return MAL_FAIL;
}
break;
default:
return MAL_FAIL;
}
return MAL_OK;
}
 /*******************************************************************************
* Function Name : MAL_GetStatus
* Description : Get status
* Input : None
* Output : None
* Return : None
*******************************************************************************/
uint16_t MAL_GetStatus (uint8_t lun)
{
uint32_t DeviceSizeMul = , NumberOfBlocks = ;
switch (lun)
{
case :
{
FLASH_SPI_disk_initialize();
if(SPI_FLASH_ReadID()==sFLASH_ID)
{
Mass_Block_Size[] =;
Mass_Block_Count[] =;
Mass_Memory_Size[] =Mass_Block_Size[]*Mass_Block_Count[];
return MAL_OK;
}
}
case :
if (SD_Init() == SD_OK)
{
SD_GetCardInfo(&SDCardInfo);
SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << ));
DeviceSizeMul = (SDCardInfo.SD_csd.DeviceSizeMul + ); if(SDCardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
{
Mass_Block_Count[] = (SDCardInfo.SD_csd.DeviceSize + ) * ;
}
else
{
NumberOfBlocks = (( << (SDCardInfo.SD_csd.RdBlockLen)) / );
Mass_Block_Count[] = ((SDCardInfo.SD_csd.DeviceSize + ) * ( << DeviceSizeMul) << (NumberOfBlocks/));
}
Mass_Block_Size[] = ; Status = SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << ));
Status = SD_EnableWideBusOperation(SDIO_BusWide_4b);
if ( Status != SD_OK )
{
return MAL_FAIL;
} Mass_Memory_Size[] = Mass_Block_Count[] * Mass_Block_Size[];
return MAL_OK;
}
default:break;
}
return MAL_FAIL;
}

野火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. linq to sql ,将var 类型转为 IList 类型

    public void SOHSelecting(int startRowIndex, int maximumRows, string sortExpression, string location) ...

  2. 漫游Kafka实战篇之客户端API

    Kafka Producer APIs 旧版的Procuder API有两种:kafka.producer.SyncProducer和kafka.producer.async.AsyncProduce ...

  3. Codeforces Round #291 (Div. 2)

    A 题意:给出变换规则,单个数字t可以变成9-t,然后给出一个数,问最小能够变成多少. 自己做的时候理解成了不能输出前导0,但是题目的本意是不能有前导0(即最高位不能是0,其余位数按照规则就好) 55 ...

  4. C语言之内存覆盖

    在实现memcpy函数的时候,我们说过要考虑内存覆盖的问题,到底什么是内存覆盖呢,他的出现对程序到底有什么影响呢?我们又要如何去解决这种问题的发生? 首先先看一般人经常实现的memcpy函数: #in ...

  5. I.MX6 Linux mipi配置数据合成

    /*************************************************************************** * I.MX6 Linux mipi配置数据合 ...

  6. hihoCoder #1182 欧拉路·三 (变形)

    题意: 写出一个环,环上有2^n个格子,每个格子中的数字是0或1,相连着的n个格子可以组成一个数的二进制,要求给出这2^n个数字的序列,使得组成的2^n个数字全是不同的.(即从0到2^n-1) 思路: ...

  7. 学习java之HashMap和TreeMap

    HashMap和TreeMap是Map接口的两种实现,ArrayDeque和LinkedList是Queue接口的两种实现方式.下面的代码是我今天学习这四个数据结构之后写的.还是不熟悉,TreeMap ...

  8. matplotlib 中文问题

    matplotlib的缺省配置文件中所使用的字体无法正确显示中文.为了让图表能正确显示中文,主要有三种设置中文的方法: (1)直接读取指定的字体文件.这种方法的依赖性最小,缺点是要指定字体文件的路径. ...

  9. scala学习笔记(3):类

    1 类 (1) scala把主构造函数放到类的定义中,让定义字段及相应方法变得简单起来. class People(age: Int, name: String) scala会自动将这个类变成publ ...

  10. 五个JS经典面试题

    1:Scope作用范围 1: (function() { 2: var a = b = 5; 3: })(); 4: 5: console.log(b); 什么会被打印在控制台上? 回答 上面的代码会 ...