bsp_SD.h spi.h varint.h D:/gitt/MicrochipFor32/bsp_Device/bsp_SD.cpp MSD_CSD MSD_CID MSD_CARDINFO bsp_SD ERR 0x00 MMC 0x01 V1 0x02 V2 0x04 V2HC 0x06 DUMMY_BYTE 0xFF MSD_BLOCKSIZE 512 CMD0 0 CMD1 1 CMD8 8 CMD9 9 CMD10 10 CMD12 12 CMD16 16 CMD17 17 CMD18 18 CMD23 23 CMD24 24 CMD25 25 CMD41 41 CMD55 55 CMD58 58 CMD59 59 MSD_DATA_OK 0x05 MSD_DATA_CRC_ERROR 0x0B MSD_DATA_WRITE_ERROR 0x0D MSD_DATA_OTHER_ERROR 0xFF MSD_RESPONSE_NO_ERROR 0x00 MSD_IN_IDLE_STATE 0x01 MSD_ERASE_RESET 0x02 MSD_ILLEGAL_COMMAND 0x04 MSD_COM_CRC_ERROR 0x08 MSD_ERASE_SEQUENCE_ERROR 0x10 MSD_ADDRESS_ERROR 0x20 MSD_PARAMETER_ERROR 0x40 MSD_RESPONSE_FAILURE 0xFF _CD_HOLD HOLD = 0 RELEASE = 1 struct MSD_CARDINFO * typedef struct MSD_CARDINFO * PMSD_CARDINFO PMSD_CARDINFO MSD_CARDINFO MSD_CARDINFO SD0_CardInfo SD0_CardInfo 操作SD卡的库 /*---------------------------------------------------------------------------------------------------- # #Copyright(c)2022YuankangLiang(XerolySkinner) # #本软件按原样提供,无任何明示或暗示 #在任何情况下,作者都不承担任何损害赔偿责任 # #使用的许可声明: #1.不得歪曲本软件的来源,你不能声称你编写了原始软件. #2.免费授予以任何目的,前提是版权声明出现在所有副本中. #并且版权声明和许可声明同时出现. #3.你有使用,复制,修改,分发,和销售本软件的许可. #4.如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的. #5.本通知不得从任何来源删除或更改. # #YuankangLiang(XerolySkinner) #E-mail:zabbcccbbaz@163.com #QQ:2715099320 #MobilePhone:13005636215 # #Allrightsreserved. */ #pragmaonce #ifdef__cplusplus //---------------------------------------------------------------------------------------------------- //头文件 // #include"spi.h" #include"varint.h" //---------------------------------------------------------------------------------------------------- //数据 // //---------------------------------------------------------------------------------------------------- //SD卡类型 #defineERR0x00 #defineMMC0x01 #defineV10x02 #defineV20x04 #defineV2HC0x06 #defineDUMMY_BYTE0xFF #defineMSD_BLOCKSIZE512 //---------------------------------------------------------------------------------------------------- //CMD定义 #defineCMD00//卡复位 #defineCMD11 #defineCMD88//命令8,SEND_IF_COND #defineCMD99//命令9,读CSD数据 #defineCMD1010//命令10,读CID数据 #defineCMD1212//命令12,停止数据传输 #defineCMD1616//命令16,设置SectorSize应返回0x00 #defineCMD1717//命令17,读sector #defineCMD1818//命令18,读Multisector #defineCMD2323//命令23,设置多sector写入前预先擦除N个block #defineCMD2424//命令24,写sector #defineCMD2525//命令25,写Multisector #defineCMD4141//命令41,应返回0x00 #defineCMD5555//命令55,应返回0x01 #defineCMD5858//命令58,读OCR信息 #defineCMD5959//命令59,使能/禁止CRC,应返回0x00 //---------------------------------------------------------------------------------------------------- //数据写入回应字意义 #defineMSD_DATA_OK0x05 #defineMSD_DATA_CRC_ERROR0x0B #defineMSD_DATA_WRITE_ERROR0x0D #defineMSD_DATA_OTHER_ERROR0xFF //SD卡回应标记字 #defineMSD_RESPONSE_NO_ERROR0x00 #defineMSD_IN_IDLE_STATE0x01 #defineMSD_ERASE_RESET0x02 #defineMSD_ILLEGAL_COMMAND0x04 #defineMSD_COM_CRC_ERROR0x08 #defineMSD_ERASE_SEQUENCE_ERROR0x10 #defineMSD_ADDRESS_ERROR0x20 #defineMSD_PARAMETER_ERROR0x40 #defineMSD_RESPONSE_FAILURE0xFF //---------------------------------------------------------------------------------------------------- enum_CD_HOLD{ HOLD=0, RELEASE=1, }; //---------------------------------------------------------------------------------------------------- typedefstruct{/*CardSpecificData*/ u8CSDStruct;/*CSDstructure*/ u8SysSpecVersion;/*Systemspecificationversion*/ u8Reserved1;/*Reserved*/ u8TAAC;/*Datareadaccess-time1*/ u8NSAC;/*Datareadaccess-time2inCLKcycles*/ u8MaxBusClkFrec;/*Max.busclockfrequency*/ u16CardComdClasses;/*Cardcommandclasses*/ u8RdBlockLen;/*Max.readdatablocklength*/ u8PartBlockRead;/*Partialblocksforreadallowed*/ u8WrBlockMisalign;/*Writeblockmisalignment*/ u8RdBlockMisalign;/*Readblockmisalignment*/ u8DSRImpl;/*DSRimplemented*/ u8Reserved2;/*Reserved*/ u32DeviceSize;/*DeviceSize*/ u8MaxRdCurrentVDDMin;/*Max.readcurrent@VDDmin*/ u8MaxRdCurrentVDDMax;/*Max.readcurrent@VDDmax*/ u8MaxWrCurrentVDDMin;/*Max.writecurrent@VDDmin*/ u8MaxWrCurrentVDDMax;/*Max.writecurrent@VDDmax*/ u8DeviceSizeMul;/*Devicesizemultiplier*/ u8EraseGrSize;/*Erasegroupsize*/ u8EraseGrMul;/*Erasegroupsizemultiplier*/ u8WrProtectGrSize;/*Writeprotectgroupsize*/ u8WrProtectGrEnable;/*Writeprotectgroupenable*/ u8ManDeflECC;/*ManufacturerdefaultECC*/ u8WrSpeedFact;/*Writespeedfactor*/ u8MaxWrBlockLen;/*Max.writedatablocklength*/ u8WriteBlockPaPartial;/*Partialblocksforwriteallowed*/ u8Reserved3;/*Reserded*/ u8ContentProtectAppli;/*Contentprotectionapplication*/ u8FileFormatGrouop;/*Fileformatgroup*/ u8CopyFlag;/*Copyflag(OTP)*/ u8PermWrProtect;/*Permanentwriteprotection*/ u8TempWrProtect;/*Temporarywriteprotection*/ u8FileFormat;/*FileFormat*/ u8ECC;/*ECCcode*/ u8CSD_CRC;/*CSDCRC*/ u8Reserved4;/*always1*/ }MSD_CSD; //---------------------------------------------------------------------------------------------------- typedefstruct{/*CardIdentificationData*/ u8ManufacturerID;/*ManufacturerID*/ u16OEM_AppliID;/*OEM/ApplicationID*/ u32ProdName1;/*ProductNamepart1*/ u8ProdName2;/*ProductNamepart2*/ u8ProdRev;/*ProductRevision*/ u32ProdSN;/*ProductSerialNumber*/ u8Reserved1;/*Reserved1*/ u16ManufactDate;/*ManufacturingDate*/ u8CID_CRC;/*CIDCRC*/ u8Reserved2;/*always1*/ }MSD_CID; //---------------------------------------------------------------------------------------------------- typedefstruct{ MSD_CSDCSD; MSD_CIDCID; u32Capacity;/*CardCapacity*/ u32BlockSize;/*CardBlockSize*/ u16RCA; u8CardType; u32SpaceTotal;/*Totalspacesizeinfilesystem*/ u32SpaceFree; }/*Freespacesizeinfilesystem*/ //---------------------------------------------------------------------------------------------------- MSD_CARDINFO,*PMSD_CARDINFO; externMSD_CARDINFOSD0_CardInfo; //---------------------------------------------------------------------------------------------------- //类目 // classbsp_SD{ public: bsp_SD(SPI_HandleTypeDef*hspi,GPIO_TypeDef*GPIOx_CS,uint16_tGPIO_Pin_CS); public: u8SD_init(void); u8SD_ReadDisk(u8*buf,u32sector,u8cnt); u8SD_WriteDisk(u8*buf,u32sector,u8cnt); u32SD_GetSectorCount(void); u8offsetWrite(u64offset,u8*dat,u64datlen); u8offsetRead(u64offset,u8*dat,u64datlen); private: SPI_HandleTypeDef*hspi; GPIO_TypeDef*GPIOx_CS; uint16_tGPIO_Pin_CS; u8DFF; u8SD_TYPE; MSD_CARDINFOSD0_CardInfo; voidSD_CS(u8p); u8SD_GETCID(u8*cid_data); u8SD_GETCSD(u8*csd_data); intMSD0_GetCardInfo(PMSD_CARDINFOSD0_CardInfo); u8SD_ReceiveData(u8*data,u16len); u8SD_SendBlock(u8*buf,u8cmd); u32SD_sendcmd(u8cmd,u32arg,u8crc); voidSPI_setspeed(u8speed); u8spi_readwrite(u8Txdata); }; #endif