转载自:http://blog.sina.com.cn/s/blog_6fa48e200101ikyo.html
enSDIO库函数入下表:
No | 库函数名 | 作用 | 操作对象 | | |
1 | 初始化SDIO外设寄存器 | 8个寄存器的的初始值 | |||
2 | 初始化SDIO_InitStruct结构体 | SDIO->CLKCR | 配置CLKCR | ||
3 | 初始化SDIO_InitStruct内的结构成员 | 配置CLKCR寄存所需要的参数缺省值 | |||
4 | 开启/关闭SDIO时钟 | *(vu32 *) CLKCR_CLKEN_BB | 配置CLKCR | ||
5 | 设置电源控制状态 | SDIO->POWER | POWER操作 | ||
6 | 读取电源控制状态 | SDIO->POWER | |||
7 | 开启或关闭中断 | SDIO->MASK | |||
8 | 开启或关闭 DMA | *(vu32 *) DCTRL_DMAEN_BB | |||
9 | 初始化SDIO_CmdInitStruct并发送配置命令 | SDIO->ARG/ CMD | |||
10 | 为SDIO_CmdInitStruct结构体填充缺省值 | | |||
11 | 返回命令反馈信息(命令索引值) | SDIO->RESPCMD | |||
12 | 返回上次从SD卡传回的命令响应 | *(vu32 *)(SDIO_RESP_ADDR + SDIO_RESP) | |||
13 | 初始化SDIO_DataInitStruct以设置数据路径 | SDIO->DTIMER/ DLEN/ DCTRL | |||
14 | 初始化SDIO_DataInitStruct结构体的成员 | | |||
15 | 返回待传输的数据字节数 | SDIO->DCOUNT | |||
16 | 从Rx FIFO读出已收到的数据 | SDIO->FIFO | |||
17 | 向Tx FIFO写入待发送的数据 | SDIO->FIFO | |||
18 | 返回FIFO内的(发送或接受的)数据字数 | SDIO->FIFOCNT | |||
19 | 开启读等待操作 | *(vu32 *) DCTRL_RWSTART_BB | DCTRL的[读]位操作 | ||
20 | 关闭读等待操作 | *(vu32 *) DCTRL_RWSTOP_BB | |||
21 | 设置两个插入读等待间隔之一的选项 | *(vu32 *) DCTRL_RWMOD_BB | |||
22 | 使能或失能SDIO模式 | *(vu32 *) DCTRL_SDIOEN_BB | DCTRL | ||
23 | 使能或失能SDIO模式暂停命令(正发送) | *(vu32 *) CMD_SDIOSUSPEND_BB | | ||
24 | 使能或失能命令完成信号 | *(vu32 *) CMD_ENCMDCOMPL_BB | |||
25 | 使能或失能CE-ATA中断 | *(vu32 *) CMD_NIEN_BB | |||
26 | 发送CE-ATA命令(CMD61) | *(vu32 *) CMD_ATACMD_BB | |||
27 | 检查SDIO的标志位是否已被设置 | SDIO->STA | |||
28 | 清除SDIO挂起标志位 | SDIO->ICR | |||
29 | 检查SDIO中断是已否发生 | SDIO->STA | |||
30 | 清除SDIO中断挂起位 | SDIO->ICR | |||
void SDIO_DeInit(void)
{
}
SDIO_Init的结构体如下:
typedef struct
{
} SDIO_InitTypeDef;
上述结构体的参数设置如下:
参数SDIO_ClockEdge的值 | 描述/SDIO_CLKCR.NEGEDGE/bit13 | #define | |
SDIO_ClockEdge_Rising | SDIOCLK的上升沿产生SDIO_CK | 0x00000000 | |
SDIO_ClockEdge_Falling | SDIOCLK的下降沿产生SDIO_CK | 0x00002000 | |
参数SDIO_ClockBypass的值 | 描述/SDIO_CLKCR. Bypass/bit10 | #define | |
SDIO_ClockBypass_Disable | SDIOCLK分频驱动SDIO_CK输出 | 0x00000000 | 根据CLKDIV[7:0]分频 |
SDIO_ClockBypass_Enable | SDIOCLK直接驱动SDIO_CK输出 | 0x00000400 | |
参数SDIO_ClockPowerSave的值 | 描述/SDIO_CLKCR. Bypass/bit9 | #define | |
SDIO_ClockPowerSave_Disable | 始终输出SDIO_CK | 0x00000000 | |
SDIO_ClockPowerSave_Enable | 仅在总线活动时才输出SDIO_CK | 0x00000200 | |
参数SDIO_BusWide的值 | 描述/SDIO_CLKCR.WIDBUS[1:0] | #define | bit12-11 |
SDIO_BusWide_1b | 1位总线模式,使用SDIO_D[0] | 0x00000000 | 默认 |
SDIO_BusWide_4b | 4位总线模式,使用SDIO_D[3:0] | 0x00000800 | |
SDIO_BusWide_8b | 8位总线模式,使用SDIO_D[7:0] | 0x00001000 | |
参数SDIO_ HardwareFlowControl的值 | 描述/SDIO_CLKCR. HWFC_EN/bit14 | #define | |
SDIO_HardwareFlowControl_Disable | 关闭硬件流控制 | 0x00000000 | |
SDIO_HardwareFlowControl_Enable | 开启硬件流控制 | 0x00004000 | |
函数原型如下:
void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct)
{
}
对SDIO->CLKCR涉及到的参数结构体(SDIO_InitTypeDef)进行缺省值注入。
函数原型如下:
void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct)
{
}
void SDIO_ClockCmd(FunctionalState NewState)
{
}
SDIO->CLKCR的CLKEN位地址定义如下:
#define CLKCR_OFFSET
#define CLKEN_BitNumber
#define CLKCR_CLKEN_BB
其中:
【1】#define PERIPH_BB_BASE
【2】#define SDIO_OFFSET
最终结果是:&CLKCR_CLKEN_BB = 0x424B 00E8
POWER寄存器的参数设置如下:
参数SDIO_PowerState值 | 描述/SDIO->POWER.bit1-0 | #define | 备注 |
SDIO_PowerState_OFF | 电源关闭,卡的时钟停止 | 0x00000000 | PWRCTRL[1:0]。另:0x1保留 |
SDIO_PowerState_ON | 上电状态,卡的时钟开启 | 0x00000003 | |
SDIO_PowerState_UP | 保留的上电状态 | 0x00000002 | 本函数没有用到 |
其函数原型如下:
void SDIO_SetPowerState(u32 SDIO_PowerState)
{
}
u32 SDIO_GetPowerState(void)
{
}
Bit | 参数SDIO_IT取值 | 意义/SDIO->MASK | #define | 备注 |
0 | SDIO_IT_CCRCFAIL | 收到命令响应,但CRC验证失败 | 0x00000001 | 错误类 |
1 | SDIO_IT_DCRCFAIL | 传输数据响应,但CRC验证失败(发送/接收) | 0x00000002 | |
2 | SDIO_IT_CTIMEOUT | 命令响应超时 | 0x00000004 | |
3 | SDIO_IT_DTIMEOUT | 数据传输超时 | 0x00000008 | |
4 | SDIO_IT_TXUNDERR | 发送FIFO数据下溢错误 | 0x00000010 | |
5 | SDIO_IT_RXOVERR | 接收FIFO数据上溢错误 | 0x00000020 | |
6 | SDIO_IT_CMDREND | 已收到命令响应,且CRC验证成功 | 0x00000040 | |
7 | SDIO_IT_CMDSENT | 命令已发送响应(但不需要CRC验证) | 0x00000080 | |
8 | SDIO_IT_DATAEND | 数据发送结束(SDIO->DCOUNT = 0) | 0x00000100 | |
9 | SDIO_IT_STBITERR | 有些数据线没有检测到起始位(宽总线模式) | 0x00000200 | 错误类 |
10 | SDIO_IT_DBCKEND | 传输数据块结束,且CRC验证成功 | 0x00000400 | |
11 | SDIO_IT_CMDACT | 正在传输命令 | 0x00000800 | 传输进行中 |
12 | SDIO_IT_TXACT | 正在传输数据 | 0x00001000 | |
13 | SDIO_IT_RXACT | 正在接受数据 | 0x00002000 | |
14 | SDIO_IT_TXFIFOHE | 发送FIFO半空(FIFO至少还有8个字的空间) | 0x00004000 | FIFO状态 |
15 | SDIO_IT_RXFIFOHF | 接收FIFO半满(FIFO至少已有8个字的存在) | 0x00008000 | |
16 | SDIO_IT_TXFIFOF | 发送FIFO满 | 0x00010000 | |
17 | SDIO_IT_RXFIFOF | 接受FIFO满(硬件流控制:差2个字节->有效) | 0x00020000 | |
18 | SDIO_IT_TXFIFOE | 发送FIFO空(硬件流控制:仅2个字节->有效) | 0x00040000 | |
19 | SDIO_IT_RXFIFOE | 接收FIFO空 | 0x00080000 | |
20 | SDIO_IT_TXDAVL | 在发送FIFO中的数据可用 | 0x00100000 | 数据状况 |
21 | SDIO_IT_RXDAVL | 在接收FIFO中的数据可用 | 0x00200000 | |
22 | SDIO_IT_SDIOIT | 收到SDIO中断 | 0x00400000 | |
23 | SDIO_IT_CEATAEND | 收到 CE-ATA命令 完成信号(For CMD61) | 0x00800000 | |
函数原型如下:
void SDIO_ITConfig(u32 SDIO_IT, FunctionalState NewState)
{
}
void SDIO_DMACmd(FunctionalState NewState)
{
}
位地址操作意义如下:
【1】
#define DCTRL_OFFSET
#define DMAEN_BitNumber
#define DCTRL_DMAEN_BB
【2】
#define SDIO_OFFSET
【3】
#define SDIO_BASE
【4】
#define PERIPH_BB_BASE
【结果】:【A】+ 【B】*32+【C】*4 = 0x4230 058C
SDIO_CmdInitStruct结构体如下:
typedef struct
{
} SDIO_CmdInitTypeDef;
结构体的各参数取值如下:
【1】、 SDIO_CmdIndex取值:< 0x40;[SDIO->CMD. CMDINDEX[5:0]/Bit5-0]
【2】、 SDIO_Respone取值(类型)如下表:
参数SDIO_Respone值 | 描述/SDIO->CMD. WAITRESP[1:0]/bit7-6 | #define | 备注 |
SDIO_Response_No | 无响应,期待CMDSENT标志 | 0x00000000 | 或0x00000080/bit7-6 = 0bx0 |
SDIO_Response_Short | 短响应,期待CMDREND或CCRCFAIL标志 | 0x00000040 | |
SDIO_Response_Long | 长响应,期待CMDREND或CCRCFAIL标志 | 0x000000C0 | |
【3】、 SDIO_Wait取值如下表:
参数SDIO_Wait值 | 描述/SDIO->CMD. WAITPEND+WAITINT | #define | 说明 |
SDIO_Wait_No | SDIO No Wait, TimeOut is enabled | 0x00000000 | 关闭bit9+bit8 |
SDIO_Wait_IT | SDIO Wait Interrupt Request | 0x00000100 | 开启bit8 |
SDIO_Wait_Pend | SDIO Wait End of transfer | 0x00000200 | 开启bit9 |
【4】、 SDIO_CPSM取值如下表:
参数SDIO_CPSM值 | 描述/ SDIO->CMD. CPSMEN/Bit10 | #define | 备注 |
SDIO_CPSM_Disable | 关闭CPSM | 0x00000000 | |
SDIO_CPSM_Enable | 开启CPSM | 0x00000400 | |
【5】、 SDIO_Argument为命令(32位)参数(Argument)。
【注】:在调用SDIO_SendCommand函数时,必须实现初始化结构体的上述5个参数。
函数原型如下:
void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct)
{
}
本函数用于设置SDIO_CmdInitStruct的5个结构体参数。【程序过程调用本函数,相当于复位CMD和ARG两个寄存器的初始值】
函数原型如下:
void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct)
{
}
本函数(用于读取命令响应)原型如下:
u8 SDIO_GetCommandResponse(void)
{
}
函数原型如下:
u32 SDIO_GetResponse(u32 SDIO_RESP)
{
}
函数地址解析如下:
【1】.
#define SDIO_RESP_ADDR
【2】.RESPx的Address Offset值如下表:
参数SDIO_RESP值 | #define Value | 说明 |
SDIO_RESP1 | 0x00000000 | 本函数定义的偏移量是以RESP1偏移量为基准,故RESP1的偏移量为0x00 |
SDIO_RESP2 | 0x00000004 | |
SDIO_RESP3 | 0x00000008 | |
SDIO_RESP4 | 0x0000000C |
【3】.SDIO_BASS:
#define SDIO_BASE
【4】PERIPH_BASE:
#define PERIPH_BASE
其结果为:0x4001 8014 + SDIO_RESP
SDIO_DataInitStruct的结构体如下:
typedef struct
{
} SDIO_DataInitTypeDef;
在调用SDIO_DataConfig函数之前,必须事先对上述结构体进行初始化,其结构体各参数值如下:
【1】、SDIO_DataTimeOut(SDIO->DTIMER):控制数据在SDIO_DataTimeOut时间之内不超时(以卡总线时钟周期为单位的数据超时时
【2】、DataLength(SDIO->DLEN.bit24-0):指定数据长度(为:数据块的倍数)。其取值范围为:<= 0x01FFFFFF(25bit有效长度)。
【3】、DataBlockSize(SDIO->DCTRL.bit7-4):控制一个数据块有多少字节(Bytes):一个数据块 = 2^((十进制)BLOCKSIZE[3:0])。
No | 参数SDIO_DataBlockSize取值 | 描述/ DCTRL.bit7-4 | #define |
SDIO_DataBlockSize_1b | 1数据块 = 1字节 | 0x00000000 | |
2 | SDIO_DataBlockSize_2b | 1数据块 = 2字节 | 0x00000010 |
3 | SDIO_DataBlockSize_4b | 1数据块 = 4字节 | 0x00000020 |
4 | SDIO_DataBlockSize_8b | 1数据块 = 8字节 | 0x00000030 |
5 | SDIO_DataBlockSize_16b | 1数据块 = 16字节 | 0x00000040 |
6 | SDIO_DataBlockSize_32b | 1数据块 = 32字节 | 0x00000050 |
7 | SDIO_DataBlockSize_64b | 1数据块 = 64字节 | 0x00000060 |
8 | SDIO_DataBlockSize_128b | 1数据块 = 128字节 | 0x00000070 |
9 | SDIO_DataBlockSize_256b | 1数据块 = 256字节 | 0x00000080 |
10 | SDIO_DataBlockSize_512b | 1数据块 = 512字节 | 0x00000090 |
11 | SDIO_DataBlockSize_1024b | 1数据块 = 1024字节 | 0x000000A0 |
12 | SDIO_DataBlockSize_2048b | 1数据块 = 2048字节 | 0x000000B0 |
13 | SDIO_DataBlockSize_4096b | 1数据块 = 4096字节 | 0x000000C0 |
14 | SDIO_DataBlockSize_8192b | 1数据块 = 8196字节 | 0x000000D0 |
15 | SDIO_DataBlockSize_16384b | 1数据块 = 16384字节 | 0x000000E0 |
【4】、TransferDir(SDIO->DCTRL.bit1):控制数据传输方向。其定义值及意义如下表:
参数SDIO_TransferDir取值 | 描述/DCTRL.DTDIR | #define Value |
SDIO_TransferDir_ToCard | 控制器到卡 | 0x00000000 |
SDIO_TransferDir_ToSDIO | 卡到控制器 | 0x00000002 |
【5】、SDIO_TransferMode(SDIO->DCTRL.bit2):控制数据传输模式。其定义与意义如下表:
参数SDIO_TransferMode取值 | 描述/DCTRL.DTMODE | #define Value |
SDIO_TransferMode_Block | 块数据传输 | 0x00000000 |
SDIO_TransferMode_Stream | 流数据传输 | 0x00000004 |
【6】、SDIO_DPSM(SDIO->DCTRL.bit0):使能或关闭数据传输
参数SDIO_DPSM取值 | 描述/DCTRL.DTEN | #define Value |
SDIO_DPSM_Disable | 关闭数据传输 | 0x00000000 |
SDIO_DPSM_Enable | 使能传输 | 0x00000001 |
函数原型如下:
void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct)
{
}
对SDIO_DataInitStruct结构体内的参数进行缺省值初始化,本函数可以被用于在程序当中复位数据传输模式。
函数原型如下:
void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct)
{
}
读取数据计数器的值,表明还有多少数据等待传输
函数原型如下:
u32 SDIO_GetDataCounter(void)
{
}
u32 SDIO_ReadData(void)
{
}
void SDIO_WriteData(u32 Data)
{
}
u32 SDIO_GetFIFOCount(void)
{
}
void SDIO_StartSDIOReadWait(FunctionalState NewState)
{
}
位地址操作如下:
#define DCTRL_RWSTART_BB
【1】
#define PERIPH_BB_BASE
【2】
#define SDIO_BASE
#define SDIO_OFFSET
#define DCTRL_OFFSET
【3】
#define RWSTART_BitNumber
【结果】&DCTRL_RWSTART_BB = 【1】+【2】*32+【3】*4 = 0x4230 05A0。[SDIO->DCTRL.bit8],读等待开始。
void SDIO_StopSDIOReadWait(FunctionalState NewState)
{
}
位地址操作如下:
#define DCTRL_RWSTOP_BB
【1】
#define PERIPH_BB_BASE
【2】
#define SDIO_BASE
#define SDIO_OFFSET
#define DCTRL_OFFSET
【3】
#define RWSTOP_BitNumber
【结果】&DCTRL_RWSTOP_BB = 【1】+【2】*32+【3】*4 = 0x4230 05A4。[SDIO->DCTRL.bit9],读等待停止。
void SDIO_SetSDIOReadWaitMode(u32 SDIO_ReadWaitMode)
{
}
其中SDIO_ReadWaitMode的取值如下表:
参数SDIO_ReadWaitMode值 | 描述/DCTRL.RWMOD/bit10 | #define |
SDIO_ReadWaitMode_CLK | 停止SDIO_CK控制读等待 | 0x00000000 |
SDIO_ReadWaitMode_DATA2 | 使用SDIO_D2控制读等待 | 0x00000001 |
位地址操作如下:
#define DCTRL_RWMOD_BB
【1】
#define PERIPH_BB_BASE
【2】
#define SDIO_BASE
#define SDIO_OFFSET
#define DCTRL_OFFSET
【3】
#define RWMOD_BitNumber
【结果】&DCTRL_RWMOD_BB = 【1】+【2】*32+【3】*4 = 0x4230 05A8。[SDIO->DCTRL.bit10],读等待停止。
void SDIO_SetSDIOOperation(FunctionalState NewState)
{
}
位地址操作如下:
#define DCTRL_SDIOEN_BB
【1】
#define PERIPH_BB_BASE
【2】
#define SDIO_BASE
#define SDIO_OFFSET
#define DCTRL_OFFSET
【3】
#define SDIOEN_BitNumber
【结果】&DCTRL_RWMOD_BB = 【1】+【2】*32+【3】*4 = 4230 05AC。[SDIO->DCTRL.bit11],SD I/O使能功能。
void SDIO_SendSDIOSuspendCmd(FunctionalState NewState)
{
}
位地址操作如下:
#define CMD_SDIOSUSPEND_BB
【1】
#define PERIPH_BB_BASE
【2】
#define SDIO_BASE
#define SDIO_OFFSET
#define CMD_OFFSET
【3】
#define SDIOSUSPEND_BitNumber
【结果】&CMD_SDIOSUSPEND_BB = 【1】+【2】*32+【3】*4 = 4230 01AC。[SDIO->CMD.bit11],SD I/O暂停命令。
void SDIO_CommandCompletionCmd(FunctionalState NewState)
{
}
位地址操作如下:
#define CMD_ENCMDCOMPL_BB
【1】
#define PERIPH_BB_BASE
【2】
#define SDIO_BASE
#define SDIO_OFFSET
#define CMD_OFFSET
【3】
#define ENCMDCOMPL_BitNumber
【结果】&CMD_ENCMDCOMPL_BB = 【1】+【2】*32+【3】*4 = 0x4230 01B0。[SDIO->CMD.bit12],使能CMD完成。
void SDIO_CEATAITCmd(FunctionalState NewState)
{
}
位地址操作如下:
#define CMD_NIEN_BB
【1】
#define PERIPH_BB_BASE
【2】
#define SDIO_BASE
#define SDIO_OFFSET
#define CMD_OFFSET
【3】
#define NIEN_BitNumber
【结果】&CMD_NIEN_BB = 【1】+【2】*32+【3】*4 = 0x4230 01B4。[SDIO->CMD.bit13],关闭中断使能。
void SDIO_SendCEATACmd(FunctionalState NewState)
{
}
位地址操作如下:
#define CMD_ATACMD_BB
【1】
#define PERIPH_BB_BASE
【2】
#define SDIO_BASE
#define SDIO_OFFSET
#define CMD_OFFSET
【3】
#define ATACMD_BitNumber
【结果】&CMD_ATACMD_BB = 【1】+【2】*32+【3】*4 = 0x4230 01B8。[SDIO->CMD.bit14],CE-ATA命令。
函数输入参数SDIO_FLAG的值可以参考“【07】SDIO_ITConfig”的取值,因为SDIO->STA各位于SDIO->MASK各位一一对应。
下表给出了SDIO_FLAG取值。
Bit | 参数SDIO_FLAG值 | 意义/SDIO->STA.bit0-23 | #define | 备注 |
0 | SDIO_FLAG_CCRCFAIL | 收到命令响应,但CRC验证失败 | 0x00000001 | 错误类 |
1 | SDIO_FLAG_DCRCFAIL | 传输数据响应,但CRC验证失败(发送/接收) | 0x00000002 | |
2 | SDIO_FLAG_CTIMEOUT | 命令响应超时 | 0x00000004 | |
3 | SDIO_FLAG_DTIMEOUT | 数据传输超时 | 0x00000008 | |
4 | SDIO_FLAG_TXUNDERR | 发送FIFO数据下溢错误 | 0x00000010 | |
5 | SDIO_FLAG_RXOVERR | 接收FIFO数据上溢错误 | 0x00000020 | |
6 | SDIO_FLAG_CMDREND | 已收到命令响应,且CRC验证成功 | 0x00000040 | |
7 | SDIO_FLAG_CMDSENT | 命令已发送响应(但不需要CRC验证) | 0x00000080 | |
8 | SDIO_FLAG_DATAEND | 数据发送结束(SDIO->DCOUNT = 0) | 0x00000100 | |
9 | SDIO_FLAG_STBITERR | 有些数据线没有检测到起始位(宽总线模式) | 0x00000200 | 错误类 |
10 | SDIO_FLAG_DBCKEND | 传输数据块结束,且CRC验证成功 | 0x00000400 | |
11 | SDIO_FLAG_CMDACT | 正在传输命令 | 0x00000800 | 传输进行中 |
12 | SDIO_FLAG_TXACT | 正在传输数据 | 0x00001000 | |
13 | SDIO_FLAG_RXACT | 正在接受数据 | 0x00002000 | |
14 | SDIO_FLAG_TXFIFOHE | 发送FIFO半空(FIFO至少还有8个字的空间) | 0x00004000 | FIFO状态 |
15 | SDIO_FLAG_RXFIFOHF | 接收FIFO半满(FIFO至少已有8个字的存在) | 0x00008000 | |
16 | SDIO_FLAG_TXFIFOF | 发送FIFO满 | 0x00010000 | |
17 | SDIO_FLAG_RXFIFOF | 接受FIFO满(硬件流控制:差2个字节->有效) | 0x00020000 | |
18 | SDIO_FLAG_TXFIFOE | 发送FIFO空(硬件流控制:仅2个字节->有效) | 0x00040000 | |
19 | SDIO_FLAG_RXFIFOE | 接收FIFO空 | 0x00080000 | |
20 | SDIO_FLAG_TXDAVL | 在发送FIFO中的数据可用 | 0x00100000 | 数据状况 |
21 | SDIO_FLAG_RXDAVL | 在接收FIFO中的数据可用 | 0x00200000 | |
22 | SDIO_FLAG_SDIOIT | 收到SDIO中断 | 0x00400000 | |
23 | SDIO_FLAG_CEATAEND | 收到 CE-ATA命令 完成信号(For CMD61) | 0x00800000 | |
函数原型如下:
FlagStatus SDIO_GetFlagStatus(u32 SDIO_FLAG)
{
}
函数输入参数SDIO_FLAG的值可以参考“【27】SDIO_GetFlagStatus”的取值,因为SDIO->ICR各位于SDIO->STA各位一一对应。
下表给出了可以被清除SDIO_FLAG取值。
Bit | 参数SDIO_FLAG值 | 意义/SDIO->ICR.bit0-10 + bit22-23 | #define | 备注 |
0 | SDIO_FLAG_CCRCFAIL | 收到命令响应,但CRC验证失败 | 0x00000001 | 错误类 |
1 | SDIO_FLAG_DCRCFAIL | 传输数据响应,但CRC验证失败(发送/接收) | 0x00000002 | |
2 | SDIO_FLAG_CTIMEOUT | 命令响应超时 | 0x00000004 | |
3 | SDIO_FLAG_DTIMEOUT | 数据传输超时 | 0x00000008 | |
4 | SDIO_FLAG_TXUNDERR | 发送FIFO数据下溢错误 | 0x00000010 | |
5 | SDIO_FLAG_RXOVERR | 接收FIFO数据上溢错误 | 0x00000020 | |
6 | SDIO_FLAG_CMDREND | 已收到命令响应,且CRC验证成功 | 0x00000040 | |
7 | SDIO_FLAG_CMDSENT | 命令已发送响应(但不需要CRC验证) | 0x00000080 | |
8 | SDIO_FLAG_DATAEND | 数据发送结束(SDIO->DCOUNT = 0) | 0x00000100 | |
9 | SDIO_FLAG_STBITERR | 有些数据线没有检测到起始位(宽总线模式) | 0x00000200 | 错误类 |
10 | SDIO_FLAG_DBCKEND | 传输数据块结束,且CRC验证成功 | 0x00000400 | |
11 | 不可清除状态位,在寄存器内表现为:该位段的数值,寄存器位“保留”状态 | 正在传输命令 | 0x00000800 | 保留 不可用 |
12 | 正在传输数据 | 0x00001000 | ||
13 | 正在接受数据 | 0x00002000 | ||
14 | 发送FIFO半空(FIFO至少还有8个字的空间) | 0x00004000 | ||
15 | 接收FIFO半满(FIFO至少已有8个字的存在) | 0x00008000 | ||
16 | 发送FIFO满 | 0x00010000 | ||
17 | 接受FIFO满(硬件流控制:差2个字节->有效) | 0x00020000 | ||
18 | 发送FIFO空(硬件流控制:仅2个字节->有效) | 0x00040000 | ||
19 | 接收FIFO空 | 0x00080000 | ||
20 | 在发送FIFO中的数据可用 | 0x00100000 | ||
21 | 在接收FIFO中的数据可用 | 0x00200000 | ||
22 | SDIO_FLAG_SDIOIT | 收到SDIO中断 | 0x00400000 | |
23 | SDIO_FLAG_CEATAEND | 收到 CE-ATA命令 完成信号(For CMD61) | 0x00800000 | |
函数原型如下:
void SDIO_ClearFlag(u32 SDIO_FLAG)
{
}
本函数“【29】SDIO_GetITStatus”与“【27】SDIO_GetFlagStatus” 的本质意义是一样的:寄存器操作完全一样、操作值也完全一样。只不过名字换了一下。
Bit | 参数SDIO_IT取值 | 意义/SDIO->MASK | #define | 备注 |
0 | SDIO_IT_CCRCFAIL | 收到命令响应,但CRC验证失败 | 0x00000001 | 错误类 |
1 | SDIO_IT_DCRCFAIL | 传输数据响应,但CRC验证失败(发送/接收) | 0x00000002 | |
2 | SDIO_IT_CTIMEOUT | 命令响应超时 | 0x00000004 | |
3 | SDIO_IT_DTIMEOUT | 数据传输超时 | 0x00000008 | |
4 | SDIO_IT_TXUNDERR | 发送FIFO数据下溢错误 | 0x00000010 | |
5 | SDIO_IT_RXOVERR | 接收FIFO数据上溢错误 | 0x00000020 | |
6 | SDIO_IT_CMDREND | 已收到命令响应,且CRC验证成功 | 0x00000040 | |
7 | SDIO_IT_CMDSENT | 命令已发送响应(但不需要CRC验证) | 0x00000080 | |
8 | SDIO_IT_DATAEND | 数据发送结束(SDIO->DCOUNT = 0) | 0x00000100 | |
9 | SDIO_IT_STBITERR | 有些数据线没有检测到起始位(宽总线模式) | 0x00000200 | 错误类 |
10 | SDIO_IT_DBCKEND | 传输数据块结束,且CRC验证成功 | 0x00000400 | |
11 | SDIO_IT_CMDACT | 正在传输命令 | 0x00000800 | 传输进行中 |
12 | SDIO_IT_TXACT | 正在传输数据 | 0x00001000 | |
13 | SDIO_IT_RXACT | 正在接受数据 | 0x00002000 | |
14 | SDIO_IT_TXFIFOHE | 发送FIFO半空(FIFO至少还有8个字的空间) | 0x00004000 | FIFO状态 |
15 | SDIO_IT_RXFIFOHF | 接收FIFO半满(FIFO至少已有8个字的存在) | 0x00008000 | |
16 | SDIO_IT_TXFIFOF | 发送FIFO满 | 0x00010000 | |
17 | SDIO_IT_RXFIFOF | 接受FIFO满(硬件流控制:差2个字节->有效) | 0x00020000 | |
18 | SDIO_IT_TXFIFOE | 发送FIFO空(硬件流控制:仅2个字节->有效) | 0x00040000 | |
19 | SDIO_IT_RXFIFOE | 接收FIFO空 | 0x00080000 | |
20 | SDIO_IT_TXDAVL | 在发送FIFO中的数据可用 | 0x00100000 | 数据状况 |
21 | SDIO_IT_RXDAVL | 在接收FIFO中的数据可用 | 0x00200000 | |
22 | SDIO_IT_SDIOIT | 收到SDIO中断 | 0x00400000 | |
23 | SDIO_IT_CEATAEND | 收到 CE-ATA命令 完成信号(For CMD61) | 0x00800000 | |
函数原型如下:
ITStatus SDIO_GetITStatus(u32 SDIO_IT)
{
}
本函数“【30】SDIO_ClearITPendingBit”与函数“【28】SDIO_ClearFlag”的本质意义是完全一样的,而且操作参数也完全一样。
Bit | 参数SDIO_IT取值 | 意义/SDIO->ICR | #define | 备注 |
0 | SDIO_IT_CCRCFAIL | 收到命令响应,但CRC验证失败 | 0x00000001 | 错误类 |
1 | SDIO_IT_DCRCFAIL | 传输数据响应,但CRC验证失败(发送/接收) | 0x00000002 | |
2 | SDIO_IT_CTIMEOUT | 命令响应超时 | 0x00000004 | |
3 | SDIO_IT_DTIMEOUT | 数据传输超时 | 0x00000008 | |
4 | SDIO_IT_TXUNDERR | 发送FIFO数据下溢错误 | 0x00000010 | |
5 | SDIO_IT_RXOVERR | 接收FIFO数据上溢错误 | 0x00000020 | |
6 | SDIO_IT_CMDREND | 已收到命令响应,且CRC验证成功 | 0x00000040 | |
7 | SDIO_IT_CMDSENT | 命令已发送响应(但不需要CRC验证) | 0x00000080 | |
8 | SDIO_IT_DATAEND | 数据发送结束(SDIO->DCOUNT = 0) | 0x00000100 | |
9 | SDIO_IT_STBITERR | 有些数据线没有检测到起始位(宽总线模式) | 0x00000200 | 错误类 |
10 | SDIO_IT_DBCKEND | 传输数据块结束,且CRC验证成功 | 0x00000400 | |
11 | 不可清除状态位,在寄存器内表现为:该位段的数值,寄存器位“保留”状态 | 正在传输命令 | 0x00000800 | 保留 不可用 |
12 | 正在传输数据 | 0x00001000 | ||
13 | 正在接受数据 | 0x00002000 | ||
14 | 发送FIFO半空(FIFO至少还有8个字的空间) | 0x00004000 | ||
15 | 接收FIFO半满(FIFO至少已有8个字的存在) | 0x00008000 | ||
16 | 发送FIFO满 | 0x00010000 | ||
17 | 接受FIFO满(硬件流控制:差2个字节->有效) | 0x00020000 | ||
18 | 发送FIFO空(硬件流控制:仅2个字节->有效) | 0x00040000 | ||
19 | 接收FIFO空 | 0x00080000 | ||
20 | 在发送FIFO中的数据可用 | 0x00100000 | ||
21 | 在接收FIFO中的数据可用 | 0x00200000 | ||
22 | SDIO_IT_SDIOIT | 收到SDIO中断 | 0x00400000 | |
23 | SDIO_IT_CEATAEND | 收到 CE-ATA命令 完成信号(For CMD61) | 0x00800000 | |
函数原型如下:
void SDIO_ClearITPendingBit(u32 SDIO_IT)
{
}