SD卡开发学习总结(二)

sd_card_sec_read_write.v

 上述为sd_card_sec_read_write中的输入输出信号。

 

 

 

 

①首先上电进入IDLE状态,sd_init_done为判断初始化是否完成的信号

当SD卡选择SPI模式,初始化时默认为一种时钟(SPI_LOW_SPEED_DIV),其余状态如读写或者CMD为另一种时钟(SPI_HIGH_SPEED_DIV)

②接下来进入CMD0状态,该状态主要是发送CMD0命令

首先来看(cmd_req_ack&~cmd_req_error)  cmd_req_ack这个信号是由sd_card_cmd这个模块发出的cmd_req_ack信号,该信号在sd_card_cmd这个模块表示着进入了S_END状态,如果没有发现错误即收到了返回,则进入S_CMD8这个状态。判断cmd_req_error这个信号的原因是因为,在sd_card_cmd模块中如果没有收到正确的返回值进入S_ERROR状态,下一个时钟也会进入S_END,也会产生cmd_req_ack这个信号,so 需要判断cmd_req_error来判断是否进入过S_ERROR

③CMD8、CMD55、CMD41同理(表示着初始化已完成)

④CMD16:可以改变一次读写的长度。

⑤CMD_WAIT_WRITE_READ:

顶层如果有sd_sec_write或者sd_sec_read命令则进入对应的写模式或者读模式

⑥写状态

需要先进入CMD24这个状态,完成CMD24命令的写入(怎样判断命令写入完成呢,又是如何让sd_card_cmd这个模块来判断此时发送的是命令还是数据呢?答案在这:cmd_req,block_write_req,传送给sd_card_cmd这个模块(在这个模块中S_WAIT中有这样一段判断逻辑cmd_req==1b1;state<=S_CMD_PRE,block_read_req==1b1;state<=S_READ_WAIT,block_write_req==1b1;state<=S_WRITE_TOKEN)),读状态同理。

再进行写操作,此时出现的信号block_write_req_ack为SD_CARD_CMD中输出的信号,它标志着已经完成一次写操作。

⑦读状态

需要先进入CMD17这个状态,完成CMD17命令的写入

再进行读操作,此时出现的信号block_read_req_ack为SD_CARD_CMD中输出的信号,它标志着已经完成一次读操作。

⑧完成读写,下一个状态

State=WAIT_WRITE_READ

继续进行读写操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值