20240909-DXSPX-emb/Src/Usr/Driver/DrvSdSpi.h

105 lines
4.0 KiB
C
Raw Permalink Normal View History

#ifndef _DRVSDSPI_
#define _DRVSDSPI_
#include <stdbool.h>
#include <stdint.h>
// SD卡类型定义
#define SD_TYPE_ERR 0X00
#define SD_TYPE_MMC 0X01
#define SD_TYPE_V1 0X02
#define SD_TYPE_V2 0X04
#define SD_TYPE_V2HC 0X06
/***************************************************************************************
CMD0 R1 SD卡
CMD8 VHS+CHeck pattern R7
CMD9 R1
CMD10 R1
CMD16 R1
CMD17 R1
CMD24 R1
ACMD41 R3
CMD55 R1 SD卡
CMD58 R3 OCR寄存器
CMD0
0x00|0x40,0x00,0x00,0x00,0x00,0x95----->0x01()
CMD8
0x08 | 0x40,0x00,0x00,0x01,0xAA,0x87---->0x01,0x00,0x00,0x01,0xAA
ACMD41
0x29|0x40,0x00,0x00,0x00,0x00,0x01---->0x00()
0x29|0x40,0x40,x000,0x00,0x00,0x01----> 0x00()
CMD58
0x3A|0x40,0x00,0x00,0x00,0x00,0x01--->0x00,0xC0,0xFF,0x80,0x00
R10x000x01
R35byteR10x000x01
OCR寄存器的值
R75byteR10x000x01
*********************************************************************************/
// SD卡指令表
#define CMD0 0 //卡复位
#define CMD1 1
#define CMD8 8 //命令8 SEND_IF_COND
#define CMD9 9 //命令9 读CSD数据
#define CMD10 10 //命令10读CID数据
#define CMD12 12 //命令12停止数据传输
#define CMD16 16 //命令16设置SectorSize 应返回0x00
#define CMD17 17 //命令17读sector
#define CMD18 18 //命令18读Multi sector
#define CMD23 23 //命令23设置多sector写入前预先擦除N个block
#define CMD24 24 //命令24写sector
#define CMD25 25 //命令25写Multi sector
#define ACMD41 41 //命令41应返回0x00
#define CMD55 55 //命令55应返回0x01
#define CMD58 58 //命令58读OCR信息
#define CMD59 59 //命令59使能/禁止CRC应返回0x00
#define USR_DRV_SD_HIGH_SPEED_MODE 1
#define USR_DRV_SD_HIGH_SPEED 28000000
#define USR_DRV_SD_LOW_SPEED_MODE 0
#define USR_DRV_SD_LOW_SPEED 200000
// 其他
#define MAX_RETRY_TIMES 0xFFFE // 最大重试次数
#define CMD0_IDLE_STATE 0x01 // CMD0的空闲状态
#define SD_V2_VOLTAGE 0x1AA // SD V2.0的电压值
#define SD_V2_VOLTAGE_CRC 0x87 // SD V2.0电压CRC
#define SD_V2_CCS_CHECK 0x40 // SD V2.0的CCS检查标志
#define SD_ERR 4 // SD卡错误的返回值
#define SD_CMD16_RESPONSE 0 // CMD16的响应值
#define SD_CMD16_SIZE 512 // CMD16的大小
//SD卡回应标记字
#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
void Drv_SdSpiCs(uint8_t value);
uint8_t Drv_SdSpiRWByte(uint8_t data);
void Drv_SdSpiSetSpeed(uint8_t mode);
uint8_t Drv_SdWaitReady(void);
uint8_t Drv_SdInit(void);
unsigned char Drv_SdReadDisk(unsigned char *buf, unsigned int sector, unsigned char cnt);
unsigned char Drv_SdWriteDisk(unsigned char *buf, unsigned int sector, unsigned char cnt);
unsigned int Drv_SdGetSectorCount(void);
#endif