⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi_msd_driver.h

📁 STM32_fatfs_shell_SDHC.rar
💻 H
字号:
#ifndef _SPI_MSD_DRIVER_H_
#define _SPI_MSD_DRIVER_H_


// ******************************************************************************
// Includes
// ******************************************************************************
//#include "stm32f10x_lib.h"


/*******************************************************************************
* Private define
*******************************************************************************/
#define CARDTYPE_MMC     		0x00
#define CARDTYPE_SDV1      	0x01
#define CARDTYPE_SDV2      	0x02
#define CARDTYPE_SDV2HC    	0x04

#define DUMMY_BYTE					0xFF 
#define MSD_BLOCKSIZE				_MAX_SS

enum _CS_HOLD
{
	HOLD = 0,
	RELEASE = 1,
};

typedef struct       /* Card Specific Data */
{
  vu8  CSDStruct;            /* CSD structure */
  vu8  SysSpecVersion;       /* System specification version */
  vu8  Reserved1;            /* Reserved */
  vu8  TAAC;                 /* Data read access-time 1 */
  vu8  NSAC;                 /* Data read access-time 2 in CLK cycles */
  vu8  MaxBusClkFrec;        /* Max. bus clock frequency */
  vu16 CardComdClasses;      /* Card command classes */
  vu8  RdBlockLen;           /* Max. read data block length */
  vu8  PartBlockRead;        /* Partial blocks for read allowed */
  vu8  WrBlockMisalign;      /* Write block misalignment */
  vu8  RdBlockMisalign;      /* Read block misalignment */
  vu8  DSRImpl;              /* DSR implemented */
  vu8  Reserved2;            /* Reserved */
  vu32 DeviceSize;           /* Device Size */
  vu8  MaxRdCurrentVDDMin;   /* Max. read current @ VDD min */
  vu8  MaxRdCurrentVDDMax;   /* Max. read current @ VDD max */
  vu8  MaxWrCurrentVDDMin;   /* Max. write current @ VDD min */
  vu8  MaxWrCurrentVDDMax;   /* Max. write current @ VDD max */
  vu8  DeviceSizeMul;        /* Device size multiplier */
  vu8  EraseGrSize;          /* Erase group size */
  vu8  EraseGrMul;           /* Erase group size multiplier */
  vu8  WrProtectGrSize;      /* Write protect group size */
  vu8  WrProtectGrEnable;    /* Write protect group enable */
  vu8  ManDeflECC;           /* Manufacturer default ECC */
  vu8  WrSpeedFact;          /* Write speed factor */
  vu8  MaxWrBlockLen;        /* Max. write data block length */
  vu8  WriteBlockPaPartial;  /* Partial blocks for write allowed */
  vu8  Reserved3;            /* Reserded */
  vu8  ContentProtectAppli;  /* Content protection application */
  vu8  FileFormatGrouop;     /* File format group */
  vu8  CopyFlag;             /* Copy flag (OTP) */
  vu8  PermWrProtect;        /* Permanent write protection */
  vu8  TempWrProtect;        /* Temporary write protection */
  vu8  FileFormat;           /* File Format */
  vu8  ECC;                  /* ECC code */
  vu8  CSD_CRC;              /* CSD CRC */
  vu8  Reserved4;            /* always 1*/
}
MSD_CSD;

typedef struct							/*Card Identification Data*/
{
  vu8  ManufacturerID;       /* ManufacturerID */
  vu16 OEM_AppliID;          /* OEM/Application ID */
  vu32 ProdName1;            /* Product Name part1 */
  vu8  ProdName2;            /* Product Name part2*/
  vu8  ProdRev;              /* Product Revision */
  vu32 ProdSN;               /* Product Serial Number */
  vu8  Reserved1;            /* Reserved1 */
  vu16 ManufactDate;         /* Manufacturing Date */
  vu8  CID_CRC;              /* CID CRC */
  vu8  Reserved2;            /* always 1 */
}
MSD_CID;

typedef struct
{
  MSD_CSD CSD;
  MSD_CID CID;
  u32 Capacity;          /* Card Capacity */
  u32 BlockSize;         /* Card Block Size */
  u16 RCA;
  u8 CardType;
	u32 SpaceTotal;      		/* Total space size in file system */
	u32 SpaceFree;      		/* Free space size in file system */
}
MSD_CARDINFO, *PMSD_CARDINFO;


/*******************************************************************************
* SD/MMC command list - SPI mode
*******************************************************************************/
#define CMD0    0       // Reset
#define CMD1    1       // Send Operator Condition - SEND_OP_COND
#define CMD8    8       // Send Interface Condition - SEND_IF_COND
#define CMD9    9       // Read CSD
#define CMD10   10      // Read CID
#define CMD12   12      // Stop data transmit
#define CMD16   16      // Set block size, should return 0x00 
#define CMD17   17      // Read single block
#define CMD18   18      // Read multi block
#define ACMD23  23      // Prepare erase N-blokcs before multi block write
#define CMD24   24      // Write single block
#define CMD25   25      // Write multi block
#define ACMD41  41      // should return 0x00
#define CMD55   55      // should return 0x01
#define CMD58   58      // Read OCR
#define CMD59   59      // CRC disable/enbale, should return 0x00




/*******************************************************************************
* Private function prototypes
*******************************************************************************/
// Application Programming Interface 
u8 MSD_Init(void);
u8 MSD_GetCardInfo(PMSD_CARDINFO cardinfo);
u8 MSD_ReadSingleBlock(u32 sector, u8 *buffer);
u8 MSD_ReadMultiBlock(u32 sector, u8 *buffer, u32 NbrOfSector);
u8 MSD_WriteSingleBlock(u32 sector, uc8 *buffer);
u8 MSD_WriteMultiBlock(u32 sector, uc8 *buffer, u32 NbrOfSector);

void MSD_SPIConfig(void);
void MSD_SPIHighSpeed(u8 b_high);

// Low level functions
__inline u8 _spi_read_write(u8 data);
u8 _send_command(u8 cmd, u32 arg, u8 crc);
u8 _send_command_hold(u8 cmd, u32 arg, u8 crc);
u8 _read_buffer(u8 *buff, u16 len, u8 release);

// Physical level functions
void MSD_SPIConfig(void);
void MSD_SPIHighSpeed(u8 b_high);

// Physical level marcos
#define _card_enable()      		GPIOB->ODR &=~(1<<6)
#define _card_disable()     		GPIOB->ODR |= (1<<6)
#define _card_power_on()         	 
#define _card_power_off()        	 
#define _card_insert()        		 

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -