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