你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

QSPI连续快速读取速度很慢,时钟不太对

[复制链接]
永夜衣袂 提问时间:2018-5-25 10:00 /
参考论坛一个帖子的配置方法,如下Init QSPI,以及读取时先发送 QSPI_QUAD_INOUT_FAST_READ_4_BYTE_ADDR_CMD,在接手500个字节的数据,可是时钟信号出来如图并不是连续的,然后读取速度就很慢。

QSPI_StaticTypeDef QSPI_UserInit(void)
{
  uint32_t i;
  uint8_t  QspiID[3];
  __IO QSPI_StaticTypeDef  __QspiStatus = QSPI_OUT_TIME;
       
        if(g_isQSPIInit)
        {
                return QSPI_OK;
        }
  g_isQSPIInit = 1;
       
  QUADSPI_Init();     

  __QspiStatus = QSPI_ResetMemory(&hqspi);

        if ( __QspiStatus != QSPI_OK)  
        {
    printf("QSPI  reset memory Error  ... ... \r\n");   
                return QSPI_ERROR;
        }

  i = 0x100000;
  while(i --)
  {

  }
       
                QSPI_Read_ID(QSPI_READ_ID_CMD, (uint8_t *) & QspiID[0], 3);
                QSPI_AutoPollingMemReady(&hqspi);
        QSPI_DummyCyclesCfg(&hqspi);
  _QspiFlashInf.Id = (QspiID[0] << 16) | (QspiID[1] << 8) | QspiID[2];
#ifdef DEBUG
     printf("QSPI_READ_ID =  0x%X\r\n", _QspiFlashInf.Id );
#endif
  __QspiStatus = QSPI_Quad_Enter();

#ifdef DEBUG
  printf("QSPI_UserInit                  OK       ... DD \r\n\r\n");
#endif
  return QSPI_OK;
}
void QUADSPI_Init(void)
{

  hqspi.Instance = QUADSPI;

  HAL_QSPI_DeInit(&hqspi);

  hqspi.Init.FifoThreshold = 10;                       
  hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
  hqspi.Init.FlashSize = QSPI_FLASH_SIZE_LINE;


  hqspi.Init.ClockPrescaler = 1;
  hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_4_CYCLE;



  hqspi.Init.ClockMode = QSPI_CLOCK_MODE_3;               
  hqspi.Init.FlashID = QSPI_FLASH_ID_1;                    
  hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE;   
  if (HAL_QSPI_Init(&hqspi) != HAL_OK)
  {

  }
}


/*
int QSPI_Read(uint8_t* data, uint32_t address, uint32_t size)        --Read data from QSPI flash
A function to read data from QSPI flash
Return an integer value (default QSPI_OK), a parameter for data buffer,
a parameter for QSPI memory address, a parameter for data size.
*/

QSPI_StaticTypeDef QSPI_ReadBuff(uint8_t* data, uint32_t address, uint32_t size)
{
  uint32_t  __InstructionMode, __AddressMode, __DataMode;
  uint8_t readBuffer_RegVal = 0;

  if(QSPI_WorkMode)   // Work In QUAD Model
  {
    __InstructionMode = QSPI_INSTRUCTION_4_LINES;
    __AddressMode     = QSPI_ADDRESS_4_LINES;
    __DataMode        = QSPI_DATA_4_LINES;
  }
  else
  {
    __InstructionMode = QSPI_INSTRUCTION_1_LINE;
    __AddressMode     = QSPI_ADDRESS_1_LINE;
    __DataMode        = QSPI_DATA_1_LINE;  
  }

  if(QSPI_SendCmdData(  QSPI_QUAD_INOUT_FAST_READ_4_BYTE_ADDR_CMD,
                        __InstructionMode,            
                        __AddressMode,                  
                        QSPI_ADDRESS_32_BITS,         
                        __DataMode,                  
                        size,                          
                        4 ,                           
                        address,                        
                        &readBuffer_RegVal,                  
                        QSPI_SEND_CMD                  
                     ) != QSPI_OK )
  {
    return QSPI_ERROR;
  }   

  if(QSPI_Receive(  data,  size) != QSPI_OK)
    return  QSPI_ERROR;  
       
  return  QSPI_OK;

}

QSPI_Clock.jpg
收藏 1 评论3 发布时间:2018-5-25 10:00

举报

3个回答
永夜衣袂 回答时间:2018-5-25 15:39:10
自顶,求助,各位大佬有没有用过QSPI的探讨下,用正点原子的源码,时钟波形也是这么断续的,看不出来QSPI连续读取的样子
feixiang20 回答时间:2018-5-26 00:40:02
要么你修改读取代码里的参数,看看有什么变化

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

butterflyspring 回答时间:2018-5-30 11:01:33
你用CUBEMX生成一个例程看看,或者看看我们的例程代码,对比一下.你这个只能自己调试进去看看,实在不行,DMA模式,QSPI高速时,轮训模式是跟不上的

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版