RT-Thread论坛
直播中

孙奕

7年用户 879经验值
私信 关注
[问答]

STM32H743配置了QSPI驱动W25Q256JV,初始化成功,但后续都失败了,为什么?

在实验野火开发部STM32H743时,配置了QSPI驱动W25Q256JV,初始化成功,但后续都失败了,如图1
1.png
我的配置过程如下,
1、使用了CubMX,如下图
2.png

3.png

2、CubMX生成了代码
3、Kconfig配置如下图


4.png

5、测试代码如下

/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date           Author       Notes
* 2018-11-27     zylx         first version
* 2022-03-16     Miaowulue    add dfs mount
*/
#include
#include
#include
#include
#include
#include
#include
#ifdef BSP_USING_QSPI_FLASH
#include "spi_flash.h"
#include "spi_flash_sfud.h"
char w25qxx_read_status_register2(struct rt_qspi_device *device)
{
    /* 0x35 read status register2 */
    char instruction = 0x35, status;
    rt_qspi_send_then_recv(device, &instruction, 1, &status, 1);
    return status;
}
void w25qxx_write_enable(struct rt_qspi_device *device)
{
    /* 0x06 write enable */
    char instruction = 0x06;
    rt_qspi_send(device, &instruction, 1);
}
void w25qxx_enter_qspi_mode(struct rt_qspi_device *device)
{
    char status = 0;
    /* 0x38 enter qspi mode */
    char instruction = 0x38;
    char write_status2_buf[2] = {0};
    /* 0x31 write status register2 */
    write_status2_buf[0] = 0x31;
    status = w25qxx_read_status_register2(device);
    if (!(status & 0x02))
    {
        status |= 1 << 1;
        w25qxx_write_enable(device);
        write_status2_buf[1] = status;
        rt_qspi_send(device, &write_status2_buf, 2);
        rt_qspi_send(device, &instruction, 1);
        rt_kprintf("flash already enter qspi mode\n");
        rt_thread_mdelay(10);
    }
}
static int rt_hw_qspi_flash_with_sfud_init(void)
{
    struct rt_qspi_device *qspi_dev_w25q;
    stm32_qspi_bus_attach_device("qspi1", "qspi10", RT_NULL, 4, w25qxx_enter_qspi_mode, RT_NULL);
    qspi_dev_w25q = (struct rt_qspi_device *)rt_device_find("qspi10");
    if (qspi_dev_w25q == RT_NULL) {
        LOG_E("qspi_dev_w25q rt_device_find failed...\n");
        return -EINVAL;
    }
    else if(qspi_dev_w25q != RT_NULL)
    {
        LOG_D("qspi_dev_w25q rt_device_find OK...\n");
        rt_thread_mdelay(1);
    }
    /* init W25Q256 */
    if (RT_NULL == rt_sfud_flash_probe("W25Q256", "qspi10"))
    {
        return -RT_ERROR;
    }
    return RT_EOK;
}
INIT_DEVICE_EXPORT(rt_hw_qspi_flash_with_sfud_init);
static int mnt_qspi_flash_init(void)
{
    if (dfs_mount("W25Q256", "/", "elm", 0, 0) == RT_EOK)
    {
        rt_kprintf("Mount spi flash successfully!\n");
        return RT_EOK;
    }
    else
    {
        rt_kprintf("Mount spi flash fail!\n");
        return -RT_ERROR;
    }
}
INIT_APP_EXPORT(mnt_qspi_flash_init);
#endif/* BSP_USING_QSPI_FLASH */
6、编译没有问题,下载运行后就是如图的结果了
主要提示,QSPI recv data failed

不知道哪里出错了,请大神给看看!!!

回帖(1)

张英

2024-9-26 17:04:14
从您提供的信息来看,您已经成功初始化了STM32H743的QSPI驱动W25Q256JV,但后续操作失败了。为了解决这个问题,我们可以按照以下步骤进行排查:

1. 检查硬件连接:确保W25Q256JV与STM32H743之间的硬件连接正确。检查QSPI引脚是否正确连接,以及W25Q256JV的电源和地线是否连接良好。

2. 检查初始化代码:确保CubMX生成的初始化代码正确无误。您可以在初始化代码中添加调试信息,以便在调试过程中查看QSPI的初始化状态。

3. 检查Kconfig配置:确保Kconfig配置正确。您提供的Kconfig配置图没有显示,因此无法判断配置是否正确。请确保QSPI相关的配置项已正确设置。

4. 检查测试代码:检查您的测试代码是否正确。您提供的测试代码片段没有显示,因此无法判断代码是否正确。请确保您在测试代码中正确使用了QSPI接口函数,并且遵循了W25Q256JV的数据手册。

5. 检查W25Q256JV的时序要求:确保您的QSPI时序设置满足W25Q256JV的数据手册要求。例如,时钟频率、读写时序等。

6. 检查电源:确保W25Q256JV的电源电压和电流满足其数据手册要求。

7. 使用示波器:如果可能的话,使用示波器检查QSPI总线上的信号波形,以确定是否存在信号完整性问题。

8. 检查其他外围设备:确保没有其他外围设备干扰QSPI总线。

9. 更新软件:确保您的STM32H743固件库和工具链是最新的,以避免因软件问题导致的失败。

通过以上步骤,您应该能够找到导致后续操作失败的原因,并采取相应的解决措施。如果问题仍然存在,请提供更详细的信息,以便进一步分析。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分