解决一个擦除的bug
This commit is contained in:
@@ -293,22 +293,24 @@ static int gd5f_set_feature(uint8_t addr, uint8_t data) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:块擦除(擦<EFBFBD>?28KB块)
|
||||
* 入口参数:block_addr - 块编<EFBFBD>? uint32_t 0 - 2047
|
||||
* 返回值:0 - 成功,其<EFBFBD>?- 错误<EFBFBD>? * 限定条件:gd5f2gq5ue_init() 已调<E5B7B2>? * 函数说明<E8AFB4>?. 写使<E58699>?- D8h + 3字节字节地址 - 等待完成
|
||||
* 2. 擦除完成后检<E5908E>?E_FAIL <20>? */
|
||||
* 函数功能:块擦除(擦除128KB块)
|
||||
* 入口参数:block_addr - 块编号 uint32_t 0 - 2047
|
||||
* 返回值:0 - 成功,其他 - 错误码
|
||||
* 限定条件:gd5f2gq5ue_init() 已调用
|
||||
* 函数说明:1. 写使能 - D8h + 3字节页地址 - 等待完成
|
||||
* 2. 擦除完成后检查 E_FAIL */
|
||||
int gd5f_block_erase(uint32_t block_addr) {
|
||||
int ret = GD5F_OK;
|
||||
uint8_t cmd[4];
|
||||
uint8_t status = 0;
|
||||
uint32_t byte_addr = block_addr * GD5F_BLOCK_SIZE;
|
||||
uint32_t page_addr = block_addr * GD5F_PAGES_PER_BLOCK;
|
||||
|
||||
gd5f_write_enable();
|
||||
|
||||
cmd[0] = GD5F_CMD_BLOCK_ERASE;
|
||||
cmd[1] = (byte_addr >> 16) & 0xFF;
|
||||
cmd[2] = (byte_addr >> 8) & 0xFF;
|
||||
cmd[3] = byte_addr & 0xFF;
|
||||
cmd[1] = (page_addr >> 16) & 0xFF;
|
||||
cmd[2] = (page_addr >> 8) & 0xFF;
|
||||
cmd[3] = page_addr & 0xFF;
|
||||
|
||||
GD5F_CS_LOW();
|
||||
HAL_SPI_Transmit(&hspi1, cmd, 4, GD5F_SPI_TIMEOUT);
|
||||
@@ -358,6 +360,42 @@ static int gd5f_bbt_scan(void) {
|
||||
return GD5F_OK;
|
||||
}
|
||||
|
||||
void gd5f2gq5ue_bbt_rescan(void) {
|
||||
uint32_t blk;
|
||||
uint8_t spare[64];
|
||||
memset(s_bbt, 0, GD5F_BBT_SIZE);
|
||||
for (blk = 0; blk < GD5F_TOTAL_BLOCKS; blk++) {
|
||||
uint32_t page = (blk << 6) | 63;
|
||||
gd5f_page_read(page);
|
||||
gd5f_read_from_cache(GD5F_PAGE_SIZE, spare, sizeof(spare));
|
||||
if (spare[0] != 0xFF) {
|
||||
s_bbt[blk >> 3] |= (1 << (blk & 7));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void gd5f2gq5ue_bbt_clear(void) {
|
||||
memset(s_bbt, 0, GD5F_BBT_SIZE);
|
||||
}
|
||||
|
||||
void gd5f2gq5ue_print_bbt(void) {
|
||||
uint32_t bad_count = 0;
|
||||
for (uint32_t b = 0; b < GD5F_TOTAL_BLOCKS; b++) {
|
||||
if ((s_bbt[b >> 3] >> (b & 7)) & 1) bad_count++;
|
||||
}
|
||||
DBG_INFO("BBT: %lu/%lu blocks bad", bad_count, GD5F_TOTAL_BLOCKS);
|
||||
if (bad_count > 0) {
|
||||
uint32_t shown = 0;
|
||||
for (uint32_t b = 0; b < GD5F_TOTAL_BLOCKS && shown < 32; b++) {
|
||||
if ((s_bbt[b >> 3] >> (b & 7)) & 1) {
|
||||
DBG_INFO(" block %lu (offset 0x%08lX)", b, b * GD5F_BLOCK_SIZE);
|
||||
shown++;
|
||||
}
|
||||
}
|
||||
if (bad_count > 32) DBG_INFO(" ... and %lu more", bad_count - 32);
|
||||
}
|
||||
}
|
||||
|
||||
/* ======================== 公共函数定义 ======================== */
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user