思澈科技软件开发工具包  2.20
QSPI

QSPI HAL 提供用于访问 qspi 外设寄存器的基本 API,它用作 A0 上的闪存(flash)控制器。 有 2 级 hal 接口,bf0_hal_qspi 和 bf0_hal_qspi_ex。
Hal_qspi 用于访问硬件寄存器的接口,只包含很少的逻辑,对于 XIP 模式,这个文件应该放在 RAM 中。 Hal_qspi_ex 用于基本 NAND/NOR 功能包装器,包括页面读取/页面写入/扇区擦除和一些其他功能。

主要功能包括:

- 最多支持 4 个实例(其中QSPI4可挂载到LCPU)。
- 可支持NAND/NOR/PSRAM。
- DMA 支持。
- 通过寄存器命令表支持多芯片。

内存地址映射:

  • QSPI1: memory from 0x10000000 to 0x11FFFFFF(total 32MB).
  • QSPI2: memory from 0x64000000 to 0x67FFFFFF(total 64MB).
  • QSPI3: memory from 0x68000000 to 0x6FFFFFFF(total 128MB).
  • QSPI4: memory from 0x12000000 to 0x13FFFFFF(total 32MB).

使用 QSPI HAL 驱动程序

QSPI 可用于控制 NOR-FLASH、NAND-FLASH、4-LINE PSRAM。 以下是 NOR-FLASH 的示例:

// register command table to support more flash chip
spi_flash_register_cmd();
qspi_configure_t flash_cfg = FLASH1_CONFIG;
struct dma_config flash_dma = FLASH1_DMA_CONFIG;
// init QSPI hardware controller
flash_cfg.SpiMode = 0; // 0 for nor and 1 for nand
res = HAL_FLASH_Init(&(spi_flash_handle[0]), &flash_cfg, &spi_flash_dma_handle[0], &flash_dma, BSP_GetFlash1DIV());
if (res != HAL_OK)
return error;
// erase sector
res = nor_sector_erase(hflash, addr);
if (res < 0)
return error;
// write a page
res = nor_write_page(hflash, addr, buf, size);
if (res != size)
return error;
// read data, it can use AHB read
res = nor_read_rom(hflash, addr, buf, size);
...

以下是 NAND-FLASH 的示例:

// register command table to support more flash chip
spi_flash_register_cmd();
qspi_configure_t flash_cfg = FLASH1_CONFIG;
struct dma_config flash_dma = FLASH1_DMA_CONFIG;
// init QSPI hardware controller
flash_cfg.SpiMode = 1; // 0 for nor and 1 for nand
res = HAL_FLASH_Init(&(spi_flash_handle[1]), &flash_cfg, &spi_flash_dma_handle[1], &flash_dma, BSP_GetFlash2DIV());
if (res != HAL_OK)
return error;
// erase block, for nand, erase is block based
res = nand_erase_block(hflash, addr);
if (res < 0)
return error;
// write a page
res = nand_write_page_algn(hflash, addr, buf, size);
if (res != size)
return error;
// read data, nand can not use AHB read directly, it should use driver interface
res = nand_read_page(hflash, addr, buf, size);
...
FLASH_MAX_INSTANCE
#define FLASH_MAX_INSTANCE
SPI_FLASHEx configure tyep.
Definition: bf0_hal_mpi_ex.h:78
dma_config
Definition: bf0_hal_dma.h:73
HAL_OK
@ HAL_OK
Definition: bf0_hal_def.h:75
HAL_FLASH_Init
HAL_StatusTypeDef HAL_FLASH_Init(QSPI_FLASH_CTX_T *ctx, qspi_configure_t *cfg, DMA_HandleTypeDef *dma, struct dma_config *dma_cfg, uint16_t clk_div)
Initial QSPI for flash mode.
qspi_configure_t
SPI_FLASH configure tyep.
Definition: bf0_hal_mpi.h:82
qspi_configure_t::SpiMode
uint32_t SpiMode
Definition: bf0_hal_mpi.h:87
QSPI_FLASH_CTX_T
SPI_FLASHEx spi flash context.
Definition: bf0_hal_mpi_ex.h:162