SD卡开发学习总结(三)

sd_card_cmd.v

 上述为该模块的输入输出信号,以及这个模块的各种状态。

cmd_req_ack表示一次命令字的输入完成

block_read_req_ack表示一次读作的完成

block_write_req_ack表示一次写操作的完成

Send_data默认发送校验码8’hff

在sd_card_sec_read_write模块中spi_clk_div默认状态时为SPI_LOW_SPEED_DIV,即初始化状态时SPI的DCLK

spi_wr_ack为spi_master模块输出的信号,它标志着完成了八个时钟(即8个DCLK)的SPI读写,这段代码判断了byte_cnt是否大于10,即完成了11次SPI的读写,即起到了延时88个DCLK(power up time),电压上升至2.0V,使SD卡工作。

完成了一个字节命令的写入之后,首先判断接受的数据是否为正常,如果不正常进入ERR状态。如果正常,要判断cmd_data_len,该信号由sd_card_sec_read_write模块输出。只有CMD8有四个字节的除命令字的data长度,其他均为0,这是因为CMD8会返回5个字节的数据,首先接受到第一个字节格式为R1的数据,然后只需要判断是否完全接受了另外几个字节的数据,如果接受了就进入END状态。

SD卡的读步骤

①发送CMD17(单块)或CMD18(多块)读命令,返回0X00

②接收数据开始令牌fe(或fc)+正式数据512bytes+CRC校验2Bytes,默认正式传输的数据长度是512Bytes

在sd_card_sec_read_write这个模块中,进行读操作时,首先发送了CMD17这条命令,然后进入S_READ状态,并且输出block_read_req信号。

在sd_card_cmd这个模块中,进入S_READ_WAIT这个状态,如果接受到fe,进入下一个状态S_READ,通过判断是否接受了514bytes(数据512,CRC校验2)来验证读操作的完成。

SD卡的写步骤

①发送CMD24(单块)或CMD25(多块)写命令,返回0X00

②发送数据开始令牌fe+正式数据512Bytes+CRC校验2bytes

③连续读直到读到8’bxxx00101表示写成功

④继续读进行忙检测,读到0x00表示正忙,0xff表示写操作完成

发送开始令牌0xfe

发送正式数据512Bytes

发送CRC校验2Bytes

检验是否读到8’bxxx00101,验证是否写成功

进行忙检测,0xff表示写操作完成。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值