SD库函数讲解.docx
- 文档编号:29860542
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:24
- 大小:20.04KB
SD库函数讲解.docx
《SD库函数讲解.docx》由会员分享,可在线阅读,更多相关《SD库函数讲解.docx(24页珍藏版)》请在冰豆网上搜索。
SD库函数讲解
[编辑]SDIO数据结构
[编辑]SDIO初始化结构类型定义
typedefstruct
{
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])*/
#defineSDIO_ClockEdge_Rising((uint32_t)0x00000000)
#defineSDIO_ClockEdge_Falling((uint32_t)0x00002000)
/*SDIO_ClockBypass用于设置BYPASS位(SDIO_CLKCR[10])*/
#defineSDIO_ClockBypass_Disable((uint32_t)0x00000000)
#defineSDIO_ClockBypass_Enable((uint32_t)0x00000400)
/*SDIO_ClockPowerSave用于设置PWRSAV位(SDIO_CLKCR[9])*/
#defineSDIO_ClockPowerSave_Disable((uint32_t)0x00000000)
#defineSDIO_ClockPowerSave_Enable((uint32_t)0x00000200)
/*SDIO_BusWide用于设置WIDBUS位(SDIO_CLKCR[12:
11])*/
#defineSDIO_BusWide_1b((uint32_t)0x00000000)
#defineSDIO_BusWide_4b((uint32_t)0x00000800)
#defineSDIO_BusWide_8b((uint32_t)0x00001000)
/*SDIO_HardWareFlowControl用于设置HWFC_EN位(SDIO_CLKCR[14])*/
#defineSDIO_HardwareFlowControl_Disable((uint32_t)0x00000000)
#defineSDIO_HardwareFlowControl_Enable((uint32_t)0x00004000)
/*SDIO_ClockDiv用于设置CLKDIV位(SDIO_CLKCR[7:
0])*/
[编辑]SDIO命令初始化结构类型定义
typedefstruct
{
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])*/
#defineIS_SDIO_CMD_INDEX(INDEX)((INDEX)<0x40)
/*SDIO_Response用于设置WAITRESP位(SDIO_CMD[7:
6])*/
#defineSDIO_Response_No((uint32_t)0x00000000)
#defineSDIO_Response_Short((uint32_t)0x00000040)
#defineSDIO_Response_Long((uint32_t)0x000000C0)
/*SDIO_Wait用于设置WAITPEND和WAITINT位(SDIO_CMD[9:
8])*/
#defineSDIO_Wait_No((uint32_t)0x00000000)//不等待,允许超时
#defineSDIO_Wait_IT((uint32_t)0x00000100)//SDIO等待中断请求
#defineSDIO_Wait_Pend((uint32_t)0x00000200)//SDIO等待传输结束
/*SDIO_CPSM用于设置CPSMEN位(SDIO_CMD[10])*/
#defineSDIO_CPSM_Disable((uint32_t)0x00000000)
#defineSDIO_CPSM_Enable((uint32_t)0x00000400)
[编辑]SDIO数据初始化结构类型定义
typedefstruct
{
uint32_tSDIO_DataTimeOut;//指定数据超时时间
uint32_tSDIO_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])*/
#defineIS_SDIO_DATA_LENGTH(LENGTH)((LENGTH)<=0x01FFFFFF)
/*SDIO_DataBlockSize用于设置DBLOCKSIZE位(SDIO_DCTRL[7:
4])*/
#defineSDIO_DataBlockSize_1b((uint32_t)0x00000000)
#defineSDIO_DataBlockSize_2b((uint32_t)0x00000010)
#defineSDIO_DataBlockSize_4b((uint32_t)0x00000020)
#defineSDIO_DataBlockSize_8b((uint32_t)0x00000030)
#defineSDIO_DataBlockSize_16b((uint32_t)0x00000040)
#defineSDIO_DataBlockSize_32b((uint32_t)0x00000050)
#defineSDIO_DataBlockSize_64b((uint32_t)0x00000060)
#defineSDIO_DataBlockSize_128b((uint32_t)0x00000070)
#defineSDIO_DataBlockSize_256b((uint32_t)0x00000080)
#defineSDIO_DataBlockSize_512b((uint32_t)0x00000090)
#defineSDIO_DataBlockSize_1024b((uint32_t)0x000000A0)
#defineSDIO_DataBlockSize_2048b((uint32_t)0x000000B0)
#defineSDIO_DataBlockSize_4096b((uint32_t)0x000000C0)
#defineSDIO_DataBlockSize_8192b((uint32_t)0x000000D0)
#defineSDIO_DataBlockSize_16384b((uint32_t)0x000000E0)
/*SDIO_TransferDir用于设置DTDIR位(SDIO_DCTRL[1])*/
#defineSDIO_TransferDir_ToCard((uint32_t)0x00000000)
#defineSDIO_TransferDir_ToSDIO((uint32_t)0x00000002)
/*SDIO_TransferMode用于设置DTMODE位(SDIO_DCTRL[2])*/
#defineSDIO_TransferMode_Block((uint32_t)0x00000000)
#defineSDIO_TransferMode_Stream((uint32_t)0x00000004)
/*SDIO_DPSM用于设置DTEN位(SDIO_DCTRL[0])*/
#defineSDIO_DPSM_Disable((uint32_t)0x00000000)
#defineSDIO_DPSM_Enable((uint32_t)0x00000001)
[编辑]SDIO库函数
[编辑]函数SDIO_Init
/**
*功能描述根据SDIO_InitStruct中指定的参数初始化SDIO外设
*输入参数SDIO_InitStruct:
指向结构SDIO_InitTypeDef的指针,包含了SDIO外设的配置信息
*返回值无
*/
voidSDIO_Init(SDIO_InitTypeDef*SDIO_InitStruct)
{
uint32_ttmpreg=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));
/*----------------------------SDIOCLKCR配置------------------------*/
/*获取SDIOCLKCR的值*/
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);
/*回写SDIOCLKCR*/
SDIO->CLKCR=tmpreg;
}
[编辑]函数SDIO_ClockCmd
/**
*功能描述使能或失能SDIO时钟
*输入参数NewState:
SDIO时钟的新状态
*该参数可以是:
*ENABLE
*DISABLE
*返回值无
*/
voidSDIO_ClockCmd(FunctionalStateNewState)
{
/*检查输入参数*/
assert_param(IS_FUNCTIONAL_STATE(NewState));
/*根据NewState设置或清除SDIO_CLKCR的CLKEN位*/
*(__IOuint32_t*)CLKCR_CLKEN_BB=(uint32_t)NewState;
}
[编辑]函数SDIO_SetPowerState
/**
*功能描述设置控制器的电源状态
*输入参数SDIO_PowerState:
电源状态的新状态
*该参数可以使下列值之一:
*SDIO_PowerState_OFF
*SDIO_PowerState_ON
*返回值无
*/
voidSDIO_SetPowerState(uint32_tSDIO_PowerState)
{
/*检查输入参数*/
assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState));
/*清除当前的电源状态*/
SDIO->POWER&=PWR_PWRCTRL_MASK;
/*根据SDIO_PowerState关闭或打开SDIO电源*/
SDIO->POWER|=SDIO_PowerState;
}
[编辑]函数SDIO_GetPowerState
/**
*功能描述获取控制器的电源状态
*输入参数无
*返回值控制器的电源状态Thereturnedvaluecan
*该返回值可能是下列值之一:
*-0x00:
电源关闭
*-0x02:
电源启动
*-0x03:
电源打开
*/
uint32_tSDIO_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:
收到SDI/O中断中断
*SDIO_IT_CEATAEND:
CMD61收到CE-ATA命令完成信号中断
*输入参数NewState:
指定的SDIO中断的新状态
*该参数可以是:
*ENABLE
*DISABLE
*返回值无
*/
voidSDIO_ITConfig(uint32_tSDIO_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
/**
*功能描述使能或失能SDIODMA请求
*输入参数NewState:
选择的SDIODMA请求的新状态
*该参数可以是:
*ENABLE
*DISABLE
*返回值无
*/
voidSDIO_DMACmd(FunctionalStateNewState)
{
/*检查输入参数*/
assert_param(IS_FUNCTIONAL_STATE(NewState));
/*根据NewState设置或清除SDIO_CLKCR的DMAEN位*/
*(__IOuint32_t*)DCTRL_DMAEN_BB=(uint32_t)NewState;
}
[编辑]函数SDIO_SendCommand
/**
*功能描述根据SDIO_CmdInitStruct中指定的参数初始化SDIO命令,并且发送命令
*输入参数SDIO_CmdInitStruct:
指向结构SDIO_CmdInitTypeDef的指针,包含了SDIO命令的配置信息
*返回值无
*/
voidSDIO_SendCommand(SDIO_CmdInitTypeDef*SDIO_CmdInitStruct)
{
uint32_ttmpreg=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_tSDIO_GetCommandResponse(void)
{
return(uint8_t)(SDIO->RESPCMD);
}
[编辑]函数SDIO_GetResponse
/**
*功能描述返回上一个命令从卡收到的响应
*输入参数SDIO_RESP:
指定SDIO响应寄存器
*该参数可以是下列值之一:
*SDIO_RESP1:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SD 库函数 讲解