硬汉嵌入式论坛

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

[SPI/QSPI] 请教下, h7 的 qspi 使用 2片 mt25ql256 组合成8bit 的, 貌似读写失败 ?

[复制链接]

678

主题

3465

回帖

5524

积分

论坛元老

积分
5524
发表于 2024-6-29 21:13:39 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2024-6-29 21:39 编辑

请教下, h7 的 qspi 使用 2片 mt25ql256 组合成8bit 的, 貌似读写失败 ?


原理图:

qspi-dual-sch.png


软件配置:


int bsp_qspi_quad_mt25ql256a(void)
{
        uint8_t buf[23] = {0}, val;
        
        __QSPI_CLK_ENABLE();        
        
        
        
  QSPI_Handle.Instance = QUADSPI;
        
        /* 设置时钟速度,QSPI clock = 240MHz / (ClockPrescaler+1) = 120MHz */
  QSPI_Handle.Init.ClockPrescaler = 1;
  QSPI_Handle.Init.FifoThreshold = 1;
  QSPI_Handle.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE;

        
        /*Flash大小是2^(FlashSize + 1) = 2^26 = 64MB */
  QSPI_Handle.Init.FlashSize = QSPI_FLASH_SIZE;  //25;

  QSPI_Handle.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_6_CYCLE;
  QSPI_Handle.Init.ClockMode = QSPI_CLOCK_MODE_0;
  
  /* 启用了双片 , 这里需要启动双片功能  */
  QSPI_Handle.Init.DualFlash = QSPI_DUALFLASH_ENABLE;
  if (HAL_QSPI_Init(&QSPI_Handle) != HAL_OK)  // 这个 HAL_QSPI_MspInit  函数被 HAL_QSPI_Init 所调用
  {
    return 2;
  }
  HAL_Delay(50);

}



/**
  * @brief  This function put QSPI memory in QPI mode (quad I/O).
  * @param  hqspi: QSPI handle
  * @retval None
  */
static QSPI_StaticTypeDef QSPI_EnterMemory_QPI( QSPI_HandleTypeDef *hqspi )
{
        int  i;
  QSPI_CommandTypeDef      s_command = {0};

  /* Initialize the QPI enable command */
  /* QSPI memory is supported to be in SPI mode, so CMD on 1 LINE */
  s_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
  s_command.Instruction       = ENTER_QUAD_CMD;
  s_command.AddressMode       = QSPI_ADDRESS_NONE;
  s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  s_command.DataMode          = QSPI_DATA_NONE;
  s_command.DummyCycles       = 0;
  s_command.DdrMode           = QSPI_DDR_MODE_DISABLE;
  s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
  s_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;

  /* Send the command */
  if (HAL_QSPI_Command(hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  {
    return QSPI_ERROR;
  }
        
        for(i=0;i<0xfff;i++) {}  // 简短延时,等待芯片内部工作稳定,对于 MT25QL256ABA1EW9-0SIT 可以不使用

}



QSPI_StaticTypeDef QSPI_WritePageByte(uint8_t * _pBuf, uint32_t _uiWriteAddr, uint32_t _size)
{
        
  QSPI_StaticTypeDef res;
  QSPI_CommandTypeDef sCommand = {0};
         
        if (QSPI_WriteEnable(&QSPI_Handle) != QSPI_OK)
        {
                return QSPI_ERROR;
        }

        /* 基本配置 */
        sCommand.InstructionMode   = QSPI_INSTRUCTION_4_LINES;  /* 4线方式发送指令 */
        sCommand.AddressSize       = QSPI_ADDRESS_32_BITS;       /* 32位地址 */
        sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;  /* 无交替字节 */
        sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;      /*  不支持DDR */
        sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;  /* DDR模式,数据输出延迟 */
        sCommand.SIOOMode          = QSPI_SIOO_INST_ONLY_FIRST_CMD;         /* 仅发送一次命令 */        
        
        /* 写序列配置 */
        sCommand.Instruction = QUAD_IN_FAST_PROG_4_BYTE_ADDR_CMD; /* 32bit地址的4线快速写入命令 */
        sCommand.DummyCycles = 0;                    /* 不需要空周期 */
        sCommand.AddressMode = QSPI_ADDRESS_4_LINES; /* 4线地址方式 */
        sCommand.DataMode    = QSPI_DATA_4_LINES;    /* 4线数据方式 */
        sCommand.NbData      = _size;                /* 写数据大小 */   
        sCommand.Address     = _uiWriteAddr;         /* 写入地址 */
        
        
  
  if (HAL_QSPI_Command(&QSPI_Handle, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  {
    return QSPI_ERROR;
  }  
  
     if (HAL_QSPI_Transmit(&QSPI_Handle, (uint8_t *)_pBuf, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
        {
                return QSPI_ERROR;
        }
        

  res = QSPI_AutoPollingMemReady(&QSPI_Handle);
  if (res != QSPI_OK)
  {
    return res;
  }

  return QSPI_OK;
}


//----------------------------------------------------------------------------------------------------
目前有几点疑问:
01. 关于 接口是 组成 8bit 的, 单片 qspi 芯片接口是 4bit, mcu 内部是吧一个 8bit 字节的数据自动分成 2组 4bit 进行发送吗 ?

        sCommand.AddressMode = QSPI_ADDRESS_4_LINES; /* 4线地址方式 */
        sCommand.DataMode    = QSPI_DATA_4_LINES;    /* 4线数据方式 */


02. mcu 在数据接收时也是自动的吧 2片 qspi 的 4bit 数据进行组合成 8bit 的数据吗 ?
03. 2片 4bit 的32MB 大小的芯片, 组合成 8bit 的 64MB 大小, 那
       QSPI_Handle.Init.FlashSize = QSPI_FLASH_SIZE;   这个地方是设置为 32MB 还是 64MB 呢 ???






回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-6-30 09:05:11 | 显示全部楼层
ST的H743X综合评估板是采用的这个,你可以参考下,我没用过双QSPI组成8bit的用法

23.png



回复

使用道具 举报

678

主题

3465

回帖

5524

积分

论坛元老

积分
5524
 楼主| 发表于 2024-6-30 11:55:22 | 显示全部楼层
本帖最后由 hpdell 于 2024-6-30 16:13 编辑
eric2013 发表于 2024-6-30 09:05
ST的H743X综合评估板是采用的这个,你可以参考下,我没用过双QSPI组成8bit的用法

捣鼓了一个晚上,终于搞定了呀, 不容易了


在读取状态时需要读取 2 字节的状态数据 ,


使用 中断 及查询方法读写都成功了,
qspi-dual-rw.png 2片 4ibt 的组合成 8 bit 的, 这个读写速度慢不慢 ??


使用 dma 模式失败 ,也不知道是 dma 模式写出错还是读出错 , ??
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-7-1 08:03:18 | 显示全部楼层
hpdell 发表于 2024-6-30 11:55
捣鼓了一个晚上,终于搞定了呀, 不容易了

内存映射模式试试。
回复

使用道具 举报

678

主题

3465

回帖

5524

积分

论坛元老

积分
5524
 楼主| 发表于 2024-7-1 09:26:07 | 显示全部楼层
eric2013 发表于 2024-7-1 08:03
内存映射模式试试。

后续试试看看速度会不会比 4bit 的 要快一些
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 06:09 , Processed in 0.217171 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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