202 lines
7.7 KiB
C
202 lines
7.7 KiB
C
|
|
/*----------------------------------------------------------------------------------------------------
|
|||
|
|
#
|
|||
|
|
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
|
|||
|
|
#
|
|||
|
|
# <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD>ṩ,<2C><><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ʾ
|
|||
|
|
# <09><><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>߶<EFBFBD><DFB6><EFBFBD><EFBFBD>е<EFBFBD><D0B5>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⳥<EFBFBD><E2B3A5><EFBFBD><EFBFBD>
|
|||
|
|
#
|
|||
|
|
# ʹ<>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|||
|
|
# 1. <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ,<2C>㲻<EFBFBD><E3B2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD>.
|
|||
|
|
# 2. <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>Ŀ<EFBFBD><C4BF>,ǰ<><C7B0><EFBFBD>ǰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
# <09><><EFBFBD>Ұ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD>.
|
|||
|
|
# 3. <09><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>,<2C><><EFBFBD><EFBFBD>,<2C><EFBFBD>,<2C>ַ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>۱<EFBFBD><DBB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
# 4. <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>Ʒ<EFBFBD><C6B7>ʹ<EFBFBD><CAB9>,<2C><>Ʒ<EFBFBD>ĵ<EFBFBD><C4B5>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵ĵ<CDB5><C4B5><EFBFBD><EFBFBD>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
# 5. <09><>֪ͨ<CDA8><D6AA><EFBFBD>ô<EFBFBD><C3B4>κ<EFBFBD><CEBA><EFBFBD>Դɾ<D4B4><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
#
|
|||
|
|
# Yuankang Liang(XerolySkinner)
|
|||
|
|
# E-mail:zabbcccbbaz@163.com
|
|||
|
|
# QQ:2715099320
|
|||
|
|
# Mobile Phone:13005636215
|
|||
|
|
#
|
|||
|
|
# All rights reserved.
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @file bsp_SD.cpp
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>SD<EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>
|
|||
|
|
* @mainpage <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>Ϣ
|
|||
|
|
* @author Yuankang Liang(XerolySkinner)
|
|||
|
|
* @email zabbcccbbaz@163.com
|
|||
|
|
* @version V1.0.0
|
|||
|
|
* @date 2022-11-22 03:50
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#pragma once
|
|||
|
|
#ifdef __cplusplus
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
// ͷ<>ļ<EFBFBD>
|
|||
|
|
//
|
|||
|
|
#include "spi.h"
|
|||
|
|
#include "varint.h"
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
// <09><><EFBFBD><EFBFBD>
|
|||
|
|
//
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
//SD<53><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#define ERR 0x00
|
|||
|
|
#define MMC 0x01
|
|||
|
|
#define V1 0x02
|
|||
|
|
#define V2 0x04
|
|||
|
|
#define V2HC 0x06
|
|||
|
|
#define DUMMY_BYTE 0xFF
|
|||
|
|
#define MSD_BLOCKSIZE 512
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
//CMD<4D><44><EFBFBD><EFBFBD>
|
|||
|
|
#define CMD0 0 //<2F><><EFBFBD><EFBFBD>λ
|
|||
|
|
#define CMD1 1
|
|||
|
|
#define CMD8 8 //<2F><><EFBFBD><EFBFBD>8 <20><>SEND_IF_COND
|
|||
|
|
#define CMD9 9 //<2F><><EFBFBD><EFBFBD>9 <20><><EFBFBD><EFBFBD>CSD<53><44><EFBFBD><EFBFBD>
|
|||
|
|
#define CMD10 10 //<2F><><EFBFBD><EFBFBD>10<31><30><EFBFBD><EFBFBD>CID<49><44><EFBFBD><EFBFBD>
|
|||
|
|
#define CMD12 12 //<2F><><EFBFBD><EFBFBD>12<31><32>ֹͣ<CDA3><D6B9><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
|
|||
|
|
#define CMD16 16 //<2F><><EFBFBD><EFBFBD>16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SectorSize Ӧ<><D3A6><EFBFBD><EFBFBD>0x00
|
|||
|
|
#define CMD17 17 //<2F><><EFBFBD><EFBFBD>17<31><37><EFBFBD><EFBFBD>sector
|
|||
|
|
#define CMD18 18 //<2F><><EFBFBD><EFBFBD>18<31><38><EFBFBD><EFBFBD>Multi sector
|
|||
|
|
#define CMD23 23 //<2F><><EFBFBD><EFBFBD>23<32><33><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>sectorд<72><D0B4>ǰԤ<C7B0>Ȳ<EFBFBD><C8B2><EFBFBD>N<EFBFBD><4E>block
|
|||
|
|
#define CMD24 24 //<2F><><EFBFBD><EFBFBD>24<32><34>дsector
|
|||
|
|
#define CMD25 25 //<2F><><EFBFBD><EFBFBD>25<32><35>дMulti sector
|
|||
|
|
#define CMD41 41 //<2F><><EFBFBD><EFBFBD>41<34><31>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>0x00
|
|||
|
|
#define CMD55 55 //<2F><><EFBFBD><EFBFBD>55<35><35>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>0x01
|
|||
|
|
#define CMD58 58 //<2F><><EFBFBD><EFBFBD>58<35><38><EFBFBD><EFBFBD>OCR<43><52>Ϣ
|
|||
|
|
#define CMD59 59 //<2F><><EFBFBD><EFBFBD>59<35><39>ʹ<EFBFBD><CAB9>/<2F><>ֹCRC<52><43>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>0x00
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#define MSD_DATA_OK 0x05
|
|||
|
|
#define MSD_DATA_CRC_ERROR 0x0B
|
|||
|
|
#define MSD_DATA_WRITE_ERROR 0x0D
|
|||
|
|
#define MSD_DATA_OTHER_ERROR 0xFF
|
|||
|
|
//SD<53><44><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#define MSD_RESPONSE_NO_ERROR 0x00
|
|||
|
|
#define MSD_IN_IDLE_STATE 0x01
|
|||
|
|
#define MSD_ERASE_RESET 0x02
|
|||
|
|
#define MSD_ILLEGAL_COMMAND 0x04
|
|||
|
|
#define MSD_COM_CRC_ERROR 0x08
|
|||
|
|
#define MSD_ERASE_SEQUENCE_ERROR 0x10
|
|||
|
|
#define MSD_ADDRESS_ERROR 0x20
|
|||
|
|
#define MSD_PARAMETER_ERROR 0x40
|
|||
|
|
#define MSD_RESPONSE_FAILURE 0xFF
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
enum _CD_HOLD {
|
|||
|
|
HOLD = 0,
|
|||
|
|
RELEASE = 1,
|
|||
|
|
};
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
typedef struct { /* Card Specific Data */
|
|||
|
|
u8 CSDStruct; /* CSD structure */
|
|||
|
|
u8 SysSpecVersion; /* System specification version */
|
|||
|
|
u8 Reserved1; /* Reserved */
|
|||
|
|
u8 TAAC; /* Data read access-time 1 */
|
|||
|
|
u8 NSAC; /* Data read access-time 2 in CLK cycles */
|
|||
|
|
u8 MaxBusClkFrec; /* Max. bus clock frequency */
|
|||
|
|
u16 CardComdClasses; /* Card command classes */
|
|||
|
|
u8 RdBlockLen; /* Max. read data block length */
|
|||
|
|
u8 PartBlockRead; /* Partial blocks for read allowed */
|
|||
|
|
u8 WrBlockMisalign; /* Write block misalignment */
|
|||
|
|
u8 RdBlockMisalign; /* Read block misalignment */
|
|||
|
|
u8 DSRImpl; /* DSR implemented */
|
|||
|
|
u8 Reserved2; /* Reserved */
|
|||
|
|
u32 DeviceSize; /* Device Size */
|
|||
|
|
u8 MaxRdCurrentVDDMin; /* Max. read current @ VDD min */
|
|||
|
|
u8 MaxRdCurrentVDDMax; /* Max. read current @ VDD max */
|
|||
|
|
u8 MaxWrCurrentVDDMin; /* Max. write current @ VDD min */
|
|||
|
|
u8 MaxWrCurrentVDDMax; /* Max. write current @ VDD max */
|
|||
|
|
u8 DeviceSizeMul; /* Device size multiplier */
|
|||
|
|
u8 EraseGrSize; /* Erase group size */
|
|||
|
|
u8 EraseGrMul; /* Erase group size multiplier */
|
|||
|
|
u8 WrProtectGrSize; /* Write protect group size */
|
|||
|
|
u8 WrProtectGrEnable; /* Write protect group enable */
|
|||
|
|
u8 ManDeflECC; /* Manufacturer default ECC */
|
|||
|
|
u8 WrSpeedFact; /* Write speed factor */
|
|||
|
|
u8 MaxWrBlockLen; /* Max. write data block length */
|
|||
|
|
u8 WriteBlockPaPartial; /* Partial blocks for write allowed */
|
|||
|
|
u8 Reserved3; /* Reserded */
|
|||
|
|
u8 ContentProtectAppli; /* Content protection application */
|
|||
|
|
u8 FileFormatGrouop; /* File format group */
|
|||
|
|
u8 CopyFlag; /* Copy flag (OTP) */
|
|||
|
|
u8 PermWrProtect; /* Permanent write protection */
|
|||
|
|
u8 TempWrProtect; /* Temporary write protection */
|
|||
|
|
u8 FileFormat; /* File Format */
|
|||
|
|
u8 ECC; /* ECC code */
|
|||
|
|
u8 CSD_CRC; /* CSD CRC */
|
|||
|
|
u8 Reserved4; /* always 1*/
|
|||
|
|
} MSD_CSD;
|
|||
|
|
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
typedef struct { /*Card Identification Data*/
|
|||
|
|
u8 ManufacturerID; /* ManufacturerID */
|
|||
|
|
u16 OEM_AppliID; /* OEM/Application ID */
|
|||
|
|
u32 ProdName1; /* Product Name part1 */
|
|||
|
|
u8 ProdName2; /* Product Name part2*/
|
|||
|
|
u8 ProdRev; /* Product Revision */
|
|||
|
|
u32 ProdSN; /* Product Serial Number */
|
|||
|
|
u8 Reserved1; /* Reserved1 */
|
|||
|
|
u16 ManufactDate; /* Manufacturing Date */
|
|||
|
|
u8 CID_CRC; /* CID CRC */
|
|||
|
|
u8 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;
|
|||
|
|
extern MSD_CARDINFO SD0_CardInfo;
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
//----------------------------------------------------------------------------------------------------
|
|||
|
|
// <09><>Ŀ
|
|||
|
|
//
|
|||
|
|
/**
|
|||
|
|
* @brief һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
class bsp_SD{
|
|||
|
|
public:
|
|||
|
|
bsp_SD(SPI_HandleTypeDef *hspi,GPIO_TypeDef *GPIOx_CS,uint16_t GPIO_Pin_CS);
|
|||
|
|
public:
|
|||
|
|
u8 SD_init(void);
|
|||
|
|
u8 SD_ReadDisk(u8 * buf, u32 sector, u8 cnt);
|
|||
|
|
u8 SD_WriteDisk(u8 * buf, u32 sector, u8 cnt);
|
|||
|
|
u32 SD_GetSectorCount(void);
|
|||
|
|
u8 offsetWrite(u64 offset,u8* dat,u64 datlen);
|
|||
|
|
u8 offsetRead(u64 offset,u8* dat,u64 datlen);
|
|||
|
|
private:
|
|||
|
|
SPI_HandleTypeDef *hspi;
|
|||
|
|
GPIO_TypeDef *GPIOx_CS;
|
|||
|
|
uint16_t GPIO_Pin_CS;
|
|||
|
|
|
|||
|
|
u8 DFF;
|
|||
|
|
u8 SD_TYPE;
|
|||
|
|
MSD_CARDINFO SD0_CardInfo;
|
|||
|
|
|
|||
|
|
void SD_CS(u8 p);
|
|||
|
|
u8 SD_GETCID(u8 * cid_data);
|
|||
|
|
u8 SD_GETCSD(u8 * csd_data);
|
|||
|
|
int MSD0_GetCardInfo(PMSD_CARDINFO SD0_CardInfo);
|
|||
|
|
u8 SD_ReceiveData(u8 * data, u16 len);
|
|||
|
|
u8 SD_SendBlock(u8 * buf, u8 cmd);
|
|||
|
|
u32 SD_sendcmd(u8 cmd, u32 arg, u8 crc);
|
|||
|
|
|
|||
|
|
void SPI_setspeed(u8 speed);
|
|||
|
|
u8 spi_readwrite(u8 Txdata);
|
|||
|
|
};
|
|||
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
#endif
|
|||
|
|
|