完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
根据描述,问题出现在使用RT-Thread 5.1.0在STM32H743XI芯片上通过QSPI接口(20MHz)读写W25Q64JV Flash时。第一次上电可以读取ID,但之后读取ID为0,且无法读写。更换Flash芯片(W25Q64JV)和开发板(尝试了GD25Q64CS甚至无法读取ID)问题依旧。而在另一块F429开发板上通过SPI接口读写W25Q64JV正常,说明SFUD本身支持W25Q64JV,问题可能出在QSPI驱动上。 ### 可能的原因分析: 1. **QSPI初始化问题**:可能初始化过程有误,导致后续操作失败。第一次能读ID可能是因为上电后Flash处于默认状态,而初始化后配置了某些模式导致后续无法通信。 2. **QSPI模式设置问题**:W25Q64JV支持多种模式(如标准SPI、双线、四线等)。可能在初始化后设置了多线模式,但后续操作没有正确切换模式,或者模式切换导致通信失败。 3. **时钟配置问题**:QSPI时钟配置可能不稳定,导致后续通信失败。 4. **硬件连接问题**:虽然更换了芯片和开发板,但硬件连接(如引脚、上拉电阻等)可能存在问题,导致信号质量差。 5. **SFUD驱动适配问题**:SFUD的QSPI驱动可能存在适配问题,尤其是在RT-Thread的BSP中针对STM32H743的QSPI驱动可能不完善。 6. **状态寄存器问题**:Flash的状态寄存器可能被设置为写保护状态,或者在操作过程中进入了某些特殊模式(如QPI模式),导致无法用标准SPI指令读取。 7. **中断或DMA冲突**:可能存在其他中断或DMA操作干扰了QSPI通信。 ### 解决步骤建议: #### 1. **检查硬件连接** - 确保QSPI引脚连接正确(CLK, CS, IO0, IO1, IO2, IO3),并且有适当的上拉电阻(通常需要上拉)。 - 检查电源是否稳定,尤其在高速通信时。 #### 2. **检查QSPI初始化代码** - 在RT-Thread中,QSPI的初始化通常在`drv_qspi.c`中。检查初始化函数(如`rt_hw_qspi_init`)是否正确配置了时钟、引脚、模式等。 - 特别注意: - 时钟分频设置是否正确(20MHz)。 - 是否在初始化后正确将Flash设置为四线模式(如果需要)?但要注意,读取ID通常使用单线模式。 - 检查CS引脚的控制是否正确(软件控制还是硬件控制)。 #### 3. **检查SFUD的配置** - SFUD在RT-Thread中通常通过`rt_sfud_flash_probe`来探测Flash。检查该函数调用是否正确。 - 在`rtconfig.h`中是否启用了SFUD和QSPI驱动?相关配置如下: ```c #define RT_USING_SFUD #define RT_SFUD_USING_QSPI #define RT_SFUD_USING_FLASH_INFO_TABLE ``` - 检查SFUD的QSPI操作函数(如读写函数)是否被正确实现并注册。 #### 4. **尝试在初始化前复位Flash** - 在SFUD探测之前,尝试发送复位指令(如使能复位、复位设备)将Flash恢复到默认状态。因为之前的失败操作可能使Flash处于非标准状态。 - 参考W25Q64JV的数据手册,可以使用以下指令序列: - 发送0x66(使能复位) - 发送0x99(复位设备) - 或者直接通过上电复位(硬件复位)引脚。 #### 5. **检查状态寄存器** - 使用SFUD提供的函数读取状态寄存器(如`sfud_read_status`),看是否处于写保护状态或QPI模式。 - 如果是QPI模式(状态寄存器的第6位),则需要通过指令退出QPI模式(发送0xFF退出QPI模式,回到SPI模式)。 #### 6. **降低通信速率** - 尝试降低QSPI的时钟频率(比如降到10MHz或更低),看是否稳定。 #### 7. **调试QSPI驱动** - 在QSPI读写函数中加入调试信息,打印每次发送和接收的数据,观察通信过程。 - 检查QSPI的传输函数(如`qspi_send_then_recv`)是否有逻辑错误。 #### 8. **参考已知可用的BSP** - 由于你在ART-Pi开发板上成功过,可以对比ART-Pi的BSP中的QSPI驱动(STM32H750)和当前使用的BSP。ART-Pi的BSP中已经适配了QSPI和SFUD,可以参考其实现。 - 主要参考:`libraries/HAL_Drivers/drv_qspi.c`和`libraries/HAL_Drivers/drv_qspi_flash.c`。 #### 9. **使用逻辑分析仪或示波器** - 如果有条件,使用逻辑分析仪抓取QSPI的波形,观察CLK、CS和各数据线的信号,看是否符合预期。 ### 示例代码:复位Flash 在SFUD探测之前,可以尝试复位Flash: ```c static void w25q64jv_reset(void) { // 发送使能复位指令 0x66 rt_qspi_send_then_send(&qspi_device, "x66", 1, RT_NULL, 0); // 发送复位指令 0x99 rt_qspi_send_then_send(&qspi_device, "x99", 1, RT_NULL, 0); // 等待复位完成 rt_thread_mdelay(10); } ``` 然后在`rt_hw_qspi_flash_init`函数中调用该复位函数。 ### 注意: - 在操作QSPI时,确保在发送指令前正确配置了指令模式和地址模式等。 - STM32H7的QSPI外设功能强大,但配置相对复杂,需要仔细对照参考手册和BSP驱动。 希望这些建议能帮助你解决问题。 根据您的描述,问题集中在STM32H7系列QSPI驱动与W25Q64JV的兼容性上。以下是可能的原因和解决方案: 根本原因分析
解决方案(关键步骤)1. 强制复位Flash设备(首先尝试)2. 检查H7时钟配置在 在时钟初始化代码中验证: 3. 修改SFUD QSPI驱动适配在 4. 检查引脚复用配置在CubeMX或代码中确认: 5. 关键寄存器检查(调试用)其他验证建议
ART-Pi参考配置要点若曾成功使用ART-Pi(STM32H750),需对比:
|
|
|
|
|
只有小组成员才能发言,加入小组>>
184个成员聚集在这个小组
加入小组rtstudio是否可像keil加载ini解决虚拟串口与mcu串口通讯?
1212 浏览 0 评论
【Vision Board创客营连载体验】基于RA8D1-Vision Board的自动路径规划小车
1776 浏览 1 评论
【Vision Board创客营连载体验】基于Vision Board的垃圾分类
2156 浏览 0 评论
【Vision Board创客营连载体验】使用 Vision Board 做一个 UVC Camera
1777 浏览 0 评论
【Vision Board创客营连载体验】TinyMaix进行手写数字识别
2006 浏览 0 评论
1465浏览 5评论
在RT-Thread Studio中新建的stm32f407-atk-explorer工程运行qemu失败,是什么原因引起的?
1767浏览 3评论
为什么rt_device_read()只能读取到两个字节数据?
364浏览 3评论
连得上热点,但是ping baidu.com出现timeout,请问跟什么有关?
422浏览 3评论
422浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 13:31 , Processed in 0.734274 second(s), Total 78, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
4889
