STM32F4X SDIO(五) SDIO库函数使用

STM32F4X SDIO(五) SDIO库函数使用

  • STM32F4X SDIO库函数
    • SDIO初始化函数
    • SDIO命令发送函数
    • SDIO获取响应命令号函数
    • SDIO获取响应函数
    • SDIO收发数据配置函数
    • SDIO状态获取函数
    • SDIO状态清除函数
    • SDIO中断状态获取函数
    • SDIO中断状态清除函数

本节主要讲解STM32F4X的SDIO库函数的使用,后续的例程讲解将会用库函数的方法进行编程,所以先提前了解一下SDIO的库函数。

STM32F4X SDIO库函数

SDIO初始化函数

SDIO的初始化函数主要是初始SDIO控制器的时钟控制寄存器,包括SDIO总线宽度、SDIO时钟分频系数等。

typedef struct
{
  uint32_t SDIO_ClockEdge;     // SDIO_CK相位选择位     
  uint32_t SDIO_ClockBypass;   // 时钟分频器旁路使能位
  uint32_t SDIO_ClockPowerSave;  // 节能模式配置    
  uint32_t SDIO_BusWide;         // 总线宽度    
  uint32_t SDIO_HardwareFlowControl; // 硬件控制流
  uint8_t SDIO_ClockDiv;             // 时钟分频                                       
} SDIO_InitTypeDef;

/*
	*SDIO_InitStruct:SDIO初始化结构体
*/
void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct); // SDIO初始化
变量名 取值 描述
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;      // 使能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获取响应函数

/*
	参数:
	* SDIO_RESP1:响应寄存器1
	* SDIO_RESP2:响应寄存器2
	* SDIO_RESP3:响应寄存器3
	* SDIO_RESP4:响应寄存器4
	
	* 返回值: 响应数据
*/
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 命令完成信号

你可能感兴趣的:(STM32学习,stm32,嵌入式硬件,单片机)