[技术问答] HC32F460的QSPI flash映射读取全是0XDD,如果不映射直接读取flash就可以,这是为啥呢

[复制链接]
1292|4
 楼主| luckyren 发表于 2023-8-10 11:16 | 显示全部楼层 |阅读模式
初始化代码如下
  1. void QSPI_FLASH_Init(void)
  2. {
  3.     stc_qspi_init_t stcQspiInit;
  4.     stc_gpio_init_t stcGpioInit;

  5.     (void)GPIO_StructInit(&stcGpioInit);
  6.     stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
  7.     (void)GPIO_Init(QSPI_FLASH_CS_PORT,  QSPI_FLASH_CS_PIN,  &stcGpioInit);
  8.     (void)GPIO_Init(QSPI_FLASH_SCK_PORT, QSPI_FLASH_SCK_PIN, &stcGpioInit);
  9.     (void)GPIO_Init(QSPI_FLASH_IO0_PORT, QSPI_FLASH_IO0_PIN, &stcGpioInit);
  10.     (void)GPIO_Init(QSPI_FLASH_IO1_PORT, QSPI_FLASH_IO1_PIN, &stcGpioInit);
  11.     (void)GPIO_Init(QSPI_FLASH_IO2_PORT, QSPI_FLASH_IO2_PIN, &stcGpioInit);
  12.     (void)GPIO_Init(QSPI_FLASH_IO3_PORT, QSPI_FLASH_IO3_PIN, &stcGpioInit);
  13.     GPIO_SetFunc(QSPI_FLASH_CS_PORT,  QSPI_FLASH_CS_PIN,  QSPI_FLASH_CS_FUNC);
  14.     GPIO_SetFunc(QSPI_FLASH_SCK_PORT, QSPI_FLASH_SCK_PIN, QSPI_FLASH_SCK_FUNC);
  15.     GPIO_SetFunc(QSPI_FLASH_IO0_PORT, QSPI_FLASH_IO0_PIN, QSPI_FLASH_IO0_FUNC);
  16.     GPIO_SetFunc(QSPI_FLASH_IO1_PORT, QSPI_FLASH_IO1_PIN, QSPI_FLASH_IO1_FUNC);
  17.     GPIO_SetFunc(QSPI_FLASH_IO2_PORT, QSPI_FLASH_IO2_PIN, QSPI_FLASH_IO2_FUNC);
  18.     GPIO_SetFunc(QSPI_FLASH_IO3_PORT, QSPI_FLASH_IO3_PIN, QSPI_FLASH_IO3_FUNC);

  19.     FCG_Fcg1PeriphClockCmd(QSPI_FLASH_CLK, ENABLE);
  20.     (void)QSPI_StructInit(&stcQspiInit);
  21.     stcQspiInit.u32ClockDiv       = QSPI_CLK_DIV3;
  22.     stcQspiInit.u32ReadMode       = QSPI_FLASH_RD_MD;
  23.     stcQspiInit.u32PrefetchMode   = QSPI_PREFETCH_MD_EDGE_STOP;
  24.     stcQspiInit.u32DummyCycle     = QSPI_FLASH_RD_DUMMY_CYCLE;
  25.     stcQspiInit.u32AddrWidth      = QSPI_FLASH_ADDR_WIDTH;
  26.     stcQspiInit.u32SetupTime      = QSPI_QSSN_SETUP_ADVANCE_QSCK1P5;
  27.     stcQspiInit.u32ReleaseTime    = QSPI_QSSN_RELEASE_DELAY_QSCK1P5;
  28.     stcQspiInit.u32IntervalTime   = QSPI_QSSN_INTERVAL_QSCK2;
  29.     (void)QSPI_Init(&stcQspiInit);
  30. }
映射读取
  1. int32_t QSPI_FLASH_Read(uint32_t u32Addr, uint8_t *pu8ReadBuf, uint32_t u32Size)
  2. {
  3.     uint32_t u32Count = 0U;
  4.     int32_t i32Ret = LL_OK;
  5.     __IO uint8_t *pu8Read;

  6.     u32Addr += QSPI_ROM_BASE;
  7.     if ((NULL == pu8ReadBuf) || (0UL == u32Size) || ((u32Addr + u32Size) > QSPI_ROM_END)) {
  8.         i32Ret = LL_ERR_INVD_PARAM;
  9.     } else {
  10. #if (QSPI_XIP_FUNC_ENABLE == DDL_ON)
  11.         QSPI_XipModeCmd(QSPI_FLASH_ENTER_XIP_MD, ENABLE);
  12. #endif
  13.         pu8Read = (__IO uint8_t *)u32Addr;
  14.         while (u32Count < u32Size) {
  15.             pu8ReadBuf[u32Count++] = *pu8Read++;
  16. #if (QSPI_XIP_FUNC_ENABLE == DDL_ON)
  17.             if (u32Count == (u32Size - 1U)) {
  18.                 QSPI_XipModeCmd(QSPI_FLASH_EXIT_XIP_MD, DISABLE);
  19.             }
  20. #endif
  21.         }
  22.     }

  23.     return i32Ret;
  24. }
直接读取
  1. int32_t QSPI_FLASH_Read(uint32_t u32Addr, uint8_t *pu8ReadBuf, uint32_t u32Size)
  2. {
  3.     uint32_t u32TempSize = 0;
  4.     uint8_t u8AddrBuf[4U] = {0};
  5.     uint32_t u32AddrOffset = 0U;
  6.     int32_t i32Ret = LL_OK;

  7.     if ((NULL == pu8ReadBuf) || (0UL == u32Size) || ((u32Addr % W25Q64_PAGE_SIZE) != 0U)) {
  8.         i32Ret = LL_ERR_INVD_PARAM;
  9.     } else {
  10.         while (u32Size != 0UL) {
  11.             if (u32Size >= W25Q64_PAGE_SIZE) {
  12.                 u32TempSize = W25Q64_PAGE_SIZE;
  13.             } else {
  14.                 u32TempSize = u32Size;
  15.             }
  16.             QSPI_FLASH_WriteInstr(W25Q64_WR_ENABLE, NULL, 0U, NULL, 0U);
  17.             QSPI_FLASH_WordToByte(u32Addr, u8AddrBuf);
  18.             QSPI_FLASH_ReadInstr(W25Q64_RD_DATA, u8AddrBuf, (QSPI_FLASH_ADDR_WIDTH + 1U),
  19.                                   (uint8_t *)&pu8ReadBuf[u32AddrOffset], u32TempSize);
  20.             i32Ret = QSPI_FLASH_CheckProcessDone(500U);
  21.             if (i32Ret != LL_OK) {
  22.                 break;
  23.             }
  24.             u32Addr       += u32TempSize;
  25.             u32AddrOffset += u32TempSize;
  26.             u32Size       -= u32TempSize;
  27.         }
  28.     }

  29.     return i32Ret;
  30. }


 楼主| luckyren 发表于 2023-8-10 13:32 | 显示全部楼层
映射地址是:
/* QSPI memory mapping base and end address */
#define QSPI_ROM_BASE                           (0x98000000UL)
#define QSPI_ROM_END                            (0x9BFFFFFFUL)


 楼主| luckyren 发表于 2023-8-11 09:31 | 显示全部楼层
已解决,是因为flash芯片不同,紫光芯片在使用QSPI时需要把QE打开,即寄存器2W25Q64_WR_STATUS_REG2的QE位要置1.
renyaq 发表于 2023-8-13 19:09 | 显示全部楼层
flash芯片不同都这样啊
chenqianqian 发表于 2023-8-14 08:41 来自手机 | 显示全部楼层
地址都不一样的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

19

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部