SD库函数讲解.docx

上传人:b****2 文档编号:17665931 上传时间:2023-07-27 格式:DOCX 页数:24 大小:20.04KB
下载 相关 举报
SD库函数讲解.docx_第1页
第1页 / 共24页
SD库函数讲解.docx_第2页
第2页 / 共24页
SD库函数讲解.docx_第3页
第3页 / 共24页
SD库函数讲解.docx_第4页
第4页 / 共24页
SD库函数讲解.docx_第5页
第5页 / 共24页
SD库函数讲解.docx_第6页
第6页 / 共24页
SD库函数讲解.docx_第7页
第7页 / 共24页
SD库函数讲解.docx_第8页
第8页 / 共24页
SD库函数讲解.docx_第9页
第9页 / 共24页
SD库函数讲解.docx_第10页
第10页 / 共24页
SD库函数讲解.docx_第11页
第11页 / 共24页
SD库函数讲解.docx_第12页
第12页 / 共24页
SD库函数讲解.docx_第13页
第13页 / 共24页
SD库函数讲解.docx_第14页
第14页 / 共24页
SD库函数讲解.docx_第15页
第15页 / 共24页
SD库函数讲解.docx_第16页
第16页 / 共24页
SD库函数讲解.docx_第17页
第17页 / 共24页
SD库函数讲解.docx_第18页
第18页 / 共24页
SD库函数讲解.docx_第19页
第19页 / 共24页
SD库函数讲解.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

SD库函数讲解.docx

《SD库函数讲解.docx》由会员分享,可在线阅读,更多相关《SD库函数讲解.docx(24页珍藏版)》请在冰点文库上搜索。

SD库函数讲解.docx

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:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2