STM32F4X 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_ClockEdgeSDIO_ClockEdge_RisingSDIOCLK上升沿产生SDIO_CK
SDIO_ClockEdge_FallingSDIOCLK下降沿产生SDIO_CK
SDIO_ClockBypassSDIO_ClockBypass_Disable在驱动 SDIO_CK 输出信号前,根据 CLKDIV 值对 SDIOCLK 进行分频
SDIO_ClockBypass_EnableSDIOCLK 直接驱动 SDIO_CK 输出信号
SDIO_ClockPowerSaveSDIO_ClockPowerSave_Disable始终使能 SDIO_CK 时钟
SDIO_ClockPowerSave_Enable仅在总线激活时使能 SDIO_CK
SDIO_BusWideSDIO_BusWide_1b1位总线模式,使用SDIO_D0
SDIO_BusWide_4b4位总线模式,使用SDIO_D[3:0]
SDIO_BusWide_8b8位总线模式,使用SDIO_D[7:0]
SDIO_HardwareFlowControlSDIO_HardwareFlowControl_Disable禁止硬件流控制
SDIO_HardwareFlowControl_Enable使能硬件流控制
SDIO_ClockDiv0~255SDIO_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_CmdIndex0~63命令索引号
SDIO_ResponseSDIO_Response_No没有响应
SDIO_Response_Short短响应
SDIO_Response_Long长响应
SDIO_WaitSDIO_Wait_No不等待
SDIO_Wait_IT等待中断
SDIO_Wait_Pend等待数据传输结束
SDIO_CPSMSDIO_CPSM_Disable不使用CPSM状态机
SDIO_CPSM_Enable使用CPSM状态机
SDIO_Argument32位寄存器命令参数

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_DataLength24位寄存器需要收发的数据字节数
SDIO_DataBlockSizeSDIO_DataBlockSize_1b0个数据块,1字节大小
SDIO_DataBlockSize_2b1个数据块,2字节大小
SDIO_DataBlockSize_4b2个数据块,4字节大小
SDIO_DataBlockSize_8b3个数据块,8字节大小
SDIO_DataBlockSize_16b4个数据块,16字节大小
SDIO_DataBlockSize_32b5个数据块,32字节大小
SDIO_DataBlockSize_64b6个数据块,64字节大小
SDIO_DataBlockSize_128b7个数据块,128字节大小
SDIO_DataBlockSize_256b8个数据块,256字节大小
SDIO_DataBlockSize_512b9个数据块,512字节大小
SDIO_DataBlockSize_1024b10个数据块,1024字节大小
SDIO_DataBlockSize_2048b11个数据块,2048字节大小
SDIO_DataBlockSize_4096b12个数据块,4096字节大小
SDIO_DataBlockSize_8192b13个数据块,8192字节大小
SDIO_DataBlockSize_16384b14个数据块,16384字节大小
SDIO_TransferDirSDIO_TransferDir_ToCard数据传输方向是从SDIO控制器到SD卡
SDIO_TransferDir_ToSDIO数据传输方向是从SD卡到SDIO控制器
SDIO_TransferModeSDIO_TransferMode_Block数据传输类型为块传输
SDIO_TransferMode_Stream数据传输类型为字节或流传输
SDIO_DPSMSDIO_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 命令完成信号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值