GD5F页读取13h二次发令+沉降延时:兜底命令未锁存空操作,in-boot读/校验见真阵列(根治回读虚假成功)
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user