sdio2.0 怎么将卡置于初始化状态
时间: 2024-03-19 10:41:23 浏览: 179
要将 SDIO 2.0 卡置于初始化状态,您需要执行以下步骤:
1. 在 SDIO CLK 周期的前 80 个时钟周期内,将 CMD 线置为高电平,D0-D3 线置为高阻态。
2. 在第 80 个时钟周期后,保持 CMD 线为高电平,将 D0 线置为低电平。
3. 等待 SDIO 卡响应,通常为 8 个时钟周期。
4. 将 CMD 线置为低电平,发送 CMD0,使 SDIO 卡进入闲置状态。
执行完上述步骤后,SDIO 卡就会进入初始化状态。
相关问题
fpga实现 sdio2.0初始化流程
SDIO2.0 的初始化流程可以分为以下几步:
1. 确定时钟频率:SDIO2.0 的时钟频率可以达到 208 MHz,需要根据具体的应用场景确定时钟频率。
2. 发送 CMD0 命令:CMD0 是 SD 卡的软件复位命令,它用于将 SD 卡复位到初始状态。FPGA 在初始化时需要向 SD 卡发送 CMD0 命令,以确保 SD 卡处于正确的状态。
3. 发送 CMD8 命令:CMD8 用于向 SD 卡查询它是否支持高容量存储和供电电压范围等信息。如果 SD 卡支持高容量存储和所选的电压范围,则会回复一个 R7 响应。FPGA 需要解析 R7 响应,以确定 SD 卡的特性和电压范围。
4. 发送 ACMD41 命令:ACMD41 用于向 SD 卡发送初始化命令,该命令会触发 SD 卡的初始化流程。FPGA 需要向 SD 卡发送 ACMD41 命令,并等待 SD 卡的响应。如果 SD 卡成功初始化,则会回复一个 R3 响应。
5. 设置数据总线宽度:FPGA 需要根据 SD 卡的特性和所选的数据总线宽度,设置数据总线宽度为 1 位或 4 位。
6. 设置时钟频率:FPGA 需要根据 SD 卡的特性和所选的时钟频率,设置时钟频率。
7. 发送 CMD2 命令:CMD2 用于向 SD 卡查询它的 CID,即 SD 卡的厂商信息和序列号等信息。FPGA 需要向 SD 卡发送 CMD2 命令,并解析 SD 卡的响应。
8. 发送 CMD3 命令:CMD3 用于向 SD 卡查询它的 RCA,即 SD 卡的相对地址。FPGA 需要向 SD 卡发送 CMD3 命令,并解析 SD 卡的响应。
以上是 SDIO2.0 的初始化流程的大致步骤,具体实现需要参考 SDIO2.0 协议和 FPGA 开发板的硬件和软件特性。
verilog 写sdio2.0完整初始化流程的程序
以下是SDIO 2.0完整初始化流程的Verilog程序示例:
```
module SDIO_Init(
input CLK, // 系统时钟
input RST, // 复位信号
input CMD, // 命令信号
input DAT, // 数据信号
output OUT_CMD, // 输出命令信号
output OUT_DAT, // 输出数据信号
output reg [3:0] STATE // 状态寄存器
);
// 定义SDIO 2.0协议中的命令编号
parameter CMD_GO_IDLE_STATE = 0;
parameter CMD_SEND_OP_COND = 1;
parameter CMD_ALL_SEND_CID = 2;
parameter CMD_SEND_REL_ADDR = 3;
parameter CMD_SET_DSR = 4;
parameter CMD_SELECT_CARD = 7;
parameter CMD_SEND_CSD = 9;
parameter CMD_SEND_CID = 10;
parameter CMD_STOP_TRANSMISSION = 12;
parameter CMD_SEND_STATUS = 13;
parameter CMD_SET_BLOCKLEN = 16;
parameter CMD_READ_SINGLE_BLOCK = 17;
parameter CMD_READ_MULTIPLE_BLOCK = 18;
parameter CMD_WRITE_BLOCK = 24;
parameter CMD_WRITE_MULTIPLE_BLOCK = 25;
parameter CMD_PROGRAM_CSD = 27;
parameter CMD_ERASE_WR_BLK_START_ADDR = 32;
parameter CMD_ERASE_WR_BLK_END_ADDR = 33;
parameter CMD_ERASE = 38;
parameter CMD_LOCK_UNLOCK = 42;
parameter CMD_APP_CMD = 55;
parameter CMD_GEN_CMD = 56;
// 定义SDIO 2.0协议中的响应类型
parameter RESP_NONE = 0;
parameter RESP_R1 = 1;
parameter RESP_R1B = 2;
parameter RESP_R2 = 3;
parameter RESP_R3 = 4;
parameter RESP_R4 = 5;
parameter RESP_R5 = 6;
parameter RESP_R6 = 7;
// 定义SDIO 2.0协议中的数据传输类型
parameter DATA_NONE = 0;
parameter DATA_IN = 1;
parameter DATA_OUT = 2;
parameter DATA_IN_OUT = 3;
// 定义SDIO 2.0协议中的响应位宽
parameter RESP_WIDTH = 48;
// 定义SDIO 2.0协议中的命令码位宽
parameter CMD_WIDTH = 6;
// 定义SDIO 2.0协议中的数据位宽
parameter DATA_WIDTH = 8;
// 定义SDIO 2.0协议中的数据块大小
parameter BLOCK_SIZE = 512;
// 定义SDIO 2.0协议中的命令和响应寄存器
reg [CMD_WIDTH-1:0] CMD_REG;
reg [RESP_WIDTH-1:0] RESP_REG;
// 定义SDIO 2.0协议中的命令和数据传输状态
reg [1:0] CMD_STATE;
reg [1:0] DATA_STATE;
// 定义SDIO 2.0协议中的数据块计数器和缓冲区
reg [9:0] BLOCK_CNT;
reg [DATA_WIDTH-1:0] DATA_BUF [BLOCK_SIZE-1:0];
// 定义SDIO 2.0协议中的信号线
reg OUT_CLK;
reg OUT_CMD;
reg [DATA_WIDTH-1:0] OUT_DAT;
// 定义SDIO 2.0协议中的状态机
always @(posedge CLK or posedge RST) begin
if (RST) begin
CMD_STATE <= 2'b00;
DATA_STATE <= 2'b00;
BLOCK_CNT <= 10'b0;
STATE <= 4'b0000;
end else begin
case (CMD_STATE)
2'b00: begin
CMD_REG <= {CMD_WIDTH{1'b0}};
RESP_REG <= {RESP_WIDTH{1'b0}};
CMD_STATE <= 2'b01;
STATE <= 4'b0001;
end
2'b01: begin
CMD_REG <= {6'b0, CMD_GO_IDLE_STATE};
OUT_CMD <= 1'b1;
CMD_STATE <= 2'b10;
STATE <= 4'b0010;
end
2'b10: begin
if (RESP_REG[RESP_WIDTH-1] == 1'b0) begin
CMD_STATE <= 2'b11;
STATE <= 4'b0011;
end
end
2'b11: begin
CMD_REG <= {CMD_WIDTH{1'b0}};
RESP_REG <= {RESP_WIDTH{1'b0}};
CMD_STATE <= 2'b01;
STATE <= 4'b0001;
end
endcase
case (DATA_STATE)
2'b00: begin
BLOCK_CNT <= 10'b0;
DATA_STATE <= 2'b01;
end
2'b01: begin
DATA_STATE <= 2'b10;
end
2'b10: begin
DATA_STATE <= 2'b11;
end
2'b11: begin
if (BLOCK_CNT == 10'b0) begin
DATA_STATE <= 2'b00;
end else begin
DATA_STATE <= 2'b01;
end
end
endcase
end
end
// 定义SDIO 2.0协议中的命令和数据传输控制器
always @(posedge CLK or posedge RST) begin
if (RST) begin
OUT_CMD <= 1'b0;
OUT_DAT <= {DATA_WIDTH{1'b0}};
end else begin
case (CMD_STATE)
2'b00: begin
OUT_CMD <= 1'b0;
end
2'b01: begin
OUT_CMD <= 1'b1;
OUT_DAT <= {DATA_WIDTH{1'b0}};
end
2'b10: begin
OUT_CMD <= 1'b0;
end
2'b11: begin
OUT_CMD <= 1'b0;
end
endcase
case (DATA_STATE)
2'b00: begin
OUT_DAT <= {DATA_WIDTH{1'b0}};
end
2'b01: begin
OUT_DAT <= DATA_BUF[BLOCK_CNT * BLOCK_SIZE +: DATA_WIDTH];
end
2'b10: begin
OUT_DAT <= {DATA_WIDTH{1'b0}};
end
2'b11: begin
OUT_DAT <= {DATA_WIDTH{1'b0}};
end
endcase
end
end
endmodule
```
注意:以上程序示例只是SDIO 2.0协议的初始化流程,具体实现还需要根据具体的SDIO设备和MCU进行修改。同时,程序示例中的信号线OUT_CLK未被定义,需要根据实际情况进行添加。
阅读全文