bsp_SD.h
D:/gitt/MicrochipFor32/bsp_Device/bsp_SD.h
浏览该文件的文档.00001 /*----------------------------------------------------------------------------------------------------
00002 #
00003 # Copyright (c) 2022 Yuankang Liang(XerolySkinner)
00004 #
00005 # 本软件按原样提供,无任何明示或暗示
00006 # 在任何情况下,作者都不承担任何损害赔偿责任
00007 #
00008 # 使用的许可声明:
00009 # 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
00010 # 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
00011 # 并且版权声明和许可声明同时出现.
00012 # 3. 你有使用,复制,修改,分发,和销售本软件的许可.
00013 # 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
00014 # 5. 本通知不得从任何来源删除或更改.
00015 #
00016 # Yuankang Liang(XerolySkinner)
00017 # E-mail:zabbcccbbaz@163.com
00018 # QQ:2715099320
00019 # Mobile Phone:13005636215
00020 #
00021 # All rights reserved.
00022 */
00023
00034 #pragma once
00035 #ifdef __cplusplus
00037 //----------------------------------------------------------------------------------------------------
00038 // 头文件
00039 //
00040 #include "spi.h"
00041 #include "varint.h"
00043 //----------------------------------------------------------------------------------------------------
00044 // 数据
00045 //
00046 //----------------------------------------------------------------------------------------------------
00047 //SD卡类型
00048 #define ERR 0x00
00049 #define MMC 0x01
00050 #define V1 0x02
00051 #define V2 0x04
00052 #define V2HC 0x06
00053 #define DUMMY_BYTE 0xFF
00054 #define MSD_BLOCKSIZE 512
00055 //----------------------------------------------------------------------------------------------------
00056 //CMD定义
00057 #define CMD0 0 //卡复位
00058 #define CMD1 1
00059 #define CMD8 8 //命令8 ,SEND_IF_COND
00060 #define CMD9 9 //命令9 ,读CSD数据
00061 #define CMD10 10 //命令10,读CID数据
00062 #define CMD12 12 //命令12,停止数据传输
00063 #define CMD16 16 //命令16,设置SectorSize 应返回0x00
00064 #define CMD17 17 //命令17,读sector
00065 #define CMD18 18 //命令18,读Multi sector
00066 #define CMD23 23 //命令23,设置多sector写入前预先擦除N个block
00067 #define CMD24 24 //命令24,写sector
00068 #define CMD25 25 //命令25,写Multi sector
00069 #define CMD41 41 //命令41,应返回0x00
00070 #define CMD55 55 //命令55,应返回0x01
00071 #define CMD58 58 //命令58,读OCR信息
00072 #define CMD59 59 //命令59,使能/禁止CRC,应返回0x00
00073 //----------------------------------------------------------------------------------------------------
00074 //数据写入回应字意义
00075 #define MSD_DATA_OK 0x05
00076 #define MSD_DATA_CRC_ERROR 0x0B
00077 #define MSD_DATA_WRITE_ERROR 0x0D
00078 #define MSD_DATA_OTHER_ERROR 0xFF
00079 //SD卡回应标记字
00080 #define MSD_RESPONSE_NO_ERROR 0x00
00081 #define MSD_IN_IDLE_STATE 0x01
00082 #define MSD_ERASE_RESET 0x02
00083 #define MSD_ILLEGAL_COMMAND 0x04
00084 #define MSD_COM_CRC_ERROR 0x08
00085 #define MSD_ERASE_SEQUENCE_ERROR 0x10
00086 #define MSD_ADDRESS_ERROR 0x20
00087 #define MSD_PARAMETER_ERROR 0x40
00088 #define MSD_RESPONSE_FAILURE 0xFF
00089 //----------------------------------------------------------------------------------------------------
00090 enum _CD_HOLD {
00091 HOLD = 0,
00092 RELEASE = 1,
00093 };
00094 //----------------------------------------------------------------------------------------------------
00095 typedef struct { /* Card Specific Data */
00096 u8 CSDStruct; /* CSD structure */
00097 u8 SysSpecVersion; /* System specification version */
00098 u8 Reserved1; /* Reserved */
00099 u8 TAAC; /* Data read access-time 1 */
00100 u8 NSAC; /* Data read access-time 2 in CLK cycles */
00101 u8 MaxBusClkFrec; /* Max. bus clock frequency */
00102 u16 CardComdClasses; /* Card command classes */
00103 u8 RdBlockLen; /* Max. read data block length */
00104 u8 PartBlockRead; /* Partial blocks for read allowed */
00105 u8 WrBlockMisalign; /* Write block misalignment */
00106 u8 RdBlockMisalign; /* Read block misalignment */
00107 u8 DSRImpl; /* DSR implemented */
00108 u8 Reserved2; /* Reserved */
00109 u32 DeviceSize; /* Device Size */
00110 u8 MaxRdCurrentVDDMin; /* Max. read current @ VDD min */
00111 u8 MaxRdCurrentVDDMax; /* Max. read current @ VDD max */
00112 u8 MaxWrCurrentVDDMin; /* Max. write current @ VDD min */
00113 u8 MaxWrCurrentVDDMax; /* Max. write current @ VDD max */
00114 u8 DeviceSizeMul; /* Device size multiplier */
00115 u8 EraseGrSize; /* Erase group size */
00116 u8 EraseGrMul; /* Erase group size multiplier */
00117 u8 WrProtectGrSize; /* Write protect group size */
00118 u8 WrProtectGrEnable; /* Write protect group enable */
00119 u8 ManDeflECC; /* Manufacturer default ECC */
00120 u8 WrSpeedFact; /* Write speed factor */
00121 u8 MaxWrBlockLen; /* Max. write data block length */
00122 u8 WriteBlockPaPartial; /* Partial blocks for write allowed */
00123 u8 Reserved3; /* Reserded */
00124 u8 ContentProtectAppli; /* Content protection application */
00125 u8 FileFormatGrouop; /* File format group */
00126 u8 CopyFlag; /* Copy flag (OTP) */
00127 u8 PermWrProtect; /* Permanent write protection */
00128 u8 TempWrProtect; /* Temporary write protection */
00129 u8 FileFormat; /* File Format */
00130 u8 ECC; /* ECC code */
00131 u8 CSD_CRC; /* CSD CRC */
00132 u8 Reserved4; /* always 1*/
00133 } MSD_CSD;
00134
00135 //----------------------------------------------------------------------------------------------------
00136 typedef struct { /*Card Identification Data*/
00137 u8 ManufacturerID; /* ManufacturerID */
00138 u16 OEM_AppliID; /* OEM/Application ID */
00139 u32 ProdName1; /* Product Name part1 */
00140 u8 ProdName2; /* Product Name part2*/
00141 u8 ProdRev; /* Product Revision */
00142 u32 ProdSN; /* Product Serial Number */
00143 u8 Reserved1; /* Reserved1 */
00144 u16 ManufactDate; /* Manufacturing Date */
00145 u8 CID_CRC; /* CID CRC */
00146 u8 Reserved2; /* always 1 */
00147 } MSD_CID;
00148 //----------------------------------------------------------------------------------------------------
00149 typedef struct {
00150 MSD_CSD CSD;
00151 MSD_CID CID;
00152 u32 Capacity; /* Card Capacity */
00153 u32 BlockSize; /* Card Block Size */
00154 u16 RCA;
00155 u8 CardType;
00156 u32 SpaceTotal; /* Total space size in file system */
00157 u32 SpaceFree;
00158 } /* Free space size in file system */
00159 //----------------------------------------------------------------------------------------------------
00160 MSD_CARDINFO, *PMSD_CARDINFO;
00161 extern MSD_CARDINFO SD0_CardInfo;
00163 //----------------------------------------------------------------------------------------------------
00164 // 类目
00165 //
00169 class bsp_SD{
00170 public:
00171 bsp_SD(SPI_HandleTypeDef *hspi,GPIO_TypeDef *GPIOx_CS,uint16_t GPIO_Pin_CS);
00172 public:
00173 u8 SD_init(void);
00174 u8 SD_ReadDisk(u8 * buf, u32 sector, u8 cnt);
00175 u8 SD_WriteDisk(u8 * buf, u32 sector, u8 cnt);
00176 u32 SD_GetSectorCount(void);
00177 u8 offsetWrite(u64 offset,u8* dat,u64 datlen);
00178 u8 offsetRead(u64 offset,u8* dat,u64 datlen);
00179 private:
00180 SPI_HandleTypeDef *hspi;
00181 GPIO_TypeDef *GPIOx_CS;
00182 uint16_t GPIO_Pin_CS;
00183
00184 u8 DFF;
00185 u8 SD_TYPE;
00186 MSD_CARDINFO SD0_CardInfo;
00187
00188 void SD_CS(u8 p);
00189 u8 SD_GETCID(u8 * cid_data);
00190 u8 SD_GETCSD(u8 * csd_data);
00191 int MSD0_GetCardInfo(PMSD_CARDINFO SD0_CardInfo);
00192 u8 SD_ReceiveData(u8 * data, u16 len);
00193 u8 SD_SendBlock(u8 * buf, u8 cmd);
00194 u32 SD_sendcmd(u8 cmd, u32 arg, u8 crc);
00195
00196 void SPI_setspeed(u8 speed);
00197 u8 spi_readwrite(u8 Txdata);
00198 };
00200 #endif
00201