#ifndef _DRVSDSPI_ #define _DRVSDSPI_ #include #include // 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 R1:主机发送的时序和指令有没有问题,不是返回0x00就是返回0x01 R3:5个byte,第一个字节为R1,不是0x00,就是0x01, 剩下的四个字节为OCR寄存器的值 R7:也是5个byte,第一个字节为R1,不是0x00,就是0x01。 第二个字节为命令版本、第三个字节保留、 第四个字节为被接受的电压范围、第五个字节为模式检查 *********************************************************************************/ // 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