硬汉嵌入式论坛

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

[SPI/QSPI] [SPI/QSPI] 关于QuadSPI自动轮询模式下超时的问题

[复制链接]

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2024-8-16 14:07:35 | 显示全部楼层 |阅读模式
使用QSPI的自动轮询模式时,当flash寄存器与Mask运算之后,在设定时间内不能和Match一致时,
此时qspi仍然会持续轮询,直到二者匹配,请问就是这么设计的还是使用出错,按常理不应该超时就停止轮询吗?


[C] 纯文本查看 复制代码
uint8_t AutoPollingMemReady(uint32_t Timeout)
{
  QSPI_CommandTypeDef     s_command = {0};
  QSPI_AutoPollingTypeDef s_config = {0};
  
  /* 配置自动轮询模式等待存储器准备就绪 */
  s_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  s_command.Instruction       = W25Q128_READ_STATUS_REGISTER1;
  s_command.AddressMode       = QSPI_ADDRESS_NONE;
  s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  s_command.DataMode          = QSPI_DATA_1_LINE;
  s_command.DummyCycles       = 0;
  
  s_config.Match              = 0x01;
  s_config.Mask               = 0x01;
  s_config.MatchMode          = QSPI_MATCH_MODE_AND;
  s_config.StatusBytesSize    = 1;
  s_config.Interval           = 0x10;
  s_config.AutomaticStop      = QSPI_AUTOMATIC_STOP_ENABLE;

  if(HAL_QSPI_AutoPolling(&hqspi, &s_command, &s_config, Timeout) != HAL_OK)
    {
      printf("QSPI_AutoPollingMemReady Error\r\n");
      return HAL_ERROR;
    }

  return HAL_OK;
}


如这段代码,如果我就是想要当存储器为busy时执行一些代码,但是一旦其开始轮询后也不能执行其他指令,因为busy永远不会为1导致程序卡死。
还有关于SIOOMode参数的配置究竟影响的是什么功能,刚开始我以为是用在自动轮询模式下只需要发一次指令,然后flash会持续输出当前寄存器状态,
但是用逻辑分析仪观察并不是。

求大佬们指教。



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-17 09:49:00 | 显示全部楼层
1、超时会退出的,没有退出不正常。
2、SIOOMode类似这个,是每次都发送CMD_RDSR后读取状态,还是发送一次后,一直读取状态。

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*        函 数 名: sf_WaitForWriteEnd
*        功能说明: 采用循环查询的方式等待器件内部写操作完成
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void sf_WaitForWriteEnd(void)
{
        sf_SetCS(0);                                                                        /* 使能片选 */
        bsp_spiWrite0(CMD_RDSR);                                                        /* 发送命令, 读状态寄存器 */
        while((bsp_spiRead0() & WIP_FLAG) == SET);        /* 判断状态寄存器的忙标志位 */
        sf_SetCS(1);                                                                        /* 禁能片选 */
}
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2024-8-17 11:51:46 | 显示全部楼层
eric2013 发表于 2024-8-17 09:49
1、超时会退出的,没有退出不正常。
2、SIOOMode类似这个,是每次都发送CMD_RDSR后读取状态,还是发送一次 ...

1,我测试的结果是在到达超时条件后,HAL_QSPI_AutoPolling返回HAL_ERROR,但是qspi没有停止轮询,直到轮询结果匹配。初学,调试源代码也看不太懂
2,大概懂这个意思了,谢谢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-8-18 10:33:14 | 显示全部楼层
dingyi 发表于 2024-8-17 11:51
1,我测试的结果是在到达超时条件后,HAL_QSPI_AutoPolling返回HAL_ERROR,但是qspi没有停止轮询,直到轮 ...

你有进入HAL_QSPI_AutoPolling代码里面看下没,看看那个位置返回的。这样方便理解。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 03:30 , Processed in 0.263313 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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