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表示写操作完成。