STM32F4X SDIO(五) SDIO库函数使用
本节主要讲解STM32F4X的SDIO库函数的使用,后续的例程讲解将会用库函数的方法进行编程,所以先提前了解一下SDIO的库函数。
STM32F4X SDIO库函数
SDIO初始化函数
SDIO的初始化函数主要是初始SDIO控制器的时钟控制寄存器,包括SDIO总线宽度、SDIO时钟分频系数等。
typedef struct
{
uint32_t SDIO_ClockEdge;
uint32_t SDIO_ClockBypass;
uint32_t SDIO_ClockPowerSave;
uint32_t SDIO_BusWide;
uint32_t SDIO_HardwareFlowControl;
uint8_t SDIO_ClockDiv;
} SDIO_InitTypeDef;
void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct);
变量名 | 取值 | 描述 |
---|
SDIO_ClockEdge | SDIO_ClockEdge_Rising | SDIOCLK上升沿产生SDIO_CK |
SDIO_ClockEdge_Falling | SDIOCLK下降沿产生SDIO_CK |
SDIO_ClockBypass | SDIO_ClockBypass_Disable | 在驱动 SDIO_CK 输出信号前,根据 CLKDIV 值对 SDIOCLK 进行分频 |
SDIO_ClockBypass_Enable | SDIOCLK 直接驱动 SDIO_CK 输出信号 |
SDIO_ClockPowerSave | SDIO_ClockPowerSave_Disable | 始终使能 SDIO_CK 时钟 |
SDIO_ClockPowerSave_Enable | 仅在总线激活时使能 SDIO_CK |
SDIO_BusWide | SDIO_BusWide_1b | 1位总线模式,使用SDIO_D0 |
SDIO_BusWide_4b | 4位总线模式,使用SDIO_D[3:0] |
SDIO_BusWide_8b | 8位总线模式,使用SDIO_D[7:0] |
SDIO_HardwareFlowControl | SDIO_HardwareFlowControl_Disable | 禁止硬件流控制 |
SDIO_HardwareFlowControl_Enable | 使能硬件流控制 |
SDIO_ClockDiv | 0~255 | SDIO_CK时钟分频系数 |
SDIO命令发送函数
typedef struct
{
uint32_t SDIO_Argument;
uint32_t SDIO_CmdIndex;
uint32_t SDIO_Response;
uint32_t SDIO_Wait;
uint32_t SDIO_CPSM;
} SDIO_CmdInitTypeDef;
void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct);
变量名 | 取值 | 描述 |
---|
SDIO_CmdIndex | 0~63 | 命令索引号 |
SDIO_Response | SDIO_Response_No | 没有响应 |
SDIO_Response_Short | 短响应 |
SDIO_Response_Long | 长响应 |
SDIO_Wait | SDIO_Wait_No | 不等待 |
SDIO_Wait_IT | 等待中断 |
SDIO_Wait_Pend | 等待数据传输结束 |
SDIO_CPSM | SDIO_CPSM_Disable | 不使用CPSM状态机 |
SDIO_CPSM_Enable | 使用CPSM状态机 |
SDIO_Argument | 32位寄存器 | 命令参数 |
SDIO获取响应命令号函数
uint8_t SDIO_GetCommandResponse(void);
SDIO获取响应函数
uint32_t SDIO_GetResponse(uint32_t SDIO_RESP);
参数 | 描述 |
---|
SDIO_RESP1 | 响应寄存器1 |
SDIO_RESP2 | 响应寄存器2 |
SDIO_RESP3 | 响应寄存器3 |
SDIO_RESP4 | 响应寄存器4 |
SDIO收发数据配置函数
typedef struct
{
uint32_t SDIO_DataTimeOut;
uint32_t SDIO_DataLength;
uint32_t SDIO_DataBlockSize;
uint32_t SDIO_TransferDir;
uint32_t SDIO_TransferMode;
uint32_t SDIO_DPSM;
} SDIO_DataInitTypeDef;
void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct);
变量名 | 取值 | 描述 |
---|
SDIO_DataLength | 24位寄存器 | 需要收发的数据字节数 |
SDIO_DataBlockSize | SDIO_DataBlockSize_1b | 0个数据块,1字节大小 |
SDIO_DataBlockSize_2b | 1个数据块,2字节大小 |
SDIO_DataBlockSize_4b | 2个数据块,4字节大小 |
SDIO_DataBlockSize_8b | 3个数据块,8字节大小 |
SDIO_DataBlockSize_16b | 4个数据块,16字节大小 |
SDIO_DataBlockSize_32b | 5个数据块,32字节大小 |
SDIO_DataBlockSize_64b | 6个数据块,64字节大小 |
SDIO_DataBlockSize_128b | 7个数据块,128字节大小 |
SDIO_DataBlockSize_256b | 8个数据块,256字节大小 |
SDIO_DataBlockSize_512b | 9个数据块,512字节大小 |
SDIO_DataBlockSize_1024b | 10个数据块,1024字节大小 |
SDIO_DataBlockSize_2048b | 11个数据块,2048字节大小 |
SDIO_DataBlockSize_4096b | 12个数据块,4096字节大小 |
SDIO_DataBlockSize_8192b | 13个数据块,8192字节大小 |
SDIO_DataBlockSize_16384b | 14个数据块,16384字节大小 |
SDIO_TransferDir | SDIO_TransferDir_ToCard | 数据传输方向是从SDIO控制器到SD卡 |
SDIO_TransferDir_ToSDIO | 数据传输方向是从SD卡到SDIO控制器 |
SDIO_TransferMode | SDIO_TransferMode_Block | 数据传输类型为块传输 |
SDIO_TransferMode_Stream | 数据传输类型为字节或流传输 |
SDIO_DPSM | SDIO_DPSM_Disable | 不使用DPSM状态机 |
SDIO_DPSM_Enable | 使用DPSM状态机 |
SDIO状态获取函数
FlagStatus SDIO_GetFlagStatus(uint32_t 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 为零) |
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 | 收到了 SDIO 中断 |
SDIO_FLAG_CEATAEND | 针对 CMD61 收到了 CE-ATA 命令完成信号 |
SDIO状态清除函数
void SDIO_ClearFlag(uint32_t 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 为零) |
SDIO_FLAG_STBITERR | 在宽总线模式下,并非在所有数据信号上都检测到了起始位 |
SDIO_FLAG_DBCKEND | 已发送/ 接收数据块(CRC 校验通过) |
SDIO_FLAG_SDIOIT | 收到了 SDIO 中断 |
SDIO_FLAG_CEATAEND | 针对 CMD61 收到了 CE-ATA 命令完成信号 |
SDIO中断状态获取函数
ITStatus SDIO_GetITStatus(uint32_t 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 为零) |
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 | 收到了 SDIO 中断 |
SDIO_IT_CEATAEND | 针对 CMD61 收到了 CE-ATA 命令完成信号 |
SDIO中断状态清除函数
void SDIO_ClearITPendingBit(uint32_t 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 为零) |
SDIO_IT_STBITERR | 在宽总线模式下,并非在所有数据信号上都检测到了起始位 |
SDIO_IT_DBCKEND | 已发送/ 接收数据块(CRC 校验通过) |
SDIO_IT_SDIOIT | 收到了 SDIO 中断 |
SDIO_IT_CEATAEND | 针对 CMD61 收到了 CE-ATA 命令完成信号 |