105 lines
4.0 KiB
C
105 lines
4.0 KiB
C
#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
|
||
|
||
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
|