本章节记录
异常
- weact stm32h750 开发板移植sfud 组件,开启QSPI相关的组件宏定义,并切换到QPI模式下,在使用qspi 方式读取数据出现全0x88以及读取数据存在0x00 的异常现象
- 前一次调试QSPI Flash已经处于映射模式,第二次重新烧录调试无法读取device id的情况
环境说明
- sfud地址
https://github.com/armink/SFUD.git - 移植参考
https://blog.youkuaiyun.com/ybhuangfugui/article/details/141578526
本次主要是异常分析,软件设计分为内部flash 128KB 当作bootloader,外部的qspi flash 当作app 区域,跳转前需要检查qspiflash 中的数据是否正常,切换qspiflash 到qpi 模式,然后切换到映射模式,后续跳转到qspi flash的地址段执行。
分析过程
问题一 调试QSPI Flash已经处于映射模式,第二次重新烧录调试无法读取device id的情况
- 测试发现,切换到qpi后,qpsi flash的指令模式是4线的,sfud 中使用的reset 接口是
spi模式下1线的指令模式,无法通过reset函数实现芯片复位; - sfud 通过标准spi 方式无法使用 static sfud_err read_jedec_id(sfud_flash *flash) 读取id信息;
查看数据手册可知:

static sfud_err reset(const sfud_flash *flash)
{
sfud_err result = SFUD_SUCCESS;
const sfud_spi *spi = &flash->spi;
uint8_t cmd_data[2];
SFUD_ASSERT(flash);
cmd_data[0] = SFUD_CMD_ENABLE_RESET;
result = spi->wr(spi, cmd_data, 1, NULL, 0);
if (result == SFUD_SUCCESS)
{
result = wait_busy(flash);
}
else
{
SFUD_INFO("Error: Flash device reset failed.");
return result;
}
cmd_data[1] = SFUD_CMD_RESET;
result = spi->wr(spi, &cmd_data[1], 1, NULL, 0);
if (result == SFUD_SUCCESS)
{
result = wait_busy(flash);
}
if (result == SFUD_SUCCESS)
{
SFUD_DEBUG("Flash device reset success.");
}
else
{
SFUD_INFO("Error: Flash device reset failed.");
}
return result;
}
所以在初始化过程,需要在标准spi下执行重启操作,并还需要在qpi 模式下执行重启操作;
如下(修改底层初始化操作):
#define W25X_EnableReset 0x66
#define W25X_ResetDevice 0x99
/**
* @brief debug
* @param hqspi
*/
static void _bsp_qspi_reset_device(QSPI_HandleTypeDef *hqspi)
{
QSPI_CommandTypeDef s_command;
/* Initialize the reset enable command */
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
s_command.Instruction = W25X_EnableReset;
s_command.AddressMode = QSPI_ADDRESS_NONE;
s_command

最低0.47元/天 解锁文章
283

被折叠的 条评论
为什么被折叠?



