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

105 lines
4.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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
R1主机发送的时序和指令有没有问题不是返回0x00就是返回0x01
R35个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