[编辑]SDIO数据结构
[编辑] SDIO初始化结构类型定义
typedef struct
{
uint32_tSDIO_ClockEdge; //指定位捕捉的时钟边沿
uint32_tSDIO_ClockBypass; //指定是否使能SDIO时钟分频器旁路
uint32_tSDIO_ClockPowerSave; //指定当总线空闲时,是否使能SDIO时钟输出
uint32_tSDIO_BusWide; //指定SDIO总线宽度
uint32_tSDIO_HardwareFlowControl; //指定是否使能SDIO硬件流控制
uint8_tSDIO_ClockDiv; //指定SDIO控制器的时钟分频系数(0x00~0xFF)
} SDIO_InitTypeDef;
/* SDIO_Clock_Edge用于设置NEGEDGE位(SDIO_CLKCR[13]) */
#define SDIO_ClockEdge_Rising ((uint32_t)0x00000000)
#define SDIO_ClockEdge_Falling ((uint32_t)0x00002000)
/* SDIO_ClockBypass用于设置BYPASS位(SDIO_CLKCR[10]) */
#define SDIO_ClockBypass_Disable ((uint32_t)0x00000000)
#define SDIO_ClockBypass_Enable ((uint32_t)0x00000400)
/* SDIO_ClockPowerSave用于设置PWRSAV位(SDIO_CLKCR[9]) */
#define SDIO_ClockPowerSave_Disable ((uint32_t)0x00000000)
#define SDIO_ClockPowerSave_Enable ((uint32_t)0x00000200)
/* SDIO_BusWide用于设置WIDBUS位(SDIO_CLKCR[12:11]) */
#define SDIO_BusWide_1b ((uint32_t)0x00000000)
#define SDIO_BusWide_4b ((uint32_t)0x00000800)
#define SDIO_BusWide_8b ((uint32_t)0x00001000)
/* SDIO_HardWareFlowControl用于设置HWFC_EN位(SDIO_CLKCR[14]) */
#define SDIO_HardwareFlowControl_Disable ((uint32_t)0x00000000)
#define SDIO_HardwareFlowControl_Enable ((uint32_t)0x00004000)
/* SDIO_ClockDiv用于设置CLKDIV位(SDIO_CLKCR[7:0]) */
[编辑] SDIO命令初始化结构类型定义
typedef struct
{
uint32_tSDIO_Argument; //指定命令参数
uint32_tSDIO_CmdIndex; //指定命令索引
uint32_tSDIO_Response; //指定响应类型
uint32_tSDIO_Wait; //指定是否等待中断请求
uint32_tSDIO_CPSM; //指定是否使能命令通道状态机(CPSM)
} SDIO_CmdInitTypeDef;
/* SDIO_Argument用于设置SDIO_ARG寄存器 */
/* SDIO_CmdIndex用于设置CMDINDEX位(SDIO_CMD[5:0]) */
#define IS_SDIO_CMD_INDEX(INDEX) ((INDEX) < 0x40)
/* SDIO_Response用于设置WAITRESP位(SDIO_CMD[7:6]) */
#define SDIO_Response_No ((uint32_t)0x00000000)
#define SDIO_Response_Short ((uint32_t)0x00000040)
#define SDIO_Response_Long ((uint32_t)0x000000C0)
/* SDIO_Wait用于设置WAITPEND和WAITINT位(SDIO_CMD[9:8])*/
#define SDIO_Wait_No ((uint32_t)0x00000000)//不等待,允许超时
#define SDIO_Wait_IT ((uint32_t)0x00000100)//SDIO等待中断请求
#define SDIO_Wait_Pend ((uint32_t)0x00000200)//SDIO等待传输结束
/* SDIO_CPSM用于设置CPSMEN位(SDIO_CMD[10]) */
#define SDIO_CPSM_Disable ((uint32_t)0x00000000)
#define SDIO_CPSM_Enable ((uint32_t)0x00000400)
[编辑] SDIO数据初始化结构类型定义
typedef struct
{
uint32_tSDIO_DataTimeOut; //指定数据超时时间
uint32_t SDIO_DataLength;//指定待传输的数据字节长度
uint32_tSDIO_DataBlockSize; //指定块传输的数据块长度
uint32_tSDIO_TransferDir; //指定数据传输方向
uint32_tSDIO_TransferMode; //指定数据传输模式
uint32_tSDIO_DPSM; //指定是否使能数据通道状态机(DPSM)
} SDIO_DataInitTypeDef;
/* SDIO_DataTimeOut用于设置SDIO_DTIMER寄存器 */
/* SDIO_DataLength用于设置DATALENGTH位(SDIO_DLEN[24:0]) */
#define IS_SDIO_DATA_LENGTH(LENGTH) ((LENGTH) <=0x01FFFFFF)
/* SDIO_DataBlockSize用于设置DBLOCKSIZE位(SDIO_DCTRL[7:4]) */
#define SDIO_DataBlockSize_1b ((uint32_t)0x00000000)
#define SDIO_DataBlockSize_2b ((uint32_t)0x00000010)
#define SDIO_DataBlockSize_4b ((uint32_t)0x00000020)
#define SDIO_DataBlockSize_8b ((uint32_t)0x00000030)
#define SDIO_DataBlockSize_16b ((uint32_t)0x00000040)
#define SDIO_DataBlockSize_32b ((uint32_t)0x00000050)
#define SDIO_DataBlockSize_64b ((uint32_t)0x00000060)
#define SDIO_DataBlockSize_128b ((uint32_t)0x00000070)
#define SDIO_DataBlockSize_256b ((uint32_t)0x00000080)
#define SDIO_DataBlockSize_512b ((uint32_t)0x00000090)
#define SDIO_DataBlockSize_1024b ((uint32_t)0x000000A0)
#define SDIO_DataBlockSize_2048b ((uint32_t)0x000000B0)
#define SDIO_DataBlockSize_4096b ((uint32_t)0x000000C0)
#define SDIO_DataBlockSize_8192b ((uint32_t)0x000000D0)
#define SDIO_DataBlockSize_16384b ((uint32_t)0x000000E0)
/* SDIO_TransferDir用于设置DTDIR位(SDIO_DCTRL[1]) */
#define SDIO_TransferDir_ToCard ((uint32_t)0x00000000)
#define SDIO_TransferDir_ToSDIO ((uint32_t)0x00000002)
/* SDIO_TransferMode用于设置DTMODE位(SDIO_DCTRL[2]) */
#define SDIO_TransferMode_Block ((uint32_t)0x00000000)
#define SDIO_TransferMode_Stream ((uint32_t)0x00000004)
/* SDIO_DPSM用于设置DTEN位(SDIO_DCTRL[0]) */
#define SDIO_DPSM_Disable ((uint32_t)0x00000000)
#define SDIO_DPSM_Enable ((uint32_t)0x00000001)
[编辑]SDIO库函数
[编辑]函数SDIO_Init
/**
* 功能描述 根据SDIO_InitStruct中指定的参数初始化SDIO外设
* 输入参数 SDIO_InitStruct: 指向结构SDIO_InitTypeDef的指针,包含了SDIO外设的配置信息
* 返回值 无
*/
void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct)
{
uint32_t tmpreg =0;
/* 检查输入参数 */
assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge));
assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass));
assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave));
assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide));
assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl));
/*---------------------------- SDIO CLKCR 配置 ------------------------*/
/* 获取 SDIO CLKCR 的值 */
tmpreg =SDIO->CLKCR;
/* 清除 CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN 位 */
tmpreg &=CLKCR_CLEAR_MASK;
/* 根据 SDIO_ClockDiv 的值设置 CLKDIV 位 */
/* 根据 SDIO_ClockPowerSave 的值设置PWRSAV 位 */
/* 根据 SDIO_ClockBypass 的值设置 BYPASS 位 */
/* 根据 SDIO_BusWide 的值设置 WIDBUS 位 */
/* 根据 SDIO_ClockEdge 的值设置 NEGEDGE 位 */
/* 根据 SDIO_HardwareFlowControl 的值设置HWFC_EN 位 */
tmpreg |=(SDIO_InitStruct->SDIO_ClockDiv |SDIO_InitStruct->SDIO_ClockPowerSave |
SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide|
SDIO_InitStruct->SDIO_ClockEdge |SDIO_InitStruct->SDIO_HardwareFlowControl);
/* 回写 SDIO CLKCR */
SDIO->CLKCR =tmpreg;
}
[编辑] 函数SDIO_ClockCmd
/**
* 功能描述 使能或失能 SDIO 时钟
* 输入参数 NewState:SDIO 时钟的新状态
* 该参数可以是:
* ENABLE
* DISABLE
* 返回值 无
*/
void SDIO_ClockCmd(FunctionalState NewState)
{
/* 检查输入参数 */
assert_param(IS_FUNCTIONAL_STATE(NewState));
/* 根据 NewState 设置或清除 SDIO_CLKCR 的 CLKEN 位 */
*(__IO uint32_t*) CLKCR_CLKEN_BB = (uint32_t)NewState;
}
[编辑] 函数SDIO_SetPowerState
/**
* 功能描述 设置控制器的电源状态
* 输入参数 SDIO_PowerState:电源状态的新状态
* 该参数可以使下列值之一:
* SDIO_PowerState_OFF
* SDIO_PowerState_ON
* 返回值 无
*/
void SDIO_SetPowerState(uint32_t SDIO_PowerState)
{
/* 检查输入参数 */
assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState));
/* 清除当前的电源状态 */
SDIO->POWER&= PWR_PWRCTRL_MASK;
/* 根据 SDIO_PowerState 关闭或打开SDIO电源 */
SDIO->POWER |=SDIO_PowerState;
}
[编辑] 函数SDIO_GetPowerState
/**
* 功能描述 获取控制器的电源状态
* 输入参数 无
* 返回值 控制器的电源状态The returned value can
* 该返回值可能是下列值之一:
* - 0x00: 电源关闭
* - 0x02: 电源启动
* - 0x03: 电源打开
*/
uint32_t SDIO_GetPowerState(void)
{
return(SDIO->POWER & (~PWR_PWRCTRL_MASK));
}
[编辑] 函数SDIO_ITConfig
/**
* 功能描述 使能或失能SDIO中断
* 输入参数 SDIO_IT: 指定待使能或失能的 SDIO 中断源
* 该参数可以是下列值之一或任意组合:
* SDIO_IT_CCRCFAIL: 已收到命令响应(CRC校验失败)中断
* SDIO_IT_DCRCFAIL: 已发送/接收数据块(CRC校验失败)中断
* SDIO_IT_CTIMEOUT: 命令响应超时中断
* SDIO_IT_DTIMEOUT: 数据超时中断
* SDIO_IT_TXUNDERR: 发送 FIFO 下溢错误中断
* SDIO_IT_RXOVERR: 接收 FIFO 下溢错误中断
* SDIO_IT_CMDREND: 已收到命令响应(CRC校验成功)中断
* SDIO_IT_CMDSENT: 已发送命令(不需要响应)中断
* SDIO_IT_DATAEND: 数据结束(数据计数器SDIDCOUNT为0)中断
* SDIO_IT_STBITERR: 在宽总线模式下,在所有的数据线号上没有检测到起始位中断
* SDIO_IT_DBCKEND: 已发送/接收数据块(CRC校验成功)中断
* SDIO_IT_CMDACT: 正在传输命令中断
* SDIO_IT_TXACT: 正在发送数据中断
* SDIO_IT_RXACT: 正在接收数据中断
* SDIO_IT_TXFIFOHE: 发送 FIFO 半空中断
* SDIO_IT_RXFIFOHF: 接收 FIFO 半满中断
* SDIO_IT_TXFIFOF: 发送 FIFO 满中断
* SDIO_IT_RXFIFOF: 接收 FIFO 满中断
* SDIO_IT_TXFIFOE: 发送 FIFO 空中断
* SDIO_IT_RXFIFOE: 接收 FIFO 空中断
* SDIO_IT_TXDAVL: 发送 FIFO 中的数据有效中断
* SDIO_IT_RXDAVL: 接收 FIFO 中的数据有效中断
* SDIO_IT_SDIOIT: 收到 SD I/O 中断中断
* SDIO_IT_CEATAEND: CMD61 收到 CE-ATA 命令完成信号中断
* 输入参数 NewState: 指定的SDIO中断的新状态
* 该参数可以是:
* ENABLE
* DISABLE
* 返回值 无
*/
void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalStateNewState)
{
/* 检查输入参数 */
assert_param(IS_SDIO_IT(SDIO_IT));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState !=DISABLE)
{
/* 使能 SDIO 中断 */
SDIO->MASK|= SDIO_IT;
}
else
{
/* 失能 SDIO 中断 */
SDIO->MASK&= ~SDIO_IT;
}
}
[编辑] 函数SDIO_DMACmd
/**
* 功能描述 使能或失能 SDIO DMA 请求
* 输入参数 NewState: 选择的 SDIO DMA 请求的新状态
* 该参数可以是:
* ENABLE
* DISABLE
* 返回值 无
*/
void SDIO_DMACmd(FunctionalState NewState)
{
/* 检查输入参数 */
assert_param(IS_FUNCTIONAL_STATE(NewState));
/* 根据 NewState 设置或清除 SDIO_CLKCR 的 DMAEN 位 */
*(__IO uint32_t*) DCTRL_DMAEN_BB = (uint32_t)NewState;
}
[编辑] 函数SDIO_SendCommand
/**
* 功能描述 根据 SDIO_CmdInitStruct 中指定的参数初始化 SDIO 命令,并且发送命令
* 输入参数 SDIO_CmdInitStruct:指向结构 SDIO_CmdInitTypeDef 的指针,包含了SDIO命令的配置信息
* 返回值 无
*/
void SDIO_SendCommand(SDIO_CmdInitTypeDef*SDIO_CmdInitStruct)
{
uint32_t tmpreg =0;
/* 检查输入参数 */
assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->SDIO_CmdIndex));
assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->SDIO_Response));
assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->SDIO_Wait));
assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->SDIO_CPSM));
/*---------------------------- SDIO 参数寄存器配置 ------------------------*/
/* 根据SDIO_Argument的值设置SDIO参数寄存器 */
SDIO->ARG =SDIO_CmdInitStruct->SDIO_Argument;
/*---------------------------- SDIO 命令寄存器配置 ------------------------*/
/* 获取SDIO命令寄存器的值 */
tmpreg =SDIO->CMD;
/* 清除 CMDINDEX, WAITRESP, WAITINT, WAITPEND, CPSMEN 位 */
tmpreg &=CMD_CLEAR_MASK;
/* 根据 SDIO_CmdIndex 的值设置 CMDINDEX 位 */
/* 根据 SDIO_Response 的值设置 WAITRESP 位 */
/* 根据 SDIO_Wait 的值设置 WAITINT 和 WAITPEND 位 */
/* 根据 SDIO_CPSM 的值设置 CPSMEN 位 */
tmpreg |=(uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex |SDIO_CmdInitStruct->SDIO_Response
|SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM;
/* 回写SDIO命令寄存器 */
SDIO->CMD =tmpreg;
}
[编辑] 函数SDIO_GetCommandResponse
/**
* 功能描述 返回上一个收到响应的命令的命令索引
* 输入参数 无
* 返回值 返回上一个收到响应的命令的命令索引
*/
uint8_t SDIO_GetCommandResponse(void)
{
return(uint8_t)(SDIO->RESPCMD);
}
[编辑] 函数SDIO_GetResponse
/**
* 功能描述 返回上一个命令从卡收到的响应
* 输入参数 SDIO_RESP: 指定SDIO响应寄存器
* 该参数可以是下列值之一:
* SDIO_RESP1: 响应寄存器 1
* SDIO_RESP2: 响应寄存器 2
* SDIO_RESP3: 响应寄存器 3
* SDIO_RESP4: 响应寄存器 4
* 返回值 对应的响应寄存器的值
*/
uint32_t SDIO_GetResponse(uint32_t SDIO_RESP)
{
__IO uint32_t tmp= 0;
/* 检查输入参数 */
assert_param(IS_SDIO_RESP(SDIO_RESP));
tmp =SDIO_RESP_ADDR + SDIO_RESP;
return (*(__IOuint32_t *) tmp);
}
[编辑] 函数SDIO_DataConfig
/**
* 功能描述 根据SDIO_DataInitStruct中指定的参数初始化SDIO数据通道
* 输入参数 SDIO_DataInitStruct: 指向结构SDIO_DataInitTypeDef的指针,包含了SDIO数据的配置信息
* 返回值 无
*/
void SDIO_DataConfig(SDIO_DataInitTypeDef*SDIO_DataInitStruct)
{
uint32_t tmpreg =0;
/* 检查输入参数 */
assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->SDIO_DataLength));
assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->SDIO_DataBlockSize));
assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->SDIO_TransferDir));
assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->SDIO_TransferMode));
assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->SDIO_DPSM));
/*---------------------------- SDIO 数据定时器配置 ---------------------*/
/* 设置SDIO数据超时时间 */
SDIO->DTIMER =SDIO_DataInitStruct->SDIO_DataTimeOut;
/*---------------------------- SDIO 数据长度寄存器配置 -----------------------*/
/* 设置SDIO数据长度 */
SDIO->DLEN =SDIO_DataInitStruct->SDIO_DataLength;
/*---------------------------- SDIO 数据控制寄存器配置 ----------------------*/
/* 获取SDIO 数据控制寄存器的值 */
tmpreg =SDIO->DCTRL;
/* 清除 DEN, DTMODE, DTDIR 和 DBCKSIZE 位 */
tmpreg &=DCTRL_CLEAR_MASK;
/* 根据SDIO_DPSM的值设置DEN位 */
/* 根据SDIO_TransferMode的值设置DTMODE位 */
/* 根据SDIO_TransferDir的值设置DTDIR位 */
/* 根据SDIO_DataBlockSize的值设置DBCKSIZE位 */
tmpreg |=(uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize |SDIO_DataInitStruct->SDIO_TransferDir
|SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM;
/* 回写SDIO数据控制寄存器 */
SDIO->DCTRL =tmpreg;
}
[编辑] 函数SDIO_ReadData
/**
* 功能描述 从接收FIFO读一个数据字
* 输入参数 无
* 返回值 收到的数据
*/
uint32_t SDIO_ReadData(void)
{
returnSDIO->FIFO;
}
[编辑] 函数SDIO_WriteData
/**
* 功能描述 向发送FIFO写一个数据字
* 输入参数 Data: 要写的32位数据字
* 返回值 无
*/
void SDIO_WriteData(uint32_t Data)
{
SDIO->FIFO =Data;
}
[编辑] 函数SDIO_GetFlagStatus
/**
* 功能描述 检查指定的SDIO标志设置与否
* 输入参数 SDIO_FLAG: 指定待检查的SDIO标志
* 该参数可以是下列值之一:
* SDIO_FLAG_CCRCFAIL: 命令响应已接收(CRC校验失败)
* SDIO_FLAG_DCRCFAIL: 数据块已发送/接收(CRC校验失败)
* SDIO_FLAG_CTIMEOUT: 命令响应超时
* SDIO_FLAG_DTIMEOUT: 数据超时
* SDIO_FLAG_TXUNDERR: 发送FIFO下溢错误
* SDIO_FLAG_RXOVERR: 接收FIFO上溢
* SDIO_FLAG_CMDREND: 命令响应已接收(CRC校验通过)
* SDIO_FLAG_CMDSENT: 命令已发送(不需要响应)
* SDIO_FLAG_DATAEND: 数据传输结束(数据计数器SDIDCOUNT为0)
* SDIO_FLAG_STBITERR: 在宽总线模式下,所有数据线都没检测到起始位
* SDIO_FLAG_DBCKEND: 数据块已发送/接收(CRC校验通过)
* SDIO_FLAG_CMDACT: 正在传输命令
* SDIO_FLAG_TXACT: 正在发送数据
* SDIO_FLAG_RXACT: 正在接收数据
* SDIO_FLAG_TXFIFOHE: 发送FIFO半空
* SDIO_FLAG_RXFIFOHF: 接收FIFO半满
* SDIO_FLAG_TXFIFOF: 发送FIFO满
* SDIO_FLAG_RXFIFOF: 接收FIFO满
* SDIO_FLAG_TXFIFOE: 发送FIFO空
* SDIO_FLAG_RXFIFOE: 接收FIFO空
* SDIO_FLAG_TXDAVL: 发送FIFO中的数据有效
* SDIO_FLAG_RXDAVL: 接收FIFO中的数据有效
* SDIO_FLAG_SDIOIT: SD I/O 中断已接收
* SDIO_FLAG_CEATAEND: CE-ATA命令CMD61的完成信号已接收
* 返回值 SDIO标志的状态(SET 或 RESET).
*/
FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG)
{
FlagStatusbitstatus = RESET;
/* 检查输入参数 */
assert_param(IS_SDIO_FLAG(SDIO_FLAG));
if ((SDIO->STA& SDIO_FLAG) != (uint32_t)RESET)
{
bitstatus =SET;
}
else
{
bitstatus =RESET;
}
return bitstatus;
}
[编辑] 函数SDIO_ClearFlag
/**
* 功能描述 清除SDIO的挂起标志
* 输入参数 SDIO_FLAG: 指定待清除的标志
* 该参数可以是下列值之一:
* SDIO_FLAG_CCRCFAIL: 命令响应已接收(CRC校验失败)
* SDIO_FLAG_DCRCFAIL: 数据块已发送/接收(CRC校验失败)
* SDIO_FLAG_CTIMEOUT: 命令响应超时
* SDIO_FLAG_DTIMEOUT: 数据超时
* SDIO_FLAG_TXUNDERR: 发送FIFO下溢错误
* SDIO_FLAG_RXOVERR: 接收FIFO上溢错误
* SDIO_FLAG_CMDREND: 命令响应已接收(CRC校验通过)
* SDIO_FLAG_CMDSENT: 命令已发送(不需要响应)
* SDIO_FLAG_DATAEND: 数据传输结束(数据计数器SDIDCOUNT为0)
* SDIO_FLAG_STBITERR: 在宽总线模式下,所有数据线都没检测到起始位
* SDIO_FLAG_DBCKEND: 数据块已发送/接收(CRC校验通过)
* SDIO_FLAG_SDIOIT: SD I/O 中断已接收
* SDIO_FLAG_CEATAEND: CE-ATA命令CMD61的完成信号已接收
* 返回值 无
*/
void SDIO_ClearFlag(uint32_t SDIO_FLAG)
{
/* 检查输入参数 */
assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG));
SDIO->ICR =SDIO_FLAG;
}
[编辑] 函数SDIO_GetITStatus
/**
* 功能描述 检查指定的SDIO中断是否已发生
* 输入参数 SDIO_IT: 指定待检查的SDIO中断
* 该参数可以是下列值之一:
* SDIO_IT_CCRCFAIL: 命令响应已接收(CRC校验失败)中断
* SDIO_IT_DCRCFAIL: 数据块已发送/接收(CRC校验失败)中断
* SDIO_IT_CTIMEOUT: 命令响应超时中断
* SDIO_IT_DTIMEOUT: 数据超时中断
* SDIO_IT_TXUNDERR: 发送FIFO下溢错误中断
* SDIO_IT_RXOVERR: 接收FIFO上溢错误中断
* SDIO_IT_CMDREND: 命令响应已接收(CRC校验通过)中断
* SDIO_IT_CMDSENT: 命令已发送(不需要响应)中断
* SDIO_IT_DATAEND: 数据传输结束(数据计数器SDIDCOUNT为0)中断
* SDIO_IT_STBITERR: 在宽总线模式下,所有数据线都没检测到起始位中断
* SDIO_IT_DBCKEND: 数据块已发送/接收(CRC校验通过)中断
* SDIO_IT_CMDACT: 正在传输命令中断
* SDIO_IT_TXACT: 正在发送数据中断
* SDIO_IT_RXACT: 正在接收数据中断
* SDIO_IT_TXFIFOHE: 发送FIFO半空中断
* SDIO_IT_RXFIFOHF: 接收FIFO半满中断
* SDIO_IT_TXFIFOF: 发送FIFO满中断
* SDIO_IT_RXFIFOF: 接收FIFO满中断
* SDIO_IT_TXFIFOE: 发送FIFO空中断
* SDIO_IT_RXFIFOE: 接收FIFO空中断
* SDIO_IT_TXDAVL: 发送FIFO中的数据有效中断
* SDIO_IT_RXDAVL: 接收FIFO中的数据有效中断
* SDIO_IT_SDIOIT: SD I/O 中断已接收中断
* SDIO_IT_CEATAEND: CE-ATA命令CMD61的完成信号已接收中断
* 返回值 SDIO_IT的新状态(SET 或 RESET).
*/
ITStatus SDIO_GetITStatus(uint32_t SDIO_IT)
{
ITStatusbitstatus = RESET;
/* 检查输入参数 */
assert_param(IS_SDIO_GET_IT(SDIO_IT));
if ((SDIO->STA& SDIO_IT) != (uint32_t)RESET)
{
bitstatus =SET;
}
else
{
bitstatus =RESET;
}
return bitstatus;
}
[编辑] 函数SDIO_ClearITPendingBit
/**
* 功能描述 清除SDIO的中断挂起位
* 输入参数 SDIO_IT: 指定待清除的中断挂起位
* 该参数可以是下列值的一个或任意组合:
* SDIO_IT_CCRCFAIL: 命令响应已接收(CRC校验失败)中断
* SDIO_IT_DCRCFAIL: 数据块已发送/接收(CRC校验失败)中断
* SDIO_IT_CTIMEOUT: 命令响应超时中断
* SDIO_IT_DTIMEOUT: 数据超时中断
* SDIO_IT_TXUNDERR: 发送FIFO下溢错误中断
* SDIO_IT_RXOVERR: 接收FIFO上溢错误中断
* SDIO_IT_CMDREND: 命令响应已接收(CRC校验通过)中断
* SDIO_IT_CMDSENT: 命令已发送(不需要响应)中断
* SDIO_IT_DATAEND: 数据传输结束(数据计数器SDIDCOUNT为0)中断
* SDIO_IT_STBITERR: 在宽总线模式下,所有数据线都没检测到起始位中断
* SDIO_IT_SDIOIT: SD I/O 中断已接收中断
* SDIO_IT_CEATAEND: CE-ATA命令CMD61的完成信号已接收中断
* 返回值 无
*/
void SDIO_ClearITPendingBit(uint32_t SDIO_IT)
{
/* 检查输入参数 */
assert_param(IS_SDIO_CLEAR_IT(SDIO_IT));
SDIO->ICR =SDIO_IT;
}