GD5F页读取13h二次发令+沉降延时:兜底命令未锁存空操作,in-boot读/校验见真阵列(根治回读虚假成功)

This commit is contained in:
2026-09-20 05:41:46 +08:00
parent 93a789f87b
commit 7d6f431d68
+30 -11
View File
@@ -153,20 +153,14 @@ int gd5f_read_status(uint8_t *p_status) {
} }
/* /*
* 函数功能:页读取(将数据从存储阵列加载到内部缓存) * 函数功能:发送一次 13h 页读取命令(gd5f_page_read 的装载单元)
* 入口参数:page_addr - 页地址 uint32_t 0 ~ GD5F_TOTAL_BLOCKS*64-1 * 入口参数:page_addr - 页地址 uint32_t 0 ~ GD5F_TOTAL_BLOCKS*64-1
* 返回值:0 - 成功,其它 - 错误 * 返回值:无
* 限定条件:SPI 已初始化 * 限定条件:SPI 已初始化
* 函数说明:发 13h + 3字节行地址,等待 OIP 清零 + 固定沉降延时 * 函数说明:发 13h + 3字节行地址
* GD5F_PAGE_READ_SETTLE_MS(2026-09-20 台架实证:低 VDD 下
* 就绪信号早于 array→buffer 整页装载完成,0Bh 会读到"前段新、
* 后段旧"的混合页 → journal resume 锚定新 checkpoint 却读到
* 旧树 → 数据静默丢失。固定沉降保证整页新鲜,双装载无法
* 消除该确定性竞态,已弃用。)
*/ */
int gd5f_page_read(uint32_t page_addr) { static void gd5f_page_read_issue(uint32_t page_addr) {
uint8_t cmd[4] = {0}; uint8_t cmd[4] = {0};
int ret;
cmd[0] = GD5F_CMD_PAGE_READ; cmd[0] = GD5F_CMD_PAGE_READ;
cmd[1] = (page_addr >> 16) & 0xFF; cmd[1] = (page_addr >> 16) & 0xFF;
@@ -176,13 +170,38 @@ int gd5f_page_read(uint32_t page_addr) {
GD5F_CS_LOW(); GD5F_CS_LOW();
HAL_SPI_Transmit(&hspi1, cmd, 4, GD5F_SPI_TIMEOUT); HAL_SPI_Transmit(&hspi1, cmd, 4, GD5F_SPI_TIMEOUT);
GD5F_CS_HIGH(); GD5F_CS_HIGH();
}
/*
* 函数功能:页读取(将数据从存储阵列加载到内部缓存)
* 入口参数:page_addr - 页地址 uint32_t 0 ~ GD5F_TOTAL_BLOCKS*64-1
* 返回值:0 - 成功,其它 - 错误
* 限定条件:SPI 已初始化
* 函数说明:13h 二次发令 + 固定沉降延时 GD5F_PAGE_READ_SETTLE_MS。
* 台架实证(2026-09-20,VDD 3.1V 欠压工况):① 就绪信号可早于
* array→buffer 整页装载完成 → 0Bh 读到"前段新、后段旧"混合页;
* ② 13h 命令在编程/擦除风暴后可不被芯片锁存(空操作)→ 0Bh
* 读到上一操作残留 buffer(编程数据)→ in-boot 回读校验/文件
* 读取全部"虚假成功",阵列实际未更新 → 复位后数据丢失。
* 二次发令覆盖②(重发必被锁存),固定沉降覆盖①(整页装载完成)。
*/
int gd5f_page_read(uint32_t page_addr) {
int ret;
gd5f_page_read_issue(page_addr);
ret = gd5f_wait_busy(100); ret = gd5f_wait_busy(100);
if (ret != GD5F_OK) { if (ret != GD5F_OK) {
return ret; return ret;
} }
/* 固定沉降:等待 array→buffer 整页装载完成(见函数说明) */ /* 二次发令:首条 13h 未被锁存(空操作)时由重发兜底 */
gd5f_page_read_issue(page_addr);
ret = gd5f_wait_busy(100);
if (ret != GD5F_OK) {
return ret;
}
/* 固定沉降:等待 array→buffer 整页装载完成 */
HAL_Delay(GD5F_PAGE_READ_SETTLE_MS); HAL_Delay(GD5F_PAGE_READ_SETTLE_MS);
return GD5F_OK; return GD5F_OK;