📄 sd_defs.h
字号:
#ifndef _SD_DEFS_H_
#define _SD_DEFS_H_
//This segment should not be modified
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#if 1
typedef unsigned char INT8U; /* 无符号8位整型变量 */
//typedef signed char INT8; /* 有符号8位整型变量 */
typedef unsigned short INT16U; /* 无符号16位整型变量 */
//typedef signed short INT16; /* 有符号16位整型变量 */
typedef unsigned int INT32U; /* 无符号32位整型变量 */
typedef signed int INT32; /* 有符号32位整型变量 */
typedef float FP32; /* 单精度浮点数(32位长度) */
typedef double FP64; /* 双精度浮点数(64位长度) */
#endif
/* disable(1) or disable(0) reading or writing by interrupt */
#define SD_INTERRUPT_EN 0 /* 是(1)否(0)使能中断读写SD/MMC卡 */
#define MMC_MMC_CLOCK_HIGH 20000000 /* SD/MMC卡最高读写速度20MHz */
/* define the block length of sd/mmc card */
#define SD_BLOCKSIZE 512 /* SD卡/MMC卡块的长度 */
#define SD_BLOCKSIZE_NBITS 9 /* 2 ^ 9 = 512*/
/* define the interrupt of card inserting */
#define IRQ_nCD_SD //IRQ_EINT18
#define SD_IRQ_CD IRQ_nCD_SD
#define GPIO_nCD_SD //(GPIO_MODE_IN | GPIO_PULLUP_DIS | GPIO_G10)
#define SD_GPIO_CD GPIO_nCD_SD
#define SD_CD_LEVEL_LOW /* 定义卡插入低电平有效 */
/* SD卡信息结构体定义 */ /* the information structure variable of SD Card*/typedef struct SD_STRUCT{
/* From OCR Register... Operation Condition Register */
INT32U vtg_win; /* 电压范围*/
/* From CID Register... Card IDentification Regiser */
INT8U MID; /* Manufacturer ID*/
INT16U OID; /* OEM/Application ID*/
INT8U PNM[6]; /* Product name */
INT8U PRV; /* Product Revision BCD*/
INT32U PSN; /* Product Serial Number */
INT16U MDT; /* Manufacturing Date 12bit */
/* From CSD Register... Card Specific Data **/
INT8U CSD_stuc; /* CSD structure 2bit */
INT8U TAAC; /* data read access-time-1*/
INT8U NSAC; /* data read access-time-2 IN clk cycles */
INT8U TRAN_SPEED; /* MAX. DATA transfer rate */
INT16U CCC; /* card command classes 12bit */
INT8U read_bl_len; /* max. read data block length 4bit*/
INT8U read_bl_partial; /* partial block for read allowed 1bit */
INT8U write_blk_mis; /* write block misalignment 1bit */
INT8U read_blk_mis; /* read block misalignment */
INT8U dsr_imp ; /* DSR implemented */
INT16U C_size; /* device size bit12 */
INT8U vdd_r_curr_min; /* max. read current @Vdd min 3bit*/
INT8U vdd_r_curr_max; /* max. read current @Vdd max 3bit*/
INT8U vdd_w_curr_min; /* max. write current@Vdd min 3bit*/
INT8U vdd_w_curr_max; /* max. write current@Vdd max 3bit*/
INT8U C_Size_mult; /* device size multiplier 3bit */
INT8U erase_blk_en; /* erase single block enable */
INT8U erase_sector_size; /* erase sector size 7bit */
INT8U wp_grp_size; /* write protected group size 7bit*/
INT8U wp_grp_enable; /* write protected group enable 1bit */
INT8U r2w_factor; /* write speed factor 3bit*/
INT8U write_bl_len; /* max. write data block length 4bit */
INT8U write_bl_partial; /* partial block for write allowde 1bit */
INT8U file_format_grp; /* file format group 1bit*/
INT8U copy; /* copy flag 1bit*/
INT8U perm_write_pro; /* permanent write protection 1bit*/
INT8U tmp_write_pro; /* temporary write protection 1bit */
INT8U file_format; /* file format 2bit */
INT16U RCA; /* 卡逻辑地址 */
INT8U card_type; /* 卡类型 */ INT32U block_num; /* 卡中块的数量 */ INT32U block_len; /* 卡的块长度(单位:字节) */ INT32U sector_size; /* 一次可擦除的块个数 */ INT32U timeout_read; /* 读块超时时间(单位: 8 SPI clock) */ INT32U timeout_write; /* 写块超时时间(单位: 8 SPI clock) */ INT32U timeout_erase; /* 擦块超时时间(单位: 8 SPI clock) */}sd_struct;extern sd_struct sds; /* SD卡信息结构体变量 */ extern volatile int card_insert;extern int card_change; /* 卡改变,卡插入开拔出 *//*
*************************************************************
用户API函数: 读, 写, 擦 SD卡 API函数及错误码
*************************************************************
*/
/* 错误码 error code */#define SD_NO_ERR 0x00 // 函数执行成功#define SD_ERR_NO_CARD 0x01 // 卡没有完全插入到卡座中#define SD_ERR_USER_PARAM 0x02 // 用户使用API函数时,入口参数有错误#define SD_ERR_CARD_PARAM 0x03 // 卡中参数有错误(与本模块不兼容)#define SD_ERR_VOL_NOTSUSP 0x04 // 卡不支持3.3V供电#define SD_ERR_OVER_CARDRANGE 0x05 // 操作超出卡容量范围#define SD_ERR_UNKNOWN_CARD 0x06 // 无法识别卡型/* SD命令可能返回的错误码 */#define SD_ERR_CMD_RESPTYPE 0x10 // 命令类型错误#define SD_ERR_CMD_TIMEOUT 0x11 // 卡命令响应超时#define SD_ERR_CMD_RESP 0x12 // 卡命令响应错误 /* 数据流错误码 */#define SD_ERR_DATA_CRC16 0x20 // 数据流CRC16校验不通过#define SD_ERR_DATA_START_TOK 0x21 // 读单块或多块时,数据开始令牌不正确#define SD_ERR_DATA_RESP 0x22 // 写单块或多块时,卡数据响应令牌不正确/* 等待错误码 */#define SD_ERR_TIMEOUT_WAIT 0x30 // 写或擦操作时,发生超时错误#define SD_ERR_TIMEOUT_READ 0x31 // 读操作超时错误#define SD_ERR_TIMEOUT_WRITE 0x32 // 写操作超时错误#define SD_ERR_TIMEOUT_ERASE 0x33 // 擦除操作超时错误#define SD_ERR_TIMEOUT_WAITIDLE 0x34 // 初始化卡时,等待卡退出空闲状态超时错误/* 写操作可能返回的错误码 */#define SD_ERR_WRITE_BLK 0x40 // 写块数据错误#define SD_ERR_WRITE_BLKNUMS 0x41 // 写多块时,想要写入的块与正确写入的块数不一致#define SD_ERR_WRITE_PROTECT 0x42 // 卡外壳的写保护开关打在写保护位置/************************************************** 其它宏定义***************************************************/#define CARDTYPE_SD 0x00 // 卡型为SD 卡#define CARDTYPE_MMC 0x01 // 卡型为MMC 卡
/* Some Registers of SD */
// SD Interface
#define SDICON (*(volatile unsigned *)0x5a000000) //SDI control
#define SDIPRE (*(volatile unsigned *)0x5a000004) //SDI baud rate prescaler
#define SDICARG (*(volatile unsigned *)0x5a000008) //SDI command argument
#define SDICCON (*(volatile unsigned *)0x5a00000c) //SDI command control
#define SDICSTA (*(volatile unsigned *)0x5a000010) //SDI command status
#define SDIRSP0 (*(volatile unsigned *)0x5a000014) //SDI response 0
#define SDIRSP1 (*(volatile unsigned *)0x5a000018) //SDI response 1
#define SDIRSP2 (*(volatile unsigned *)0x5a00001c) //SDI response 2
#define SDIRSP3 (*(volatile unsigned *)0x5a000020) //SDI response 3
#define SDIDTIMER (*(volatile unsigned *)0x5a000024) //SDI data/busy timer
#define SDIBSIZE (*(volatile unsigned *)0x5a000028) //SDI block size
#define SDIDCON (*(volatile unsigned *)0x5a00002c) //SDI data control
#define SDIDCNT (*(volatile unsigned *)0x5a000030) //SDI data remain counter
#define SDIDSTA (*(volatile unsigned *)0x5a000034) //SDI data status
#define SDIFSTA (*(volatile unsigned *)0x5a000038) //SDI FIFO status
#define SDIIMSK (*(volatile unsigned *)0x5a00003c) //SDI interrupt mask. edited for 2440A
#ifdef __BIG_ENDIAN /* edited for 2440A */
#define SDIDAT (*(volatile unsigned *)0x5a00004c) //SDI data
//#define SDIDAT 0x5a00004c
#else // Little Endian
#define SDIDAT (*(volatile unsigned *)0x5a000040) //SDI data
#define SDIDAT8 (*(volatile char *)0x5a000040)
//#define SDIDAT 0x5a000040
#endif //SD Interface
/* GPIOE control the clk dat cmd and etc. */
//#define GPECON (*(volatile unsigned *)0x56000040) //Port E control
//#define GPEDAT (*(volatile unsigned *)0x56000044) //Port E data
//#define GPEUP (*(volatile unsigned *)0x56000048) //Pull-up control E
/*
*************************************************************
下面为软件包用到的与SD卡相关的宏定义
*************************************************************
*/
#define MSK_READY 0x80 /* 卡就绪掩码 */ /* Mask off the bits in the OCR corresponding to voltage range 3.2V to * 3.4V, OCR bits 20 and 21 */#define MSK_OCR_33 0xC0/* 定义在初始化阶段,等待SD卡退出空闲状态的重试次数 *//* Number of tries to wait for the card to go idle during initialization */#define SD_IDLE_WAIT_MAX 1000/* SD卡命令超时时间(单位 8clock)*//* timeout of command */#define SD_CMD_TIMEOUT 100 /* 100ms 相当的SPI时钟数(单位 unit: 8 clocks) *//* 100ms correspond to SPI clock(unit: 8 clocks)*/#define READ_TIMEOUT_100MS //100 * SPI_CLOCK / 1000 / 8/* 250ms 相当的SPI时钟数(单位 unit: 8 clocks) *//* 250ms correspond to SPI clock(unit: 8 clocks)*/#define WRITE_TIMEOUT_250MS //250 * SPI_CLOCK / 1000 / 8 /* CSD中一些域的字节位置(高字节在前) */#define TAAC_POS 14 //TACC#define NSAC_POS 13 //NSAC#define READ_BL_LEN_POS 10 //READ_BL_LEN#define C_SIZE_POS1 9 //C_SIZE upper 2-bit#define C_SIZE_POS2 8 //C_SIZE middle 8-bit#define C_SIZE_POS3 7 //C_SIZE lower 2-bit#define C_SIZE_MULT_POS1 6 //C_SIZE_MULT upper 2-bit#define C_SIZE_MULT_POS2 5 //C_SIZE_MULT lower 1-bit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -