mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-22 17:12:55 +08:00
419 lines
11 KiB
C
419 lines
11 KiB
C
|
/*!
|
||
|
* @file apm32e10x_sdio.h
|
||
|
*
|
||
|
* @brief This file contains all the functions prototypes for the SDIO firmware library
|
||
|
*
|
||
|
* @version V1.0.0
|
||
|
*
|
||
|
* @date 2021-07-26
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef __APM32E10X_SDIO_H
|
||
|
#define __APM32E10X_SDIO_H
|
||
|
|
||
|
#include "apm32e10x.h"
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/** @addtogroup Peripherals_Library Standard Peripheral Library
|
||
|
@{
|
||
|
*/
|
||
|
|
||
|
/** @addtogroup SDIO_Driver SDIO Driver
|
||
|
@{
|
||
|
*/
|
||
|
|
||
|
/** @addtogroup SDIO_Enumerations Enumerations
|
||
|
@{
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO clock edge
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_CLOCK_EDGE_RISING = 0x00000000,
|
||
|
SDIO_CLOCK_EDGE_FALLING = 0x00002000
|
||
|
}SDIO_CLOCK_EDGE_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO clock bypass
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_CLOCK_BYPASS_DISABLE = 0x00000000,
|
||
|
SDIO_CLOCK_BYPASS_ENABLE = 0x00000400
|
||
|
}SDIO_CLOCK_BYPASS_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO clock power save
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_CLOCK_POWER_SAVE_DISABLE = 0x00000000,
|
||
|
SDIO_CLOCK_POWER_SAVE_ENABLE = 0x00000200
|
||
|
}SDIO_CLOCK_POWER_SAVE_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO bus wide
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_BUSWIDE_1B = 0x00000000,
|
||
|
SDIO_BUSWIDE_4B = 0x00000800,
|
||
|
SDIO_BUSWIDE_8B = 0x00001000
|
||
|
}SDIO_BUSWIDE_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO hardware flow control
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_HARDWARE_FLOW_CONTROL_DISABLE = 0x00000000,
|
||
|
SDIO_HARDWARE_FLOW_CONTROL_ENABLE = 0x00004000
|
||
|
}SDIO_HARDWARE_FLOW_CONTROL_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO power state
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_POWER_STATE_OFF = 0x00000000,
|
||
|
SDIO_POWER_STATE_ON = 0x00000003
|
||
|
}SDIO_POWER_STATE_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO interrupt sources
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_INT_COMRESP = 0x00000001,
|
||
|
SDIO_INT_DBDR = 0x00000002,
|
||
|
SDIO_INT_CMDRESTO = 0x00000004,
|
||
|
SDIO_INT_DATATO = 0x00000008,
|
||
|
SDIO_INT_TXUDRER = 0x00000010,
|
||
|
SDIO_INT_RXOVRER = 0x00000020,
|
||
|
SDIO_INT_CMDRES = 0x00000040,
|
||
|
SDIO_INT_CMDSENT = 0x00000080,
|
||
|
SDIO_INT_DATAEND = 0x00000100,
|
||
|
SDIO_INT_SBE = 0x00000200,
|
||
|
SDIO_INT_DBCP = 0x00000400,
|
||
|
SDIO_INT_CMDACT = 0x00000800,
|
||
|
SDIO_INT_TXACT = 0x00001000,
|
||
|
SDIO_INT_RXACT = 0x00002000,
|
||
|
SDIO_INT_TXFHF = 0x00004000,
|
||
|
SDIO_INT_RXFHF = 0x00008000,
|
||
|
SDIO_INT_TXFF = 0x00010000,
|
||
|
SDIO_INT_RXFF = 0x00020000,
|
||
|
SDIO_INT_TXFE = 0x00040000,
|
||
|
SDIO_INT_RXFE = 0x00080000,
|
||
|
SDIO_INT_TXDA = 0x00100000,
|
||
|
SDIO_INT_RXDA = 0x00200000,
|
||
|
SDIO_INT_SDIOINT = 0x00400000,
|
||
|
SDIO_INT_ATAEND = 0x00800000
|
||
|
}SDIO_INT_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO response
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_RESPONSE_NO = 0x00000000,
|
||
|
SDIO_RESPONSE_SHORT = 0x00000040,
|
||
|
SDIO_RESPONSE_LONG = 0x000000C0
|
||
|
}SDIO_RESPONSE_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO wait interrupt state
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_WAIT_NO = 0x00000000,
|
||
|
SDIO_WAIT_INT = 0x00000100,
|
||
|
SDIO_WAIT_PEND = 0x00000200
|
||
|
}SDIO_WAIT_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO CPSM state
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_CPSM_DISABLE = 0x00000000,
|
||
|
SDIO_CPSM_ENABLE = 0x00000400
|
||
|
}SDIO_CPSM_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO response registers
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_RES1 = 0x00000000,
|
||
|
SDIO_RES2 = 0x00000004,
|
||
|
SDIO_RES3 = 0x00000008,
|
||
|
SDIO_RES4 = 0x0000000C
|
||
|
}SDIO_RES_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO data block size
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_DATA_BLOCKSIZE_1B = 0x00000000,
|
||
|
SDIO_DATA_BLOCKSIZE_2B = 0x00000010,
|
||
|
SDIO_DATA_BLOCKSIZE_4B = 0x00000020,
|
||
|
SDIO_DATA_BLOCKSIZE_8B = 0x00000030,
|
||
|
SDIO_DATA_BLOCKSIZE_16B = 0x00000040,
|
||
|
SDIO_DATA_BLOCKSIZE_32B = 0x00000050,
|
||
|
SDIO_DATA_BLOCKSIZE_64B = 0x00000060,
|
||
|
SDIO_DATA_BLOCKSIZE_128B = 0x00000070,
|
||
|
SDIO_DATA_BLOCKSIZE_256B = 0x00000080,
|
||
|
SDIO_DATA_BLOCKSIZE_512B = 0x00000090,
|
||
|
SDIO_DATA_BLOCKSIZE_1024B = 0x000000A0,
|
||
|
SDIO_DATA_BLOCKSIZE_2048B = 0x000000B0,
|
||
|
SDIO_DATA_BLOCKSIZE_496B = 0x000000C0,
|
||
|
SDIO_DATA_BLOCKSIZE_8192B = 0x000000D0,
|
||
|
SDIO_DATA_BLOCKSIZE_16384B = 0x000000E0
|
||
|
}SDIO_DATA_BLOCKSIZE_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO transfer direction
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_TRANSFER_DIR_TOCARD = 0x00000000,
|
||
|
SDIO_TRANSFER_DIR_TOSDIO = 0x00000002
|
||
|
}SDIO_TRANSFER_DIR_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO transfer type
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_TRANSFER_MODE_BLOCK = 0x00000000,
|
||
|
SDIO_TRANSFER_MODE_STREAM = 0x00000004
|
||
|
}SDIO_TRANSFER_MODE_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO DPSM state
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_DPSM_DISABLE = 0x00000000,
|
||
|
SDIO_DPSM_ENABLE = 0x00000001
|
||
|
}SDIO_DPSM_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO flag
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_FLAG_COMRESP = 0x00000001,
|
||
|
SDIO_FLAG_DBDR = 0x00000002,
|
||
|
SDIO_FLAG_CMDRESTO = 0x00000004,
|
||
|
SDIO_FLAG_DATATO = 0x00000008,
|
||
|
SDIO_FLAG_TXUDRER = 0x00000010,
|
||
|
SDIO_FLAG_RXOVRER = 0x00000020,
|
||
|
SDIO_FLAG_CMDRES = 0x00000040,
|
||
|
SDIO_FLAG_CMDSENT = 0x00000080,
|
||
|
SDIO_FLAG_DATAEND = 0x00000100,
|
||
|
SDIO_FLAG_SBE = 0x00000200,
|
||
|
SDIO_FLAG_DBCP = 0x00000400,
|
||
|
SDIO_FLAG_CMDACT = 0x00000800,
|
||
|
SDIO_FLAG_TXACT = 0x00001000,
|
||
|
SDIO_FLAG_RXACT = 0x00002000,
|
||
|
SDIO_FLAG_TXFHF = 0x00004000,
|
||
|
SDIO_FLAG_RXFHF = 0x00008000,
|
||
|
SDIO_FLAG_TXFF = 0x00010000,
|
||
|
SDIO_FLAG_RXFF = 0x00020000,
|
||
|
SDIO_FLAG_TXFE = 0x00040000,
|
||
|
SDIO_FLAG_RXFE = 0x00080000,
|
||
|
SDIO_FLAG_TXDA = 0x00100000,
|
||
|
SDIO_FLAG_RXDA = 0x00200000,
|
||
|
SDIO_FLAG_SDIOINT = 0x00400000,
|
||
|
SDIO_FLAG_ATAEND = 0x00800000
|
||
|
}SDIO_FLAG_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO read wait mode
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SDIO_READ_WAIT_MODE_CLK = 0x00000001,
|
||
|
SDIO_READ_WAIT_MODE_DATA2 = 0x00000000
|
||
|
}SDIO_READ_WAIT_MODE_T;
|
||
|
|
||
|
/**@} end of group SDIO_Enumerations*/
|
||
|
|
||
|
|
||
|
/** @addtogroup SDIO_Macros Macros
|
||
|
@{
|
||
|
*/
|
||
|
|
||
|
/** ------------ SDIO registers bit address in the alias region ----------- */
|
||
|
#define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE)
|
||
|
|
||
|
/* --- CLKCTRL Register ---*/
|
||
|
|
||
|
/* Alias word address of CLKEN bit */
|
||
|
#define CLKCTRL_OFFSET (SDIO_OFFSET + 0x04)
|
||
|
#define CLKEN_BitNumber 0x08
|
||
|
#define CLKCTRL_CLKEN_BB (PERIPH_BB_BASE + (CLKCTRL_OFFSET * 32) + (CLKEN_BitNumber * 4))
|
||
|
|
||
|
/* --- CMD Register ---*/
|
||
|
|
||
|
/* Alias word address of SDIOSC bit */
|
||
|
#define CMD_OFFSET (SDIO_OFFSET + 0x0C)
|
||
|
#define SDIOSC_BitNumber 0x0B
|
||
|
#define CMD_SDIOSC_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSC_BitNumber * 4))
|
||
|
|
||
|
/* Alias word address of CMDCPEN bit */
|
||
|
#define CMDCPEN_BitNumber 0x0C
|
||
|
#define CMD_CMDCPEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (CMDCPEN_BitNumber * 4))
|
||
|
|
||
|
/* Alias word address of INTEN bit */
|
||
|
#define INTEN_BitNumber 0x0D
|
||
|
#define CMD_INTEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (INTEN_BitNumber * 4))
|
||
|
|
||
|
/* Alias word address of ATACMD bit */
|
||
|
#define ATACMD_BitNumber 0x0E
|
||
|
#define CMD_ATACMD_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4))
|
||
|
|
||
|
/* --- DCTRL Register ---*/
|
||
|
|
||
|
/* Alias word address of DMAEN bit */
|
||
|
#define DCTRL_OFFSET (SDIO_OFFSET + 0x2C)
|
||
|
#define DMAEN_BitNumber 0x03
|
||
|
#define DCTRL_DMAEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4))
|
||
|
|
||
|
/* Alias word address of RWSTR bit */
|
||
|
#define RWSTR_BitNumber 0x08
|
||
|
#define DCTRL_RWSTR_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTR_BitNumber * 4))
|
||
|
|
||
|
/* Alias word address of RWSTOP bit */
|
||
|
#define RWSTOP_BitNumber 0x09
|
||
|
#define DCTRL_RWSTOP_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4))
|
||
|
|
||
|
/* Alias word address of RDWAIT bit */
|
||
|
#define RDWAIT_BitNumber 0x0A
|
||
|
#define DCTRL_RDWAIT_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RDWAIT_BitNumber * 4))
|
||
|
|
||
|
/* Alias word address of SDIOF bit */
|
||
|
#define SDIOF_BitNumber 0x0B
|
||
|
#define DCTRL_SDIOF_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOF_BitNumber * 4))
|
||
|
|
||
|
/**@} end of group SDIO_Macros*/
|
||
|
|
||
|
/** @addtogroup SDIO_Structure Data Structure
|
||
|
@{
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO Config structure definition
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
SDIO_CLOCK_EDGE_T clockEdge;
|
||
|
SDIO_CLOCK_BYPASS_T clockBypass;
|
||
|
SDIO_CLOCK_POWER_SAVE_T clockPowerSave;
|
||
|
SDIO_BUSWIDE_T busWide;
|
||
|
SDIO_HARDWARE_FLOW_CONTROL_T hardwareFlowControl;
|
||
|
uint8_t clockDiv;
|
||
|
}SDIO_Config_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO CMD Config structure definition
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
uint32_t argument;
|
||
|
uint32_t cmdIndex;
|
||
|
SDIO_RESPONSE_T response;
|
||
|
SDIO_WAIT_T wait;
|
||
|
SDIO_CPSM_T CPSM;
|
||
|
}SDIO_CMDConfig_T;
|
||
|
|
||
|
/**
|
||
|
* @brief SDIO Data Config structure definition
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
uint32_t dataTimeOut;
|
||
|
uint32_t dataLength;
|
||
|
SDIO_DATA_BLOCKSIZE_T dataBlockSize;
|
||
|
SDIO_TRANSFER_DIR_T transferDir;
|
||
|
SDIO_TRANSFER_MODE_T transferMode;
|
||
|
SDIO_DPSM_T DPSM;
|
||
|
}SDIO_DataConfig_T;
|
||
|
|
||
|
/**@} end of group SDIO_Structure*/
|
||
|
|
||
|
|
||
|
/** @addtogroup SDIO_Fuctions Fuctions
|
||
|
@{
|
||
|
*/
|
||
|
|
||
|
/** SDIO reset and configuration */
|
||
|
void SDIO_Reset(void);
|
||
|
void SDIO_Config(SDIO_Config_T* sdioConfig);
|
||
|
void SDIO_ConfigStructInit(SDIO_Config_T* sdioConfig);
|
||
|
void SDIO_EnableClock(void);
|
||
|
void SDIO_DisableClock(void);
|
||
|
void SDIO_ConfigPowerState(SDIO_POWER_STATE_T powerState);
|
||
|
uint32_t SDIO_ReadPowerState(void);
|
||
|
|
||
|
/** DMA */
|
||
|
void SDIO_EnableDMA(void);
|
||
|
void SDIO_DisableDMA(void);
|
||
|
|
||
|
/** Command */
|
||
|
void SDIO_TxCommand(SDIO_CMDConfig_T *cmdConfig);
|
||
|
void SDIO_TxCommandStructInit(SDIO_CMDConfig_T* cmdconfig);
|
||
|
uint8_t SDIO_ReadCommandResponse(void);
|
||
|
uint32_t SDIO_ReadResponse(SDIO_RES_T res);
|
||
|
|
||
|
/** SDIO data configuration */
|
||
|
void SDIO_ConfigData(SDIO_DataConfig_T* dataConfig);
|
||
|
void SDIO_ConfigDataStructInit(SDIO_DataConfig_T* dataConfig);
|
||
|
uint32_t SDIO_ReadDataCounter(void);
|
||
|
void SDIO_WriteData(uint32_t data);
|
||
|
uint32_t SDIO_ReadData(void);
|
||
|
uint32_t SDIO_ReadFIFOCount(void);
|
||
|
|
||
|
/** SDIO mode */
|
||
|
void SDIO_EnableStartReadWait(void);
|
||
|
void SDIO_DisableStartReadWait(void);
|
||
|
void SDIO_EnableStopReadWait(void);
|
||
|
void SDIO_DisableStopReadWait(void);
|
||
|
void SDIO_ConfigSDIOReadWaitMode(SDIO_READ_WAIT_MODE_T readWaitMode);
|
||
|
void SDIO_EnableSDIO(void);
|
||
|
void SDIO_DisableSDIO(void);
|
||
|
void SDIO_EnableTxSDIOSuspend(void);
|
||
|
void SDIO_DisableTxSDIOSuspend(void);
|
||
|
void SDIO_EnableCommandCompletion(void);
|
||
|
void SDIO_DisableCommandCompletion(void);
|
||
|
void SDIO_EnableCEATAInterrupt(void);
|
||
|
void SDIO_DisableCEATAInterrupt(void);
|
||
|
void SDIO_EnableTxCEATA(void);
|
||
|
void SDIO_DisableTxCEATA(void);
|
||
|
|
||
|
/** Interrupt and flags */
|
||
|
void SDIO_EnableInterrupt(uint32_t interrupt);
|
||
|
void SDIO_DisableInterrupt(uint32_t interrupt);
|
||
|
uint8_t SDIO_ReadStatusFlag(SDIO_FLAG_T flag);
|
||
|
void SDIO_ClearStatusFlag(uint32_t flag);
|
||
|
uint8_t SDIO_ReadIntFlag(SDIO_INT_T flag);
|
||
|
void SDIO_ClearIntFlag(uint32_t flag);
|
||
|
|
||
|
/**@} end of group SDIO_Fuctions*/
|
||
|
/**@} end of group SDIO_Driver*/
|
||
|
/**@} end of group Peripherals_Library*/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* __APM32E10X_SDIO_H */
|