阿里兄 发表于 2019-12-19 17:35:05

QSPI—读写串行 FLASH-W25Q256

本帖最后由 阿里兄 于 2019-12-19 17:41 编辑

QSPI—读写串行 FLASH-W25Q256

一些注意事项,后面直接看代码
1、W25Q256的最大时钟为104M,时钟配置为hqspi.Init.ClockPrescaler = 2;即216M/(2+1)=72M。
2、QSPI FlashSize为2^(FlashSize+1)次方,W25Q256为32M字节,hqspi.Init.FlashSize = 24;即2^(24+1)=32MB,此处需配置为24。
3、QUADSPI 内存映射模式为只读模式,在此模式下, 只允许对外部 FLASH 进行读操作。
4、内存映射地址为0x90000000。
5、W25Q256大小为32M,需要配置为4字节地址模式。

初始化
void MX_QUADSPI_Init(void)
{

hqspi.Instance = QUADSPI;
hqspi.Init.ClockPrescaler = 2;
hqspi.Init.FifoThreshold = 4;
hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
hqspi.Init.FlashSize = 24;
hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_5_CYCLE;
hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0;
hqspi.Init.FlashID = QSPI_FLASH_ID_1;
hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE;
if (HAL_QSPI_Init(&hqspi) != HAL_OK)
{
    Error_Handler();
}

}配置QSPI为内存映射模式
//配置QSPI为内存映射模式
uint32_t W25QXX_EnableMemoryMappedMode(void)
{
QSPI_CommandTypeDef      s_command;
QSPI_MemoryMappedTypeDef s_mem_mapped_cfg;

s_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
s_command.Instruction       = W25X_QUAD_INOUT_FAST_READ_CMD_4BYTE;
s_command.AddressMode       = QSPI_ADDRESS_4_LINES;
s_command.AddressSize       = QSPI_ADDRESS_32_BITS;
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;//无交替字节必需设为无,否则读失败
s_command.DataMode          = QSPI_DATA_4_LINES;
s_command.DummyCycles       = 6;
s_command.DdrMode         = QSPI_DDR_MODE_DISABLE;
s_command.DdrHoldHalfCycle= QSPI_DDR_HHC_ANALOG_DELAY;
s_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;

s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
s_mem_mapped_cfg.TimeOutPeriod   = 0;

if (HAL_QSPI_MemoryMapped(&hqspi, &s_command, &s_mem_mapped_cfg) != HAL_OK)
{
    return HAL_ERROR;
}

return HAL_OK;
}

读写速度



工程代码:
页: [1]
查看完整版本: QSPI—读写串行 FLASH-W25Q256