⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdmmc_lld.h

📁 SD卡驱动
💻 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 + -