硬汉嵌入式论坛

 找回密码
 立即注册
查看: 788|回复: 12
收起左侧

[SPI/QSPI] W25Q128JV 无法读取ID

[复制链接]

38

主题

75

回帖

189

积分

初级会员

积分
189
发表于 2025-5-7 23:08:43 | 显示全部楼层 |阅读模式



用的是STM32H7B0,外挂QSPI flash W25Q128JV, 测试了很多次,发现无法读取ID,检查了代码和硬件,均未发现问题,感觉十分诡异,最后换了个新的flash也是一样的问题,现在实在没有办法了。
麻烦大家帮助看看。

代码是移植的论坛里STM32H723+W25Q64的,如下,

unsigned int W25Q128_OSPI_Read_FlashID(void)
{
    OSPI_RegularCmdTypeDef  sCommand;                // OSPI传输配置

    unsigned char        OSPI_ReceiveBuff[3];                // 存储OSPI读到的数据
    unsigned int        W25Q128_ID;                                            // 器件的ID

    sCommand.OperationType      = HAL_OSPI_OPTYPE_COMMON_CFG;         // 通用配置
    sCommand.FlashId            = HAL_OSPI_FLASH_ID_1;                // flash ID
    sCommand.InstructionMode    = HAL_OSPI_INSTRUCTION_1_LINE;        // 1线指令模式
    sCommand.InstructionSize    = HAL_OSPI_INSTRUCTION_8_BITS;        // 指令长度8位
    sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;   // 禁止指令DTR模式
    sCommand.AddressMode        = HAL_OSPI_ADDRESS_NONE;              // 无地址模式
    sCommand.AddressSize        = HAL_OSPI_ADDRESS_24_BITS;           // 地址长度24位
    sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;      // 无交替字节
    sCommand.DataMode           = HAL_OSPI_DATA_1_LINE;               // 1线数据模式
    sCommand.DataDtrMode        = HAL_OSPI_DATA_DTR_DISABLE;          // 禁止数据DTR模式
    sCommand.NbData             = 3;                                  // 传输数据的长度
    sCommand.DummyCycles        = 0;                                  // 空周期个数
    sCommand.DQSMode            = HAL_OSPI_DQS_DISABLE;               // 不使用DQS
    sCommand.SIOOMode           = HAL_OSPI_SIOO_INST_EVERY_CMD;       // 每次传输数据都发送指令

    sCommand.Instruction        = W25Q128_CMD_READ_JEDECID;           //执行读器件ID命令


    if(HAL_OK != HAL_OSPI_Command(&_hospi1, &sCommand, 10000))                //发送指令----------1
    {
          return 3;
    }
               
    if(HAL_OK != HAL_OSPI_Receive (&_hospi1, OSPI_ReceiveBuff, HAL_OSPI_TIMEOUT_DEFAULT_VALUE))        //接收数据---------------2
    {
          return 4;
   }
               
    W25Q128_ID = (OSPI_ReceiveBuff[0] << 16) | (OSPI_ReceiveBuff[1] << 8 ) | OSPI_ReceiveBuff[2];        //将得到的数据组合成ID----------3

    return W25Q128_ID; // 返回ID
               
}


通过仿真,发现程序是卡在上面第1步,发现HAL_OSPI_Command(&_hospi1, &sCommand, 10000)这个函数返回值是1,导致卡在这里无法继续,但是不明白为什么会返回1, 1好像是操作错误。

该检查的地方都检查了,实在想不出还有哪里会有问题?硬件上是刚开始是串了33欧姆电阻,后来把电阻去掉直连,也还是一样的问题,flash也换过其他的,问题依旧。


其他地方就是OCTOSPI的配置,是用STM32CubeMX配置的,感觉也没问题,就是读不了ID,老是卡在第1步,,真的很无语,排查了好几天,也没搞定。。。。


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-5-8 09:24:45 | 显示全部楼层
优先检查焊接和引脚配置,以及原理图是否确认是这个引脚。

回复

使用道具 举报

5

主题

229

回帖

249

积分

高级会员

积分
249
发表于 2025-5-8 09:57:16 | 显示全部楼层
淘宝找下STM32H7B0的开发板,然后要一下他们的代码,看看开发板上的代码在你板子上跑的起来不,有没有可能你的QSPI的时钟配置有问题
回复

使用道具 举报

38

主题

75

回帖

189

积分

初级会员

积分
189
 楼主| 发表于 2025-5-8 14:34:28 | 显示全部楼层
旮旯旭 发表于 2025-5-8 09:57
淘宝找下STM32H7B0的开发板,然后要一下他们的代码,看看开发板上的代码在你板子上跑的起来不,有没有可能 ...

这个代码就是淘宝上找的STM32H7B0核心板,他们的代码公开的,直接Copy的,我对了好几遍都一样,时钟的话,我从28M到140M都配置过,问题都一样。
回复

使用道具 举报

38

主题

75

回帖

189

积分

初级会员

积分
189
 楼主| 发表于 2025-5-8 14:35:10 | 显示全部楼层
eric2013 发表于 2025-5-8 09:24
优先检查焊接和引脚配置,以及原理图是否确认是这个引脚。

恩,下一步就是确认焊接和引脚了,实在没辙了
回复

使用道具 举报

38

主题

75

回帖

189

积分

初级会员

积分
189
 楼主| 发表于 2025-5-10 12:09:56 | 显示全部楼层
本帖最后由 coolaimcu 于 2025-5-10 12:24 编辑
eric2013 发表于 2025-5-8 09:24
优先检查焊接和引脚配置,以及原理图是否确认是这个引脚。

已经量过7B0芯片到flash之间的通路,都是通的,并无虚焊,原理图,PCB,以及板子上芯片本身都已经对照过,并无引脚弄错的问题,怀疑是flash的问题,已经换过三颗flash了,都还是一样问题。难道要让我换7B0 MCU吗?实在是没方向了,读取ID的代码,我也反复研究了,也没发现什么问题,OCTOSPI的配置如下,也没看出问题,这是我遇到过最诡异的问题,,,,

1.jpg 2.jpg C:\Users\lenovo\Desktop\1.jpg 4.jpg C:\Users\lenovo\Desktop\1.jpg
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2025-5-10 14:22:35 | 显示全部楼层
或者可以试下软件模拟SPI试下,用逻辑分析仪点出SPI信号,观察是否有正确电平产生呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-5-11 09:44:58 | 显示全部楼层
coolaimcu 发表于 2025-5-10 12:09
已经量过7B0芯片到flash之间的通路,都是通的,并无虚焊,原理图,PCB,以及板子上芯片本身都已经对照过 ...

GPIO速度降一级,使能上拉试试


123.png
回复

使用道具 举报

38

主题

75

回帖

189

积分

初级会员

积分
189
 楼主| 发表于 2025-5-11 20:07:04 | 显示全部楼层
eric2013 发表于 2025-5-11 09:44
GPIO速度降一级,使能上拉试试

感谢硬汉哥回复!


GPIO速度降级和上拉,我之前都已经试过了,还是一样的问题。几乎我能想到的配置都试过了,没有任何改善,非常诡异。

我怀疑是MCU的问题,但是MCU不好换,为了验证下是不是MCU这几个IO是不是损坏了,今天我把MCU与flash相连的这几个IO,用软件模拟SPI的方法,模拟了软SPI去读ID,用到了flash的IO0和IO1,IO2,IO3都不用。
其实这基本也是和配置成QSPI的用法一样了,QSPI下读ID也是1线方式,只用了IO0,IO1。

但是惊喜来了,模拟SPI读ID没有任何问题!能正确读出来!这至少说明了我的flash和MCU都是没问题的把!难道MCU里面QSPI那部分出问题了??
这样看起来可能还是我的QSPI的程序配置有问题,可是参考了那么多代码,都是和我一样配置的,读ID的代码就那么一点,都检查了几百遍了,实在没看出有什么问题!

真的不明白这个原因是什么了,头一回遇到这样的问题。。。。

094509lu8sqep8u356cgx8.jpg

回复

使用道具 举报

38

主题

75

回帖

189

积分

初级会员

积分
189
 楼主| 发表于 2025-5-11 20:12:12 | 显示全部楼层
Streleizia 发表于 2025-5-10 14:22
或者可以试下软件模拟SPI试下,用逻辑分析仪点出SPI信号,观察是否有正确电平产生呢

今天花了时间去把那几个IO做了软件模拟,模拟SPI没有问题!可以正确读到ID!

难道还是我的QSPI的配置问题?可是配置就那么一点,读ID的代码也没多少,都对找检查好多遍了,也没发现什么问题了,真的郁闷了
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2025-5-11 21:15:28 | 显示全部楼层
淘宝上便宜的逻辑分析仪,几十块钱,一下就找出来原因了。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2025-5-19 18:04:33 | 显示全部楼层
St还有一个ospi 的io manage模块,如果配置不正确,也可能产生不了正确信号到io上
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2025-5-19 18:07:41 | 显示全部楼层
hal库的函数,配置io manager的逻辑应该是有问题的,之前同时配置ospi1和2,用hal库的结果是无法同时工作的,必须手动调整寄存器的值才行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:22 , Processed in 0.048857 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表