SDIO
简介
安全的数字输入/输出接口(SDIO)定义了SD 卡、SD I/O 卡、多媒体卡(MMC)和CE-ATA卡主机接口,提供APB2 系统总线与SD 存储卡、SD I/O 卡、MMC 和CE-ATA 设备之间的数据传输。
所支持的SD 存储卡和SD I/O 卡系统规格书可以通过SD 卡协会网站(www.sdcard.org)获取。
所支持的多媒体卡(MMC)系统规格书可以通过多媒体卡协会网站(www.jedec.org)获取,由JEDEC 固态技术协会出版。
所支持的CE-ATA 系统规格书可以通过CE-ATA 工作组网站(www.ce-ata.org)获取。
主要特性

SDIO总线拓补
SD卡使用9-pin接口通信,其中3根电源线、1根时钟线、1根命令线和4根数据线,具体说明如下:
- CLK:时钟线,由SDIO主机产生,即由STM32控制器输出;
- CMD:命令控制线,SDIO主机通过该线发送命令控制SD卡,如果命令要求SD卡提供应答(响应),SD卡也是通过该线传输应答信息;
- D0-3:数据线,传输读写数据;SD卡可将D0拉低表示忙状态;
- VDD、VSS1、VSS2:电源和地信号。
在之前的I2C以及SPI章节都有详细讲解了对应的通信时序,实际上,SDIO的通信时序简单许多,SDIO不管是从主机控制器 向SD卡传输,还是SD卡向主机控制器传输都只以CLK时钟线的上升沿为有效。SD卡操作过程会使用两种不同频率 的时钟同步数据,一个是识别卡阶段时钟频率FOD,最高为400kHz,另外一个是数据传输模式下时钟频率FPP,默认最高 为25MHz,如果通过相关寄存器配置使SDIO工作在高速模式,此时数据传输模式最高频率为50MHz。
总线上的基本操作是命令/响应操作(参考图24-1. SDIO “无响应” 和 “无数据” 操作)。这种类型的总线事务直接在命令或响应结构中传递它们的信息。此外,有些操作还有数据令牌。卡与设备之间的数据传输通过块完成。

多块操作模式比单块操作速度更快。当CMD 信号线上出现停止命令时,多块传输终止。主机数据传输可以使用单个或多个数据线。多个块的读操作如图24-2. SDIO 多块读操作所示,多个块的写操作如图24-3. SDIO 多块写操作所示。块的写操作在数据(DAT0)信号线上使用忙信号。CE-ATA 设备在准备接收数据之前有一个可选的忙信号。


SD 存储卡、SD I/O 卡(包括仅IO 卡和组合卡)和CE-ATA 设备直接的数据传输是以数据块的方式完成的。MMC 卡以数据块或数据流方式进行数据传输。图24-4. SDIO 数据流读操作和图24-5. SDIO 数据流写操作分别是数据流的读和写操作。

卡命令类
| 命令 | 类描述 | basic | Stream read | Block read | Stream write | Block write | erase | write protection | Lock card | application specific | I/O mode | switch | reserved |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CMD0 | M | + | |||||||||||
| CMD1 | M | + | |||||||||||
| CMD2 | M | + | |||||||||||
| CMD3 | M | + | |||||||||||
| CMD4 | M | + | |||||||||||
| CMD5 | O | + | |||||||||||
| CMD6 | M | + | |||||||||||
| CMD7 | M | + | |||||||||||
| CMD8 | M | + | |||||||||||
| CMD9 | M | + | |||||||||||
| CMD10 | M | + | |||||||||||
| CMD11 | M | + | |||||||||||
| CMD13 | M | + | |||||||||||
| CMD14 | M | + | |||||||||||
| CMD15 | M | + | |||||||||||
| CMD16 | M | + | + | + | |||||||||
| CMD17 | M | + | |||||||||||
| CMD18 | M | + | |||||||||||
| CMD19 | M | + | |||||||||||
| CMD20 | M | + | |||||||||||
| CMD23 | M | + | + | ||||||||||
| CMD24 | M | + | |||||||||||
| CMD25 | M | + | |||||||||||
| CMD26 | M | + | |||||||||||
| CMD27 | M | + | |||||||||||
| CMD28 | M | + | |||||||||||
| CMD29 | M | + | |||||||||||
| CMD30 | M | + | |||||||||||
| CMD32 | M | + | |||||||||||
| CMD33 | M | + | |||||||||||
| CMD34 | O | + | |||||||||||
| CMD36 | O | + | |||||||||||
| CMD37 | O | + | |||||||||||
| CMD38 | M | + | |||||||||||
| CMD39 | M | + | |||||||||||
| CMD40 | M | + | |||||||||||
| CMD42 | M | + | |||||||||||
| CMD50 | O | + | |||||||||||
| CMD52 | O | + | |||||||||||
| CMD53 | O | + | |||||||||||
| CMD55 | M | + | |||||||||||
| CMD57 | O | + | |||||||||||
| CMD60 | M | + | |||||||||||
| CMD61 | M | + | |||||||||||
| ACMD6 | M | + | |||||||||||
| ACMD13 | M | + | |||||||||||
| ACMD22 | M | + | |||||||||||
| ACMD23 | M | + | |||||||||||
| ACMD41 | M | + | |||||||||||
| ACMD42 | M | + | |||||||||||
| ACMD51 | M | + |
注意:
- CMD1、CMD11、CMD14、CMD19、CMD20、CMD23、CMD26、CMD39 和 CMD40 仅用于 MMC 卡。
- CMD5、CMD32-34、CMD50、CMD52、CMD53、CMD57 和 ACMDx 仅用于 SD 存储卡。
- CMD60、CMD61 仅用于 CE-ATA 设备。
SD卡主要寄存器
SD卡内部包含多个寄存器,主机可以通过这些寄存器读取卡的状态、特性或控制卡的行为。常用的寄存器如下表所示:
| 寄存器 | 宽度 (bits) | 描述 | 说明 |
|---|---|---|---|
| CID (Card Identification) | 128 | 卡识别寄存器 | 包含卡的唯一标识号,如制造商ID、产品名称、序列号、生产日期等。在卡识别阶段读取(CMD2/CMD10)。 |
| RCA (Relative Card Address) | 16 | 相对卡地址寄存器 | 包含卡在初始化过程中由卡发布的本地系统地址。主机使用该地址寻址卡(CMD3)。 |
| CSD (Card Specific Data) | 128 | 卡特定数据寄存器 | 包含卡的具体操作条件信息,如容量、最大读写电流、最大时钟频率、块长度等(CMD9)。 |
| SCR (SD Configuration) | 64 | SD配置寄存器 | 包含SD卡的特殊功能信息,如支持的数据宽度(1位/4位)、SD版本规范等(ACMD51)。 |
| OCR (Operation Condition) | 32 | 操作条件寄存器 | 保存卡的电压支持范围和供电状态位。上电时主机需读取此寄存器确认电压匹配(CMD1)。 |
| SSR (SD Status) | 512 | SD状态寄存器 | 包含卡的专有特性信息,如速度等级、分配单元大小等(ACMD13)。 |
| CSR (Card Status) | 32 | 卡状态寄存器 | 包含卡当前的状态信息(传输中、编程中、错误等),作为命令的响应返回(CMD13)。 |
SDIO 响应格式
SDIO 定义了多种响应格式(Response),不同的命令会触发不同类型的响应。常见的响应类型如下:
- R1: 32位。包含卡状态(Card Status)。大多数读写命令和状态查询命令都使用此响应。
- R1b: 与 R1 格式相同,但 SD 卡会在
DATA0线上传输忙信号(Busy),直到操作完成。 - R2: 136位。用于返回 CID 或 CSD 寄存器的全部内容。CMD2, CMD9, CMD10 使用此响应。
- R3: 32位。用于返回 OCR 寄存器的内容。CMD58 或 ACMD41 使用此响应。
- R6: 32位。SD 卡发布其相对地址 (RCA)。CMD3 使用此响应。
- R7: 32位。包含电压范围和校验模式。仅 CMD8 使用。
SD 卡初始化流程详解
SD 卡的上电初始化是一个标准且严格的过程,必须按照特定顺序发送命令。
- 上电与时钟配置:
- 主机将时钟设置为 < 400kHz。
- 发送至少 74 个时钟周期,确保 SD 卡完成内部复位。
- 复位 (CMD0):
- 发送 CMD0,使卡进入空闲状态 (Idle State)。
- 接口条件检测 (CMD8):
- 仅 SD 2.0 及以上版本支持。发送 CMD8 检查电压范围和物理连接。如果卡有响应,说明是 V2.0 卡;无响应可能是 V1.x 或 MMC 卡。
- 初始化与电压确认 (ACMD41):
- 循环发送 ACMD41(注意:发送 ACMD 之前必须先发送 CMD55)。
- 在参数中设置主机支持的电压窗口(HCS 位设置是否支持高容量卡 SDHC/SDXC)。
- 检查响应中的忙信号位,直到卡准备就绪 (Busy位为1)。
- 读取唯一标识 (CMD2):
- 发送 CMD2,获取 CID 寄存器内容(136位)。
- 获取相对地址 (CMD3):
- 发送 CMD3,让卡发布一个新的相对地址 (RCA)。主机后续使用此 RCA 寻址该卡。
- 读取卡参数 (CMD9):
- 使用 RCA 发送 CMD9,获取 CSD 寄存器,从而计算卡容量、最大速率等信息。
- 选中卡 (CMD7):
- 使用 RCA 发送 CMD7,选中该卡,使其进入传输状态 (Transfer State)。
- 配置总线宽度 (ACMD6):
- 发送 ACMD6,将总线宽度从默认的 1-bit 切换为 4-bit(前提是硬件支持且已初始化 GPIO)。
- 提速:
- 将 SDIO 时钟频率提高到 25MHz (或 50MHz),进入高速传输模式。
开发实战
GD32F470 标准库提供了完善的 SDIO 驱动函数,位于 gd32f4xx_sdio.c 和 gd32f4xx_sdio.h 中。开发 SDIO 通常涉及 GPIO 配置、SDIO 参数初始化、命令发送、数据传输以及 DMA 配置。
1. 硬件引脚配置
SDIO 信号线通常复用在 PC8-PC12 和 PD2 上。需要配置为复用推挽输出(由 SDIO 控制器驱动)。
| SDIO信号 | GPIO引脚 | 描述 |
|---|---|---|
| SDIO_D0 | PC8 | 数据线 0 |
| SDIO_D1 | PC9 | 数据线 1 |
| SDIO_D2 | PC10 | 数据线 2 |
| SDIO_D3 | PC11 | 数据线 3 |
| SDIO_CK | PC12 | 时钟线 |
| SDIO_CMD | PD2 | 命令线 |
1 | |
2. SDIO 初始化
初始化主要配置时钟分频、总线宽度、时钟边缘等。
关键结构体 sdio_parameter_struct:
sdio_clock_edge: 时钟沿选择(SDIO_CLOCK_EDGE_RISING/FALLING)。sdio_clock_bypass: 是否旁路时钟分频器(通常不旁路)。sdio_clock_power_save: 省电模式,总线空闲时关闭时钟。sdio_bus_mode: 总线位宽(1位/4位/8位)。初始化时通常先用1位宽,卡识别完成后再切换为4位宽。sdio_hardware_flow_control: 硬件流控,防止 FIFO 溢出。sdio_clock_divider: 时钟分频系数。$SDIO_CK = SDIO_CLK / (分频系数 + 2)$。- 初始化频率不能超过 400kHz。
- 数据传输频率可达 25MHz 或 50MHz。
1 | |
3. 命令发送与响应
SDIO 通信的核心是命令-响应机制。
1 | |
4. 数据传输配置
在读写数据块时,需要告诉 SDIO 控制器数据的长度、块大小和传输方向。这通常配合 DMA 使用,但也支持轮询或中断。
1 | |
实战流程:读取 SD 卡扇区示例
SD 卡的初始化流程非常复杂(CMD0 -> CMD8 -> ACMD41 -> CMD2 -> CMD3 -> …)。通常我们会移植现成的 SD 卡驱动(如 GD32 官方示例中的 sd_card.c)。这里展示一个基于库函数的、简化后的单块读取函数的核心逻辑。
1 | |
SDIO库函数
| 库函数名称 | 库函数描述 |
|---|---|
| sdio_deinit | 复位 SDIO |
| sdio_clock_config | 配置 SDIO 时钟 |
| sdio_hardware_clock_enable | 使能硬件时钟控制 |
| sdio_hardware_clock_disable | 禁能硬件时钟控制 |
| sdio_bus_mode_set | 设置多种 SDIO 卡总线模式 |
| sdio_power_state_set | 设置 SDIO 电源状态 |
| sdio_power_state_get | 获取 SDIO 电源状态 |
| sdio_clock_enable | 使能 SDIO_CLK 时钟 |
| sdio_clock_disable | 禁能 SDIO_CLK 时钟 |
| sdio_command_response_config | 配置命令和响应 |
| sdio_wait_type_set | 设置命令状态机等待类型 |
| sdio_csm_enable | 使能命令状态机 |
| sdio_csm_disable | 禁能命令状态机 |
| sdio_command_index_get | 获取上一次响应的命令索引 |
| sdio_response_get | 获取上一次响应的接收命令 |
| sdio_data_config | 配置数据超时、数据长度和数据块大小 |
| sdio_data_transfer_config | 配置数据传输模式和方向 |
| sdio_dsm_enable | 使能数据传输的数据状态机 |
| sdio_dsm_disable | 禁能数据传输的数据状态机 |
| sdio_data_write | 在发送 FIFO 里写入数据(一个字) |
| sdio_data_read | 在接收 FIFO 里读取数据(一个字) |
| sdio_data_counter_get | 获取要传输到卡的剩余数据字节的数目 |
| sdio_fifo_counter_get | 从 FIFO 中获取要写入或读取的字数 |
| sdio_dma_enable | 使能 SDIO 的 DMA 请求 |
| sdio_dma_disable | 禁能 SDIO 的 DMA 请求 |
| sdio_flag_get | 获取 SDIO 的标志位状态 |
| sdio_flag_clear | 清除 SDIO 的标志位状态 |
| sdio_interrupt_enable | 使能 SDIO 中断 |
| sdio_interrupt_disable | 禁能 SDIO 中断 |
| sdio_interrupt_flag_get | 获取 SDIO 的中断标志位状态 |
| sdio_interrupt_flag_clear | 清除 SDIO 的中断标志位状态 |
| sdio_readwait_enable | 使能读等待模式(仅限 SD I/O 模式) |
| sdio_readwait_disable | 禁能读等待模式(仅限 SD I/O 模式) |
| sdio_stop_readwait_enable | 使能停止读等待过程的功能(仅限 SD I/O 模式) |
| sdio_stop_readwait_disable | 禁能停止读等待过程的功能(仅限 SD I/O 模式) |
| sdio_readwait_type_set | 设置读等待类型(仅限 SD I/O 模式) |
| sdio_operation_enable | 使能 SD I/O 模式特定操作(仅限 SD I/O 模式) |
| sdio_operation_disable | 禁能 SD I/O 模式特定操作(仅限 SD I/O 模式) |
| sdio_suspend_enable | 使能 SD I/O 暂停模式(仅限 SD I/O 模式) |
| sdio_suspend_disable | 禁能 SD I/O 暂停模式(仅限 SD I/O 模式) |
| sdio_ceata_command_enable | 使能 CE-ATA 命令 (仅限 CE-ATA 模式) |
| sdio_ceata_command_disable | 禁能 CE-ATA 命令 (仅限 CE-ATA 模式) |
| sdio_ceata_interrupt_enable | 使能 CE-ATA 中断 (仅限 CE-ATA 模式) |
| sdio_ceata_interrupt_disable | 禁能 CE-ATA 中断 (仅限 CE-ATA 模式) |
| sdio_ceata_command_completion_enable | 使能 CE-ATA 命令完成信号 (仅限 CE-ATA 模式) |
| sdio_ceata_command_completion_disable | 禁能 CE-ATA 命令完成信号 (仅限 CE-ATA 模式) |
1. 函数 sdio_deinit
- 函数名称:
sdio_deinit - 函数原型:
void sdio_deinit(void); - 功能描述:复位SDIO外设。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* deinitialize the SDIO */
sdio_deinit();
2. 函数 sdio_clock_config
- 函数名称:
sdio_clock_config - 函数原型:
void sdio_clock_config(uint32_t clock_edge, uint32_t clock_bypass, uint32_t clock_powersave, uint32_t clock_division); - 功能描述:配置SDIO时钟。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
clock_edge:SDIO_CLK时钟边沿选择SDIO_SDIOCLKEDGE_RISING:选择SDIO_CLK的上升沿产生SDIO_CKSDIO_SDIOCLKEDGE_FALLING:选择SDIO_CLK的下降沿产生SDIO_CK
clock_bypass:旁路边时钟使能SDIO_CLOCKBYPASS_ENABLE:使能旁路时钟SDIO_CLOCKBYPASS_DISABLE:失能旁路时钟
clock_powersave:SDIO_CLK时钟动态开启/关闭以节省功耗SDIO_CLOCKPWR_SAVE_ENABLE:SDIO_CLK时钟在总线空闲时关闭SDIO_CLOCKPWR_SAVE_DISABLE:SDIO_CLK时钟总是开启
clock_division:时钟分频,小于512
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* configure the SDIO clock */
sdio_clock_config(SDIO_SDIOCLKEDGE_RISING, SDIO_CLOCKBYPASS_DISABLE, SDIO_CLOCKPWR_SAVE_DISABLE, SD_CLK_DIV_TRANS);
3. 函数 sdio_hardware_clock_enable
- 函数名称:
sdio_hardware_clock_enable - 函数原型:
void sdio_hardware_clock_enable(void); - 功能描述:使能硬件时钟控制。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* enable hardware clock control */
sdio_hardware_clock_enable();
4. 函数 sdio_hardware_clock_disable
- 函数名称:
sdio_hardware_clock_disable - 函数原型:
void sdio_hardware_clock_disable(void); - 功能描述:禁能硬件时钟控制。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* disable hardware clock control */
sdio_hardware_clock_disable();
5. 函数 sdio_bus_mode_set
- 函数名称:
sdio_bus_mode_set - 函数原型:
void sdio_bus_mode_set(uint32_t bus_mode); - 功能描述:设置SDIO总线模式。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
bus_mode:SDIO总线模式SDIO_BUSMODE_1BIT:1位SDIO总线模式SDIO_BUSMODE_4BIT:4位SDIO总线模式SDIO_BUSMODE_8BIT:8位SDIO总线模式
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* set SDIO bus mode */
sdio_bus_mode_set(SDIO_BUSMODE_1BIT);
6. 函数 sdio_power_state_set
- 函数名称:
sdio_power_state_set - 函数原型:
void sdio_power_state_set(uint32_t power_state); - 功能描述:设置SDIO电源状态。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
power_state:SDIO电源状态SDIO_POWER_ON:SDIO上电SDIO_POWER_OFF:SDIO下电
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* set SDIO power state */
sdio_power_state_set(SDIO_POWER_ON);
7. 函数 sdio_power_state_get
- 函数名称:
sdio_power_state_get - 函数原型:
uint32_t sdio_power_state_get(void); - 功能描述:获取SDIO电源状态。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:
SDIO_POWER_ON/SDIO_POWER_OFF
- 示例:
1
2/* get the SDIO power state */
uint32_t power_value = sdio_power_state_get();
8. 函数 sdio_clock_enable
- 函数名称:
sdio_clock_enable - 函数原型:
void sdio_clock_enable(void); - 功能描述:使能SDIO_CLK时钟。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* enable SDIO_CLK clock output */
sdio_clock_enable();
9. 函数 sdio_clock_disable
- 函数名称:
sdio_clock_disable - 函数原型:
void sdio_clock_disable(void); - 功能描述:禁能SDIO_CLK时钟。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* disable SDIO_CLK clock output */
sdio_clock_disable();
10. 函数 sdio_command_response_config
- 函数名称:
sdio_command_response_config - 函数原型:
void sdio_command_response_config(uint32_t cmd_index, uint32_t cmd_argument, uint32_t response_type); - 功能描述:配置命令和响应。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
cmd_index:命令索引cmd_argument:命令参数response_type:响应类型SDIO_RESPONSE_NO:无响应SDIO_RESPONSE_SHORT:短响应SDIO_RESPONSE_LONG:长响应
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
sdio_command_response_config(CMD_ALL_SEND_CID, (uint32_t)0x00, SDIO_RESPONSE_LONG);
11. 函数 sdio_wait_type_set
- 函数名称:
sdio_wait_type_set - 函数原型:
void sdio_wait_type_set(uint32_t wait_type); - 功能描述:设置等待类型。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
wait_type:等待类型SDIO_WAITTYPE_NO:不等待中断SDIO_WAITTYPE_INTERRUPT:等待中断SDIO_WAITTYPE_TRANSFER:等待数据传输结束
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* set the command wait type */
sdio_wait_type_set(SDIO_WAITTYPE_NO);
12. 函数 sdio_csm_enable
- 函数名称:
sdio_csm_enable - 函数原型:
void sdio_csm_enable(void); - 功能描述:使能命令状态机。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* enable the CSM (command state machine) */
sdio_csm_enable();
13. 函数 sdio_csm_disable
- 函数名称:
sdio_csm_disable - 函数原型:
void sdio_csm_disable(void); - 功能描述:禁能命令状态机。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* disable the CSM (command state machine) */
sdio_csm_disable();
14. 函数 sdio_command_index_get
- 函数名称:
sdio_command_index_get - 函数原型:
uint8_t sdio_command_index_get(void); - 功能描述:获取命令索引。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:命令索引
- 示例:
1
uint8_t cmd_index = sdio_command_index_get();
15. 函数 sdio_suspend_disable
- 函数名称:
sdio_suspend_disable - 函数原型:
void sdio_suspend_disable(void); - 功能描述:禁能SD I/O休眠模式(仅限SD I/O模式)。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* disable the SD I/O suspend operation(SD I/O only) */
sdio_suspend_disable();
16. 函数 sdio_ceata_command_enable
- 函数名称:
sdio_ceata_command_enable - 函数原型:
void sdio_ceata_command_enable(void); - 功能描述:使能CE-ATA命令(仅限CE-ATA模式)。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* enable the CE-ATA command(CE-ATA only) */
sdio_ceata_command_enable();
17. 函数 sdio_ceata_command_disable
- 函数名称:
sdio_ceata_command_disable - 函数原型:
void sdio_ceata_command_disable(void); - 功能描述:禁能CE-ATA命令(仅限CE-ATA模式)。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* disable the CE-ATA command(CE-ATA only) */
sdio_ceata_command_disable();
18. 函数 sdio_ceata_interrupt_enable
- 函数名称:
sdio_ceata_interrupt_enable - 函数原型:
void sdio_ceata_interrupt_enable(void); - 功能描述:使能CE-ATA中断(仅限CE-ATA模式)。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* enable the CE-ATA interrupt(CE-ATA only) */
sdio_ceata_interrupt_enable();
19. 函数 sdio_ceata_interrupt_disable
- 函数名称:
sdio_ceata_interrupt_disable - 函数原型:
void sdio_ceata_interrupt_disable(void); - 功能描述:禁能CE-ATA中断(仅限CE-ATA模式)。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* disable the CE-ATA interrupt(CE-ATA only) */
sdio_ceata_interrupt_disable();
20. 函数 sdio_ceata_command_completion_enable
- 函数名称:
sdio_ceata_command_completion_enable - 函数原型:
void sdio_ceata_command_completion_enable(void); - 功能描述:使能CE-ATA命令完成信号(仅限CE-ATA模式)。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* enable the CE-ATA command completion signal(CE-ATA only) */
sdio_ceata_command_completion_enable();
21. 函数 sdio_ceata_command_completion_disable
- 函数名称:
sdio_ceata_command_completion_disable - 函数原型:
void sdio_ceata_command_completion_disable(void); - 功能描述:禁能CE-ATA命令完成信号(仅限CE-ATA模式)。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* disable the CE-ATA command completion signal(CE-ATA only) */
sdio_ceata_command_completion_disable();
22. 函数 sdio_interrupt_enable
- 函数名称:
sdio_interrupt_enable - 函数原型:
void sdio_interrupt_enable(uint32_t int_flag); - 功能描述:使能SDIO中断。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
int_flag:SDIO中断标志位状态,可组合使用:SDIO_INT_CCRCERR:命令响应CRC错误中断SDIO_INT_DCRCERR:数据CRC错误中断SDIO_INT_CMDTIMEOUT:命令响应超时中断SDIO_INT_DTTMO:数据超时中断SDIO_INT_TXFIFOERR:发送FIFO下溢错误中断SDIO_INT_RXFIFOERR:接收FIFO上溢错误中断SDIO_INT_CMDRECV:命令响应已接收中断SDIO_INT_CMDSEND:命令已发送中断SDIO_INT_DTEND:数据结束中断SDIO_INT_STBITE:起始位错误中断SDIO_INT_DTBLKE:数据块已发送/已接收中断SDIO_INT_CMDRUN:正在传输命令中断SDIO_INT_TXRUN:正在传输数据中断SDIO_INT_RXRUN:正在接收数据中断SDIO_INT_TFHF:发送FIFO半满中断SDIO_INT_RFHF:接收FIFO半满中断SDIO_INT_TFNE:发送FIFO空中断SDIO_INT_RFNE:接收FIFO空中断SDIO_INT_TXDAVL:发送FIFO中的数据有效中断SDIO_INT_RXDAVL:接收FIFO中的数据有效中断SDIO_INT_SDIOIN:SD I/O中断已接收中断SDIO_INT_ATAEN:CE-ATA命令完成信号已接收中断
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* enable the SDIO corresponding interrupts */
sdio_interrupt_enable(SDIO_INT_DTEND | SDIO_INT_STBITE | SDIO_INT_TFHF | SDIO_INT_TXFIFOERR | SDIO_INT_DCRCERR);
23. 函数 sdio_interrupt_disable
- 函数名称:
sdio_interrupt_disable - 函数原型:
void sdio_interrupt_disable(uint32_t int_flag); - 功能描述:禁能SDIO中断。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
int_flag:SDIO中断标志位状态,可组合使用(同sdio_interrupt_enable)
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* disable the SDIO interrupt */
sdio_interrupt_disable(SDIO_INT_DCRCERR);
24. 函数 sdio_interrupt_flag_get
- 函数名称:
sdio_interrupt_flag_get - 函数原型:
FlagStatus sdio_interrupt_flag_get(uint32_t int_flag); - 功能描述:获取SDIO的中断标志位状态。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
int_flag:SDIO中断标志位状态(同sdio_interrupt_enable)
- **输出参数(out)**:无
- 返回值:
SET或RESET - 示例:
1
2/* get the interrupt flag state of SDIO */
FlagStatus flag_status = sdio_interrupt_flag_get(SDIO_INT_DTEND);
25. 函数 sdio_interrupt_flag_clear
- 函数名称:
sdio_interrupt_flag_clear - 函数原型:
void sdio_interrupt_flag_clear(uint32_t int_flag); - 功能描述:清除SDIO的中断标志位状态。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
int_flag:SDIO中断标志位状态(同sdio_interrupt_enable)
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* clear the interrupt flag state of SDIO */
sdio_interrupt_flag_clear(SDIO_INT_DTEND);
26. 函数 sdio_read_wait_enable
- 函数名称:
sdio_read_wait_enable - 函数原型:
void sdio_read_wait_enable(void); - 功能描述:使能读等待模式(仅限SD I/O模式)。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* enable read wait mode (SD I/O only) */
sdio_read_wait_enable();
27. 函数 sdio_read_wait_disable
- 函数名称:
sdio_read_wait_disable - 函数原型:
void sdio_read_wait_disable(void); - 功能描述:禁能读等待模式(仅限SD I/O模式)。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* disable read wait mode (SD I/O only) */
sdio_read_wait_disable();
28. 函数 sdio_stop_read_wait
- 函数名称:
sdio_stop_read_wait - 函数原型:
void sdio_stop_read_wait(void); - 功能描述:禁止停止读等待的功能(仅限SD I/O模式)。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* enable the function to halt the read wait process (SD I/O only) */
sdio_stop_read_wait();
29. 函数 sdio_read_wait_type_set
- 函数名称:
sdio_read_wait_type_set - 函数原型:
void sdio_read_wait_type_set(uint32_t read_wait_type); - 功能描述:设置读等待类型。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
read_wait_type:读等待类型SDIO_READWAITTYPE_FULL:通过FIFO满中断等待SDIO_READWAITTYPE_EMPTY:通过FIFO空中断等待
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* set the read wait type */
sdio_read_wait_type_set(SDIO_READWAITTYPE_FULL);
30. 函数 sdio_response_get
- 函数名称:
sdio_response_get - 函数原型:
uint32_t sdio_response_get(uint32_t resp_sex); - 功能描述:获取上一次响应的接收命令。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
resp_sex:SDIO响应SDIO_RESPONSE0:卡响应[31:0]SDIO_RESPONSE1:卡响应[63:32]SDIO_RESPONSE2:卡响应[95:64]SDIO_RESPONSE3:卡响应[127:96]
- **输出参数(out)**:无
- 返回值:上一次响应的接收命令
- 示例:
1
2
3
4
5/* get the SDIO response numbers */
uint32_t resp0 = sdio_response_get(SDIO_RESPONSE0);
uint32_t resp1 = sdio_response_get(SDIO_RESPONSE1);
uint32_t resp2 = sdio_response_get(SDIO_RESPONSE2);
uint32_t resp3 = sdio_response_get(SDIO_RESPONSE3);
31. 函数 sdio_data_config
- 函数名称:
sdio_data_config - 函数原型:
void sdio_data_config(uint32_t data_timeout, uint32_t data_length, uint32_t data_blocksize); - 功能描述:配置数据超时、数据长度和数据块大小。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
data_timeout:超时周期(数据超时周期)data_length:要传输的数据字节数data_blocksize:传输中数据块的大小SDIO_DATABLOCKSIZE_1BYTE:块大小 = 1字节SDIO_DATABLOCKSIZE_2BYTES:块大小 = 2字节SDIO_DATABLOCKSIZE_4BYTES:块大小 = 4字节SDIO_DATABLOCKSIZE_8BYTES:块大小 = 8字节SDIO_DATABLOCKSIZE_16BYTES:块大小 = 16字节SDIO_DATABLOCKSIZE_32BYTES:块大小 = 32字节SDIO_DATABLOCKSIZE_64BYTES:块大小 = 64字节SDIO_DATABLOCKSIZE_128BYTES:块大小 = 128字节SDIO_DATABLOCKSIZE_256BYTES:块大小 = 256字节SDIO_DATABLOCKSIZE_512BYTES:块大小 = 512字节SDIO_DATABLOCKSIZE_1024BYTES:块大小 = 1024字节SDIO_DATABLOCKSIZE_2048BYTES:块大小 = 2048字节SDIO_DATABLOCKSIZE_4096BYTES:块大小 = 4096字节SDIO_DATABLOCKSIZE_8192BYTES:块大小 = 8192字节SDIO_DATABLOCKSIZE_16384BYTES:块大小 = 16384字节
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* configure the SDIO data */
sdio_data_config(0, SDIO_DATABLOCKSIZE_1BYTE);
32. 函数 sdio_data_transfer_config
- 函数名称:
sdio_data_transfer_config - 函数原型:
void sdio_data_transfer_config(uint32_t transfer_mode, uint32_t transfer_direction); - 功能描述:配置数据传输模式和方向。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
transfer_mode:数据传输模式SDIO_BLOCKSMOD:块传输模式SDIO_STREAMMOD:流传输(SD I/O多字节传输模式)
transfer_direction:数据传输方向SDIO_TRANSDIRE_CARDTOIO:写数据到卡上(从卡中读取数据)SDIO_TRANSDIRE_IOTOCARD:从卡中读取数据(向卡发送数据)
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* configure the SDIO data transfer mode and direction */
sdio_data_transfer_config(SDIO_BLOCKSMOD, SDIO_TRANSDIRE_CARDTOIO);
33. 函数 sdio_dsm_enable
- 函数名称:
sdio_dsm_enable - 函数原型:
void sdio_dsm_enable(void); - 功能描述:使能数据传输的状态机。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* enable the DSM(data state machine) */
sdio_dsm_enable();
34. 函数 sdio_dsm_disable
- 函数名称:
sdio_dsm_disable - 函数原型:
void sdio_dsm_disable(void); - 功能描述:禁能数据传输的状态机。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* disable the DSM(data state machine) */
sdio_dsm_disable();
35. 函数 sdio_data_write
- 函数名称:
sdio_data_write - 函数原型:
void sdio_data_write(uint32_t data); - 功能描述:在发送FIFO里写入数据(一个字)。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
data:往下里写入32位数据
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* write data(one word) to the transmit FIFO */
sdio_data_write(0x00000001);
36. 函数 sdio_data_read
- 函数名称:
sdio_data_read - 函数原型:
uint32_t sdio_data_read(void); - 功能描述:在接收FIFO里提取数据(一个字)。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:接收的数据
- 示例:
1
2/* read data(one word) from the receive FIFO */
uint32_t data = sdio_data_read();
37. 函数 sdio_data_counter_get
- 函数名称:
sdio_data_counter_get - 函数原型:
uint32_t sdio_data_counter_get(void); - 功能描述:获取要传输到卡/从卡剩余数据字节的数目。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:要传输的剩余数据字节数
- 示例:
1
2/* get the number of remaining data bytes to be transferred to card */
uint32_t data_value = sdio_data_counter_get();
38. 函数 sdio_fifo_counter_get
- 函数名称:
sdio_fifo_counter_get - 函数原型:
uint32_t sdio_fifo_counter_get(void); - 功能描述:从FIFO中获取写入或读取的空字数。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:剩余字数
- 示例:
1
2/* get the number of words remaining to be written or read from FIFO */
uint32_t fifo_value = sdio_fifo_counter_get();
39. 函数 sdio_dma_enable
- 函数名称:
sdio_dma_enable - 函数原型:
void sdio_dma_enable(void); - 功能描述:使能SDIO的DMA请求。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* enable the SDIO DMA */
sdio_dma_enable();
40. 函数 sdio_dma_disable
- 函数名称:
sdio_dma_disable - 函数原型:
void sdio_dma_disable(void); - 功能描述:禁能SDIO的DMA请求。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:无
- **输出参数(out)**:无
- 返回值:无
- 示例:
1
2/* disable the SDIO DMA */
sdio_dma_disable();
41. 函数 sdio_flag_get
- 函数名称:
sdio_flag_get - 函数原型:
FlagStatus sdio_flag_get(uint32_t flag); - 功能描述:获取SDIO的标志位状态。
- 先决条件:无
- 被调用函数:无
- **输入参数(in)**:
flag:SDIO标志位状态SDIO_FLAG_CCRCERR:命令响应(CRC检测)SDIO_FLAG_DCRCERR:数据已发送/接收(CRC检测)SDIO_FLAG_CMDTMO:命令超时(CRC检测)SDIO_FLAG_DTTMO:数据超时(CRC检测)SDIO_FLAG_TXFIFOERR:发送FIFO下溢错误发生SDIO_FLAG_RXFIFOERR:接收FIFO上溢错误发生SDIO_FLAG_CMDRECV:命令响应(CRC检测)SDIO_FLAG_CMDSEND:命令已发送(CRC检测)SDIO_FLAG_DTEND:数据结束(CRC检测)SDIO_FLAG_STBITE:起始位错误(CRC检测)SDIO_FLAG_DTBLKE:数据块已发送/接收(CRC检测)SDIO_FLAG_CMDRUN:正在传输命令(CRC检测)SDIO_FLAG_TXRUN:正在传输数据(CRC检测)SDIO_FLAG_RXRUN:正在接收数据(CRC检测)SDIO_FLAG_TFHF:发送FIFO半满(CRC检测)SDIO_FLAG_RFHF:接收FIFO半满(CRC检测)SDIO_FLAG_TFNE:发送FIFO空(CRC检测)SDIO_FLAG_RFNE:接收FIFO空(CRC检测)SDIO_FLAG_TXDAVL:发送FIFO中的数据有效(CRC检测)SDIO_FLAG_RXDAVL:接收FIFO中的数据有效(CRC检测)SDIO_FLAG_SDIOIN:SD I/O中断已接收(CRC检测)SDIO_FLAG_ATAEN:CE-ATA命令完成信号已接收(CRC检测)
- **输出参数(out)**:无
- 返回值:
SET或RESET - 示例:
1
2/* get the flags of SDIO */
FlagStatus flag_status = sdio_flag_get(SDIO_FLAG_DTEND);