SD NAND 的擦除时间取决于其物理特性、容量、擦除块大小以及操作条件。以下是关于 SD NAND 擦除时间的详细说明和优化建议:
// 擦除指定块(block_addr为块编号)bool SD_NAND_EraseBlock(uint32_t block_addr) {
uint8_t cmd[6];
uint8_t response;
// 1. CMD32: 设置起始块地址
cmd[0] = 0x50; // CMD32
cmd[1] = (block_addr >> 24) & 0xFF;
cmd[2] = (block_addr >> 16) & 0xFF;
cmd[3] = (block_addr >> 8) & 0xFF;
cmd[4] = block_addr & 0xFF;
cmd[5] = 0xFF; // CRC(SPI模式下可忽略)
HAL_SPI_Transmit(&hspi1, cmd, 6, 100);
// 等待响应(0x00表示成功)
do {
HAL_SPI_Receive(&hspi1, &response, 1, 100);
} while (response == 0xFF);
if (response != 0x00) return false;
// 2. CMD33: 设置结束块地址(与起始块相同)
cmd[0] = 0x51; // CMD33
HAL_SPI_Transmit(&hspi1, cmd, 6, 100);
// 等待响应
do {
HAL_SPI_Receive(&hspi1, &response, 1, 100);
} while (response == 0xFF);
if (response != 0x00) return false;
// 3. CMD38: 执行擦除
cmd[0] = 0x56; // CMD38
cmd[1] = 0x00;
cmd[2] = 0x00;
cmd[3] = 0x00;
cmd[4] = 0x00;
cmd[5] = 0xAA; // CRC(固定值)
HAL_SPI_Transmit(&hspi1, cmd, 6, 100);
// 等待响应(0x00表示开始擦除,随后进入忙状态)
do {
HAL_SPI_Receive(&hspi1, &response, 1, 100);
} while (response == 0xFF);
if (response != 0x00) return false;
// 4. 等待擦除完成(通过读取忙信号判断)
do {
HAL_SPI_Receive(&hspi1, &response, 1, 100);
} while (response == 0x00); // 0x00表示忙状态
return true;}在代码中添加时间戳记录:
#include "stm32f4xx_hal.h"uint32_t start_time, end_time;// 测量擦除时间start_time = HAL_GetTick();if (SD_NAND_EraseBlock(0)) {
end_time = HAL_GetTick();
printf("擦除耗时: %lu ms
", end_time - start_time);}不同型号的 SD NAND 擦除时间差异较大,建议查阅具体芯片的数据手册(如 Micron、Samsung 等厂商的规格书)获取准确参数。例如:
电话:176-6539-0767
Q Q:135-0379-986
邮箱:1350379986@qq.com
地址:深圳市南山区后海大道1021号C座