硬汉嵌入式论坛

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

QSPI MX25L12835F读取速度

[复制链接]

17

主题

70

回帖

121

积分

初级会员

积分
121
发表于 2019-4-19 14:46:44 | 显示全部楼层 |阅读模式
本帖最后由 1314一路向前 于 2019-4-19 14:52 编辑

请问一下dummy对flash读取速度的影响是什么?目前不管使用1/2/4线,取出来的DC都是00.我主控的qspi跑96MHZ,DMA+Quad IO Fast Read

四线读取速度才17MByte/S,不对吧,按道理是48MByte/S吧。请问这个DC值可以修改吗,是不是flash端的速度低了,是否可以通过修改DC来提高flash的速度?但是看了半天,只有读DC的指令,没有写!有没有谁弄过这玩意,谢谢


1.png
2.png
3.png
4.png
回复

使用道具 举报

4

主题

84

回帖

96

积分

初级会员

积分
96
发表于 2019-4-19 15:42:37 | 显示全部楼层
应该是WRSR这指令。
Snipaste_2019-04-19_15-34-57.png
Snipaste_2019-04-19_15-35-30.png
至于Dummy cycle就是读数据时发送地址与数据相隔的时钟周期个数
Snipaste_2019-04-19_15-36-11.png

回复

使用道具 举报

17

主题

70

回帖

121

积分

初级会员

积分
121
 楼主| 发表于 2019-4-19 17:17:19 | 显示全部楼层
huohua1991 发表于 2019-4-19 15:42
应该是WRSR这指令。

谢谢,改了DC已经达到了30几MB/S。但是持续读取数据时,时钟线上每一个八位后都跟了4位低电平。请问这个是哪里的原因,还有哪里可以配置吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-4-19 17:46:07 | 显示全部楼层
参考我H7的,可以整到48MB/S

http://www.armbbs.cn/forum.ph ... 6980&extra=page%3D1
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
发表于 2019-4-20 09:34:46 | 显示全部楼层
1314一路向前 发表于 2019-4-19 17:17
谢谢,改了DC已经达到了30几MB/S。但是持续读取数据时,时钟线上每一个八位后都跟了4位低电平。请问这个 ...

你好,你是如何搞定的啊 ??

我目前使用 qpi 模式,貌似 使用 QSPI_AutoPollingMemReady 这个函数无效,如果使用 1线模式通讯就可以,
请问下是我 的 芯片不行还是怎么回事啊 ??

如果使用 4线 qpi 模式的话,只要使用 QSPI_AutoPollingMemReady 这个函数的地方,全部替换为 HAL_Delay 来代替就完全可以,读写也都完全正常

// 1线模式
static QSPI_StaticTypeDef QSPI_AutoPollingMemReady(QSPI_HandleTypeDef *hqspi)
{
        uint32_t TimeOut;
        QSPI_CommandTypeDef     sCommand = {0};
        QSPI_AutoPollingTypeDef sConfig = {0};

       
        /* 基本配置 */
        sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;    /* 1线方式发送指令 */
        sCommand.AddressSize       = QSPI_ADDRESS_32_BITS;       /* 32位地址 */
        sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;  /* 无交替字节 */
        sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;      /* W25Q256JV不支持DDR */
        sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;  /* DDR模式,数据输出延迟 */
        sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;         /* 每次传输都发指令 */
       
        /* 读取状态*/
        sCommand.Instruction       = READ_STATUS_REG_CMD; /* 读取状态命令 */
        sCommand.AddressMode       = QSPI_ADDRESS_NONE;   /* 无需地址 */
        sCommand.DataMode          = QSPI_DATA_1_LINE;    /* 1线数据 */
        sCommand.DummyCycles       = 0;                   /* 无需空周期 */

        /* 屏蔽位设置的bit0,匹配位等待bit0为0,即不断查询状态寄存器bit0,等待其为0 */
        sConfig.Mask            = 0x01;
        sConfig.Match           = 0x00;
        sConfig.MatchMode       = QSPI_MATCH_MODE_AND;
        sConfig.StatusBytesSize = 1;
        sConfig.Interval        = 0x10;
        sConfig.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;

        StatusMatch = 0;
        TimeOut = 0;
        if (HAL_QSPI_AutoPolling_IT(&QSPI_Handle, &sCommand, &sConfig) != HAL_OK)
        {
                return QSPI_ERROR;
        }
  while(StatusMatch == 0)    // 等待完成匹配 StatusMatch 标志 置1
  {
    TimeOut ++;
    if(TimeOut > (uint32_t)(0xFFFFFFFE))
    {
      return QSPI_OUT_TIME;
    }  
  }
  return QSPI_OK;
}



// *********************************************************************
// 4线模式
static QSPI_StaticTypeDef QSPI_AutoPollingMemReady(QSPI_HandleTypeDef *hqspi)
{
        uint32_t TimeOut;
        QSPI_CommandTypeDef     sCommand = {0};
        QSPI_AutoPollingTypeDef sConfig = {0};

       
        /* 基本配置 */
        sCommand.InstructionMode   = QSPI_INSTRUCTION_4_LINES;    /* 1线方式发送指令 */
        sCommand.AddressSize       = QSPI_ADDRESS_32_BITS;       /* 32位地址 */
        sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;  /* 无交替字节 */
        sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;      /* W25Q256JV不支持DDR */
        sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;  /* DDR模式,数据输出延迟 */
        sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;         /* 每次传输都发指令 */
       
        /* 读取状态*/
        sCommand.Instruction       = READ_STATUS_REG_CMD; /* 读取状态命令 */
        sCommand.AddressMode       = QSPI_ADDRESS_NONE;   /* 无需地址 */
        sCommand.DataMode          = QSPI_DATA_4_LINES;    /* 1线数据 */
        sCommand.DummyCycles       = 0;                   /* 无需空周期 */

        /* 屏蔽位设置的bit0,匹配位等待bit0为0,即不断查询状态寄存器bit0,等待其为0 */
        sConfig.Mask            = 0x01;
        sConfig.Match           = 0x00;
        sConfig.MatchMode       = QSPI_MATCH_MODE_AND;
        sConfig.StatusBytesSize = 1;
        sConfig.Interval        = 0x10;
        sConfig.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;

        StatusMatch = 0;
        TimeOut = 0;
        if (HAL_QSPI_AutoPolling_IT(&QSPI_Handle, &sCommand, &sConfig) != HAL_OK)
        {
                return QSPI_ERROR;
        }
  while(StatusMatch == 0)    // 等待完成匹配 StatusMatch 标志 置1
  {
    TimeOut ++;
    if(TimeOut > (uint32_t)(0xFFFFFFFE))
    {
      return QSPI_OUT_TIME;
    }  
  }
  return QSPI_OK;
}





回复

使用道具 举报

17

主题

70

回帖

121

积分

初级会员

积分
121
 楼主| 发表于 2019-4-20 11:40:32 | 显示全部楼层
hpdell 发表于 2019-4-20 09:34
你好,你是如何搞定的啊 ??

我目前使用 qpi 模式,貌似 使用 QSPI_AutoPollingMemReady 这个函数无 ...

用的不是st
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
发表于 2019-4-20 19:03:30 | 显示全部楼层
本帖最后由 hpdell 于 2019-4-20 19:16 编辑

这个没有关系呀,估计配置 部分 应该是相同的吧,只是平台不同而已嘛

我现在不确定是不是我 的 这个芯片 有问题呀 ?

使用 1线 读写完全没有问题,但是配置为 qpi 4线读写的话,在判断 等待写入完成或者擦除完成 就不行了,
有没有可能 搞到假货了  ?
你的在 qpi 模式下,擦除发送的是不是 #define SUBSECTOR_ERASE_CMD                  0x20  这个指令,擦除一个 4096 扇区 ??
回复

使用道具 举报

36

主题

1446

回帖

1554

积分

至尊会员

积分
1554
发表于 2019-4-20 20:42:21 | 显示全部楼层
hpdell 发表于 2019-4-20 19:03
这个没有关系呀,估计配置 部分 应该是相同的吧,只是平台不同而已嘛

我现在不确定是不是我 的 这个芯 ...

4096字节吧
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
发表于 2019-4-20 21:58:39 | 显示全部楼层
本帖最后由 hpdell 于 2019-4-20 21:59 编辑

终于搞定了


static QSPI_StaticTypeDef QSPI_AutoPollingMemReady(QSPI_HandleTypeDef *hqspi)
{
        uint32_t TimeOut;
        QSPI_CommandTypeDef     sCommand = {0};
        QSPI_AutoPollingTypeDef sConfig = {0};

        
        /* 基本配置 */
        sCommand.InstructionMode   = QSPI_INSTRUCTION_4_LINES;    /* 1线方式发送指令 */
        sCommand.AddressSize       = QSPI_ADDRESS_32_BITS;       /* 32位地址 */
        sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;  /* 无交替字节 */
        sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;      /* W25Q256JV不支持DDR */
        sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;  /* DDR模式,数据输出延迟 */
        sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;         /* 每次传输都发指令 */
        
        /* 读取状态*/
        sCommand.Instruction       = READ_STATUS_REG_CMD; /* 读取状态命令 */
        sCommand.AddressMode       = QSPI_ADDRESS_NONE;   /* 无需地址 */
        sCommand.DataMode          = QSPI_DATA_4_LINES;    /* 1线数据 */
        sCommand.DummyCycles       = 8;                  // 这个地方改成这样就可以ok了  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11

        /* 屏蔽位设置的bit0,匹配位等待bit0为0,即不断查询状态寄存器bit0,等待其为0 */
        sConfig.Mask            = 0x01;
        sConfig.Match           = 0x00;
        sConfig.MatchMode       = QSPI_MATCH_MODE_AND;
        sConfig.StatusBytesSize = 1;
        sConfig.Interval        = 0x10;
        sConfig.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;

        StatusMatch = 0;
        TimeOut = 0;
        if (HAL_QSPI_AutoPolling_IT(&QSPI_Handle, &sCommand, &sConfig) != HAL_OK)
        {
                return QSPI_ERROR;
        }
  while(StatusMatch == 0)    // 等待完成匹配 StatusMatch 标志 置1
  {
    TimeOut ++;
    if(TimeOut > (uint32_t)(0xFFFFFFFE))
    {
      return QSPI_OUT_TIME;
    }  
  }
  return QSPI_OK;
}



回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 06:51 , Processed in 0.304060 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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