SD库函数讲解.doc_第1页
SD库函数讲解.doc_第2页
SD库函数讲解.doc_第3页
SD库函数讲解.doc_第4页
SD库函数讲解.doc_第5页
已阅读5页,还剩10页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编辑 SDIO数据结构编辑 SDIO初始化结构类型定义typedef struct uint32_t SDIO_ClockEdge; /指定位捕捉的时钟边沿 uint32_t SDIO_ClockBypass; /指定是否使能SDIO时钟分频器旁路 uint32_t SDIO_ClockPowerSave; /指定当总线空闲时,是否使能SDIO时钟输出 uint32_t SDIO_BusWide; /指定SDIO总线宽度 uint32_t SDIO_HardwareFlowControl; /指定是否使能SDIO硬件流控制 uint8_t SDIO_ClockDiv; /指定SDIO控制器的时钟分频系数(0x000xFF) SDIO_InitTypeDef;/* SDIO_Clock_Edge用于设置NEGEDGE位(SDIO_CLKCR13) */#define SDIO_ClockEdge_Rising (uint32_t)0x00000000)#define SDIO_ClockEdge_Falling (uint32_t)0x00002000)/* SDIO_ClockBypass用于设置BYPASS位(SDIO_CLKCR10) */#define SDIO_ClockBypass_Disable (uint32_t)0x00000000)#define SDIO_ClockBypass_Enable (uint32_t)0x00000400)/* SDIO_ClockPowerSave用于设置PWRSAV位(SDIO_CLKCR9) */#define SDIO_ClockPowerSave_Disable (uint32_t)0x00000000)#define SDIO_ClockPowerSave_Enable (uint32_t)0x00000200)/* SDIO_BusWide用于设置WIDBUS位(SDIO_CLKCR12:11) */#define SDIO_BusWide_1b (uint32_t)0x00000000)#define SDIO_BusWide_4b (uint32_t)0x00000800)#define SDIO_BusWide_8b (uint32_t)0x00001000)/* SDIO_HardWareFlowControl用于设置HWFC_EN位(SDIO_CLKCR14) */#define SDIO_HardwareFlowControl_Disable (uint32_t)0x00000000)#define SDIO_HardwareFlowControl_Enable (uint32_t)0x00004000)/* SDIO_ClockDiv用于设置CLKDIV位(SDIO_CLKCR7:0) */编辑 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;/* SDIO_Argument用于设置SDIO_ARG寄存器 */* SDIO_CmdIndex用于设置CMDINDEX位(SDIO_CMD5:0) */#define IS_SDIO_CMD_INDEX(INDEX) (INDEX) 0x40)/* SDIO_Response用于设置WAITRESP位(SDIO_CMD7:6) */#define SDIO_Response_No (uint32_t)0x00000000)#define SDIO_Response_Short (uint32_t)0x00000040)#define SDIO_Response_Long (uint32_t)0x000000C0)/* SDIO_Wait用于设置WAITPEND和WAITINT位(SDIO_CMD9:8) */#define SDIO_Wait_No (uint32_t)0x00000000) /不等待,允许超时#define SDIO_Wait_IT (uint32_t)0x00000100) /SDIO等待中断请求#define SDIO_Wait_Pend (uint32_t)0x00000200) /SDIO等待传输结束/* SDIO_CPSM用于设置CPSMEN位(SDIO_CMD10) */#define SDIO_CPSM_Disable (uint32_t)0x00000000)#define SDIO_CPSM_Enable (uint32_t)0x00000400)编辑 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; /指定是否使能数据通道状态机(DPSM) SDIO_DataInitTypeDef;/* SDIO_DataTimeOut用于设置SDIO_DTIMER寄存器 */* SDIO_DataLength用于设置DATALENGTH位(SDIO_DLEN24:0) */#define IS_SDIO_DATA_LENGTH(LENGTH) (LENGTH) 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); /*- SDIO CLKCR 配置 -*/ /* 获取 SDIO CLKCR 的值 */ 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); /* 回写 SDIO CLKCR */ SDIO-CLKCR = tmpreg;编辑 函数SDIO_ClockCmd/* * 功能描述 使能或失能 SDIO 时钟 * 输入参数 NewState:SDIO 时钟的新状态 * 该参数可以是: * ENABLE * DISABLE * 返回值 无 */void SDIO_ClockCmd(FunctionalState NewState) /* 检查输入参数 */ assert_param(IS_FUNCTIONAL_STATE(NewState); /* 根据 NewState 设置或清除 SDIO_CLKCR 的 CLKEN 位 */ *(_IO uint32_t *) CLKCR_CLKEN_BB = (uint32_t)NewState;编辑 函数SDIO_SetPowerState/* * 功能描述 设置控制器的电源状态 * 输入参数 SDIO_PowerState:电源状态的新状态 * 该参数可以使下列值之一: * SDIO_PowerState_OFF * SDIO_PowerState_ON * 返回值 无 */void SDIO_SetPowerState(uint32_t SDIO_PowerState) /* 检查输入参数 */ assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState); /* 清除当前的电源状态 */ SDIO-POWER &= PWR_PWRCTRL_MASK; /* 根据 SDIO_PowerState 关闭或打开SDIO电源 */ SDIO-POWER |= SDIO_PowerState;编辑 函数SDIO_GetPowerState/* * 功能描述 获取控制器的电源状态 * 输入参数 无 * 返回值 控制器的电源状态The returned value can * 该返回值可能是下列值之一: * - 0x00: 电源关闭 * - 0x02: 电源启动 * - 0x03: 电源打开 */uint32_t SDIO_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: 收到 SD I/O 中断中断 * SDIO_IT_CEATAEND: CMD61 收到 CE-ATA 命令完成信号中断 * 输入参数 NewState: 指定的SDIO中断的新状态 *该参数可以是: *ENABLE * DISABLE * 返回值 无 */void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState) /* 检查输入参数 */ 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/* * 功能描述 使能或失能 SDIO DMA 请求 * 输入参数 NewState: 选择的 SDIO DMA 请求的新状态 *该参数可以是: * ENABLE * DISABLE * 返回值 无 */void SDIO_DMACmd(FunctionalState NewState) /* 检查输入参数 */ assert_param(IS_FUNCTIONAL_STATE(NewState); /* 根据 NewState 设置或清除 SDIO_CLKCR 的 DMAEN 位 */ *(_IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)NewState;编辑 函数SDIO_SendCommand/* * 功能描述 根据 SDIO_CmdInitStruct 中指定的参数初始化 SDIO 命令,并且发送命令 * 输入参数 SDIO_CmdInitStruct:指向结构 SDIO_CmdInitTypeDef 的指针,包含了SDIO命令的配置信息 * 返回值 无 */void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct) uint32_t tmpreg = 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_t SDIO_GetCommandResponse(void) return (uint8_t)(SDIO-RESPCMD);编辑 函数SDIO_GetResponse/* * 功能描述 返回上一个命令从卡收到的响应 * 输入参数 SDIO_RESP: 指定SDIO响应寄存器 * 该参数可以是下列值之一: * SDIO_RESP1: 响应寄存器 1 * SDIO_RESP2: 响应寄存器 2 * SDIO_RESP3: 响应寄存器 3 * SDIO_RESP4: 响应寄存器 4 * 返回值 对应的响应寄存器的值 */uint32_t SDIO_GetResponse(uint32_t SDIO_RESP) _IO uint32_t tmp = 0; /* 检查输入参数 */ assert_param(IS_SDIO_RESP(SDIO_RESP); tmp = SDIO_RESP_ADDR + SDIO_RESP; return (*(_IO uint32_t *) tmp); 编辑 函数SDIO_DataConfig/* * 功能描述 根据SDIO_DataInitStruct中指定的参数初始化SDIO数据通道 * 输入参数 SDIO_DataInitStruct: 指向结构SDIO_DataInitTypeDef的指针,包含了SDIO数据的配置信息 * 返回值 无 */void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct) uint32_t tmpreg = 0; /* 检查输入参数 */ assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct-SDIO_DataLength); assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct-SDIO_DataBlockSize); assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct-SDIO_TransferDir); assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct-SDIO_TransferMode); assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct-SDIO_DPSM);/*- SDIO 数据定时器配置 -*/ /* 设置SDIO数据超时时间 */ SDIO-DTIMER = SDIO_DataInitStruct-SDIO_DataTimeOut;/*- SDIO 数据长度寄存器配置 -*/ /* 设置SDIO数据长度 */ SDIO-DLEN = SDIO_DataInitStruct-SDIO_DataLength;/*- SDIO 数据控制寄存器配置 -*/ /* 获取SDIO 数据控制寄存器的值 */ tmpreg = SDIO-DCTRL; /* 清除 DEN, DTMODE, DTDIR 和 DBCKSIZE 位 */ tmpreg &= DCTRL_CLEAR_MASK; /* 根据SDIO_DPSM的值设置DEN位 */ /* 根据SDIO_TransferMode的值设置DTMODE位 */ /* 根据SDIO_TransferDir的值设置DTDIR位 */ /* 根据SDIO_DataBlockSize的值设置DBCKSIZE位 */ tmpreg |= (uint32_t)SDIO_DataInitStruct-SDIO_DataBlockSize | SDIO_DataInitStruct-SDIO_TransferDir | SDIO_DataInitStruct-SDIO_TransferMode | SDIO_DataInitStruct-SDIO_DPSM; /* 回写SDIO数据控制寄存器 */ SDIO-DCTRL = tmpreg;编辑 函数SDIO_ReadData/* * 功能描述 从接收FIFO读一个数据字 * 输入参数 无 * 返回值 收到的数据 */uint32_t SDIO_ReadData(void) return SDIO-FIFO;编辑 函数SDIO_WriteData/* * 功能描述 向发送FIFO写一个数据字 * 输入参数 Data: 要写的32位数据字 * 返回值 无 */void SDIO_WriteData(uint32_t Data) SDIO-FIFO = Data;编辑 函数SDIO_GetFlagStatus/* * 功能描述 检查指定的SDIO标志设置与否 * 输入参数 SDIO_FLAG: 指定待检查的SDIO标志 * 该参数可以是下列值之一: * 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为0) * 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: SD I/O 中断已接收 * SDIO_FLAG_CEATAEND: CE-ATA命令CMD61的完成信号已接收 * 返回值 SDIO标志的状态(SET 或 RESET). */FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG) FlagStatus bitstatus = RESET; /* 检查输入参数 */ assert_param(IS_SDIO_FLAG(SDIO_FLAG); if (SDIO-STA & SDIO_FLAG) != (uint32_t)RESET) bitstatus = SET; else bitstatus = RESET; return bitstatus;编辑 函数SDIO_ClearFlag/* * 功能描述 清除SDIO的挂起标志 * 输入参数 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为0) * SDIO_FLAG_STBITERR: 在宽总线模式下,所有数据线都没检测到起始位 * SDIO_FLAG_DBCKEND: 数据块已发送/接收(CRC校验通过) * SDIO_FLAG_SDIOIT: SD I/O 中断已接收 * SDIO_FLAG_CEATAEND: CE-ATA命令CMD61的完成信号已接收 * 返回值 无 */void SDIO_ClearFlag(uint32_t SDIO_FLAG) /* 检查输入参数 */ assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG); SDIO-ICR = SDIO_FLAG;编辑 函数SDIO_GetITStatus/* * 功能描述 检查指定的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: 正在发送数据中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论