sdio库函数讲解

[编辑]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;

}

 

你可能感兴趣的:(32)