📄 sdmmc_lld.h
字号:
/******************************************************************************
*
* PIC18 C18 Secure Digital and Multimedia Cards Interface
*
******************************************************************************
* FileName: sdmmc.h
* Dependencies: generic.h
* Processor: PIC18
* Compiler: C18
* Company: Microchip Technology, Inc.
*
* Software License Agreement
*
* The software supplied herewith by Microchip Technology Incorporated
* (the 揅ompany? for its PICmicro?Microcontroller is intended and
* supplied to you, the Company抯 customer, for use solely and
* exclusively on Microchip PICmicro Microcontroller products. The
* software is owned by the Company and/or its supplier, and is
* protected under applicable copyright laws. All rights are reserved.
* Any use in violation of the foregoing restrictions may subject the
* user to criminal sanctions under applicable laws, as well as to
* civil liability for the breach of the terms and conditions of this
* license.
*
* THIS SOFTWARE IS PROVIDED IN AN 揂S IS?CONDITION. NO WARRANTIES,
* WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
* TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
* IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*
* Author Date Comment
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Rawin Rojvanit 02/06/04 Original Version 1.0
*****************************************************************************
* History Date Comment
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Mark Kirschenbaum 04/11/04 Edited for MPLAB PM3 usage
* Peter Reen 05/02/05 Edited for standalone FAT/MMC support
*****************************************************************************/
#ifndef SDMMCLLD_H
#define SDMMCLLD_H
#include "generic.h"
//Definitions
/* Command Operands */
#define BLOCKLEN_64 0x0040
#define BLOCKLEN_128 0x0080
#define BLOCKLEN_256 0x0100
#define BLOCKLEN_512 0x0200
/* Data Token */
#define DATA_START_TOKEN 0xFE
#define DATA_MULT_WRT_START_TOK 0xFC
#define DATA_MULT_WRT_STOP_TOK 0xFD
/* Data Response */
#define DATA_ACCEPTED 0b00000101
#define DATA_CRC_ERR 0b00001011
#define DATA_WRT_ERR 0b00001101
#define MMC_Interrupt *IntReg
#define MOREDATA !0
#define NODATA 0
// FPGA definitions
#define MMC_OFF // Power "Off" MMC Slot if available
#define MMC_ON // Power "On" MMC Slot if available
#define GetMMC_CD() ((*MMCReg & MMC_DETECT) == MMC_DETECT ? FALSE : TRUE)
//
#define MMC_FLOATING_BUS 0xFF
#define MMC_BAD_RESPONSE MMC_FLOATING_BUS
#define MMC_ILLEGAL_CMD 0x04
#define MMC_GOOD_CMD 0x00
// The SDMMC Commands
#define cmdGO_IDLE_STATE 0
#define cmdSEND_OP_COND 1
#define cmdSEND_CSD 9
#define cmdSEND_CID 10
#define cmdSTOP_TRANSMISSION 12
#define cmdSEND_STATUS 13
#define cmdSET_BLOCKLEN 16
#define cmdREAD_SINGLE_BLOCK 17
#define cmdREAD_MULTI_BLOCK 18
#define cmdWRITE_SINGLE_BLOCK 24
#define cmdWRITE_MULTI_BLOCK 25
#define cmdTAG_SECTOR_START 32
#define cmdTAG_SECTOR_END 33
#define cmdUNTAG_SECTOR 34
#define cmdTAG_ERASE_GRP_START 35
#define cmdTAG_ERASE_GRP_END 36
#define cmdUNTAG_ERASE_GRP 37
#define cmdERASE 38
#define cmdLOCK_UNLOCK 49
#define cmdSD_APP_OP_COND 41
#define cmdAPP_CMD 55
#define cmdREAD_OCR 58
#define cmdCRC_ON_OFF 59
// the various possible responses
typedef enum
{
R1,
R1b,
R2,
R3 // we don't use R3 since we don't care about OCR
}RESP;
// The various command informations needed
typedef struct
{
BYTE CmdCode; // the command number
BYTE CRC; // the CRC value (CRC's are not required once you turn the option off!)
RESP responsetype; // the Response Type
BYTE moredataexpected; // True if more data is expected
} typMMC_CMD;
typedef union
{
struct
{
BYTE field[7];
};
struct
{
BYTE crc;
BYTE c30filler; // This is here because i bit field can't cross an int boundry
BYTE addr0;
BYTE addr1;
BYTE addr2;
BYTE addr3;
BYTE cmd;
};
struct
{
unsigned END_BIT:1;
unsigned CRC7:7;
DWORD address;
unsigned CMD_INDEX:6;
unsigned TRANSMIT_BIT:1;
unsigned START_BIT:1;
};
} CMD_PACKET;
typedef union
{
BYTE _byte;
struct
{
unsigned IN_IDLE_STATE:1;
unsigned ERASE_RESET:1;
unsigned ILLEGAL_CMD:1;
unsigned CRC_ERR:1;
unsigned ERASE_SEQ_ERR:1;
unsigned ADDRESS_ERR:1;
unsigned PARAM_ERR:1;
unsigned B7:1;
};
} RESPONSE_1;
typedef union
{
WORD _word;
struct
{
BYTE _byte0;
BYTE _byte1;
};
struct
{
unsigned IN_IDLE_STATE:1;
unsigned ERASE_RESET:1;
unsigned ILLEGAL_CMD:1;
unsigned CRC_ERR:1;
unsigned ERASE_SEQ_ERR:1;
unsigned ADDRESS_ERR:1;
unsigned PARAM_ERR:1;
unsigned B7:1;
unsigned CARD_IS_LOCKED:1;
unsigned WP_ERASE_SKIP_LK_FAIL:1;
unsigned ERROR:1;
unsigned CC_ERROR:1;
unsigned CARD_ECC_FAIL:1;
unsigned WP_VIOLATION:1;
unsigned ERASE_PARAM:1;
unsigned OUTRANGE_CSD_OVERWRITE:1;
};
} RESPONSE_2;
typedef union
{
RESPONSE_1 r1;
RESPONSE_2 r2;
}MMC_RESPONSE;
typedef union
{
struct
{
DWORD _u320;
DWORD _u321;
DWORD _u322;
DWORD _u323;
};
struct
{
BYTE _byte[16];
};
struct
{
unsigned NOT_USED :1;
unsigned CRC :7; //bit 000 - 007
unsigned ECC :2;
unsigned FILE_FORMAT :2;
unsigned TMP_WRITE_PROTECT :1;
unsigned PERM_WRITE_PROTECT :1;
unsigned COPY :1;
unsigned FILE_FORMAT_GRP :1; //bit 008 - 015
unsigned RESERVED_1 :5;
unsigned WRITE_BL_PARTIAL :1;
unsigned WRITE_BL_LEN_L :2;
unsigned WRITE_BL_LEN_H :2;
unsigned R2W_FACTOR :3;
unsigned DEFAULT_ECC :2;
unsigned WP_GRP_ENABLE :1; //bit 016 - 031
unsigned WP_GRP_SIZE :5;
unsigned ERASE_GRP_SIZE_L :3;
unsigned ERASE_GRP_SIZE_H :2;
unsigned SECTOR_SIZE :5;
unsigned C_SIZE_MULT_L :1;
unsigned C_SIZE_MULT_H :2;
unsigned VDD_W_CURR_MAX :3;
unsigned VDD_W_CUR_MIN :3;
unsigned VDD_R_CURR_MAX :3;
unsigned VDD_R_CURR_MIN :3;
unsigned C_SIZE_L :2;
unsigned C_SIZE_H :8;
unsigned C_SIZE_U :2;
unsigned RESERVED_2 :2;
unsigned DSR_IMP :1;
unsigned READ_BLK_MISALIGN :1;
unsigned WRITE_BLK_MISALIGN :1;
unsigned READ_BL_PARTIAL :1;
unsigned READ_BL_LEN :4;
unsigned CCC_L :4;
unsigned CCC_H :8;
unsigned TRAN_SPEED :8;
unsigned NSAC :8;
unsigned TAAC :8;
unsigned RESERVED_3 :2;
unsigned SPEC_VERS :4;
unsigned CSD_STRUCTURE :2;
};
} CSD;
typedef union
{
struct
{
DWORD _u320;
DWORD _u321;
DWORD _u322;
DWORD _u323;
};
struct
{
BYTE _byte[16];
};
struct
{
unsigned NOT_USED :1;
unsigned CRC :7;
unsigned MDT :8; //Manufacturing Date Code (BCD)
DWORD PSN; // Serial Number (PSN)
unsigned PRV :8; // Product Revision
char PNM[6]; // Product Name
WORD OID; // OEM/Application ID
unsigned MID :8; // Manufacture ID
};
} CID;
//Macros
#define mSendMediaCmd_NoData() SendMediaCmd();SD_CS=1;
#define mReadCRC() WriteSPI(0xFF);WriteSPI(0xFF);
#define mSendCRC() WriteSPI(0xFF);WriteSPI(0xFF);
#define mSend8ClkCycles() WriteSPI(0xFF);
#endif //SDMMC_LLD_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -