sfud组件适配qspi flash W25Q64JV 踩坑记录

异常

  • 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的情况

  1. 测试发现,切换到qpi后,qpsi flash的指令模式是4线的,sfud 中使用的reset 接口是
    spi模式下1线的指令模式,无法通过reset函数实现芯片复位;
  2. 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
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值