从您提供的代码和描述来看,您正在执行SD卡的擦除操作,遇到擦除后无法写入数据的问题。让我具体看看代码中的擦除部分,并检查是否有可能导致问题的地方。
CMD32 (Set Block Erase Start Address) 和 CMD33 (Set Block Erase End Address) 的使用:
确认StartBlock
和EndBlock
的值是否正确,并且在执行这些命令时已经转换为字节地址(对于非SDHC卡)。
CMD32和CMD33命令需要连续发送,并且在成功后发送CMD38执行擦除。
CMD38 (Erase) 的使用:
CMD38命令在发送之后,需要等待擦除完成。这可能需要一定的时间。
命令发送失败:
检查SD_SendCmd
函数的实现,确保CMD32, CMD33, CMD38命令发送正确,并且返回值被正确处理。
在每个命令发送后,检查返回状态是否正确。如果返回值不为0,则可能命令发送失败,需要处理错误。
超时问题:
CMD38擦除操作可能需要较长时间完成。确保有足够的等待时间。
可以在发送CMD38后,加入一个延时或等待擦除完成的循环。
硬件问题:
确认SD卡插槽和连接是否牢固,以及SD卡本身是否有问题。
尝试使用其他SD卡,排除硬件故障。
SD卡类型:
确认所使用的SD卡类型与代码中的判断相符。如果是SDHC卡,SD_Type
应该等于SD_TYPE_V2HC
,否则需要转换地址为字节地址。
建议的改进
通过以上改进,您可以更好地捕捉和处理每个擦除步骤中的错误,并确保在擦除命令后有足够的等待时间。如果问题依旧存在,建议进一步检查SD_SendCmd
函数的实现,确保命令发送和响应处理的正确性。