1026 lines
29 KiB
C
1026 lines
29 KiB
C
|
/**
|
|||
|
******************************************************************************
|
|||
|
* @file bsp_qspi_flash.c
|
|||
|
* @author fire
|
|||
|
* @version V1.0
|
|||
|
* @date 2015-xx-xx
|
|||
|
* @brief qspi flash <EFBFBD>ײ<EFBFBD>Ӧ<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>bsp
|
|||
|
******************************************************************************
|
|||
|
* @attention
|
|||
|
*
|
|||
|
* ʵ<EFBFBD><EFBFBD>ƽ̨:Ұ<EFBFBD><EFBFBD>STM32 H750 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD>̳ :http://www.firebbs.cn
|
|||
|
* <EFBFBD>Ա<EFBFBD> :http://firestm32.taobao.com
|
|||
|
*
|
|||
|
******************************************************************************
|
|||
|
*/
|
|||
|
|
|||
|
#include "./flash/bsp_qspi_flash.h"
|
|||
|
|
|||
|
QSPI_HandleTypeDef QSPIHandle;
|
|||
|
static uint8_t QSPI_Addr_Mode_Init(void);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief QSPI_FLASH<EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|||
|
* @param <EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
void QSPI_FLASH_Init(void)
|
|||
|
{
|
|||
|
GPIO_InitTypeDef GPIO_InitStruct;
|
|||
|
|
|||
|
/* ʹ<><CAB9> QSPI <20><> GPIO ʱ<><CAB1> */
|
|||
|
QSPI_FLASH_CLK_ENABLE();
|
|||
|
QSPI_FLASH_CLK_GPIO_ENABLE();
|
|||
|
QSPI_FLASH_BK1_IO0_CLK_ENABLE();
|
|||
|
QSPI_FLASH_BK1_IO1_CLK_ENABLE();
|
|||
|
QSPI_FLASH_BK1_IO2_CLK_ENABLE();
|
|||
|
QSPI_FLASH_BK1_IO3_CLK_ENABLE();
|
|||
|
QSPI_FLASH_CS_GPIO_CLK_ENABLE();
|
|||
|
|
|||
|
#if USE_DUAL_ExtFLASH
|
|||
|
/* ʹ<><CAB9> QSPI BANK2ʱ<32><CAB1> */
|
|||
|
QSPI_FLASH_BK2_IO0_CLK_ENABLE();
|
|||
|
QSPI_FLASH_BK2_IO1_CLK_ENABLE();
|
|||
|
QSPI_FLASH_BK2_IO2_CLK_ENABLE();
|
|||
|
QSPI_FLASH_BK2_IO3_CLK_ENABLE();
|
|||
|
#endif
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
/*!< <20><><EFBFBD><EFBFBD> QSPI_FLASH <20><><EFBFBD><EFBFBD>: CLK */
|
|||
|
GPIO_InitStruct.Pin = QSPI_FLASH_CLK_PIN;
|
|||
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
|||
|
GPIO_InitStruct.Alternate = QSPI_FLASH_CLK_GPIO_AF;
|
|||
|
|
|||
|
HAL_GPIO_Init(QSPI_FLASH_CLK_GPIO_PORT, &GPIO_InitStruct);
|
|||
|
|
|||
|
/*!< <20><><EFBFBD><EFBFBD> QSPI_FLASH <20><><EFBFBD><EFBFBD>: IO0 */
|
|||
|
GPIO_InitStruct.Pin = QSPI_FLASH_BK1_IO0_PIN;
|
|||
|
GPIO_InitStruct.Alternate = QSPI_FLASH_BK1_IO0_AF;
|
|||
|
HAL_GPIO_Init(QSPI_FLASH_BK1_IO0_PORT, &GPIO_InitStruct);
|
|||
|
|
|||
|
/*!< <20><><EFBFBD><EFBFBD> QSPI_FLASH <20><><EFBFBD><EFBFBD>: IO1 */
|
|||
|
GPIO_InitStruct.Pin = QSPI_FLASH_BK1_IO1_PIN;
|
|||
|
GPIO_InitStruct.Alternate = QSPI_FLASH_BK1_IO1_AF;
|
|||
|
HAL_GPIO_Init(QSPI_FLASH_BK1_IO1_PORT, &GPIO_InitStruct);
|
|||
|
|
|||
|
/*!< <20><><EFBFBD><EFBFBD> QSPI_FLASH <20><><EFBFBD><EFBFBD>: IO2 */
|
|||
|
GPIO_InitStruct.Pin = QSPI_FLASH_BK1_IO2_PIN;
|
|||
|
GPIO_InitStruct.Alternate = QSPI_FLASH_BK1_IO2_AF;
|
|||
|
HAL_GPIO_Init(QSPI_FLASH_BK1_IO2_PORT, &GPIO_InitStruct);
|
|||
|
|
|||
|
/*!< <20><><EFBFBD><EFBFBD> QSPI_FLASH <20><><EFBFBD><EFBFBD>: IO3 */
|
|||
|
GPIO_InitStruct.Pin = QSPI_FLASH_BK1_IO3_PIN;
|
|||
|
GPIO_InitStruct.Alternate = QSPI_FLASH_BK1_IO3_AF;
|
|||
|
HAL_GPIO_Init(QSPI_FLASH_BK1_IO3_PORT, &GPIO_InitStruct);
|
|||
|
|
|||
|
/*!< <20><><EFBFBD><EFBFBD> SPI_FLASH_SPI <20><><EFBFBD><EFBFBD>: NCS */
|
|||
|
GPIO_InitStruct.Pin = QSPI_FLASH_CS_PIN;
|
|||
|
GPIO_InitStruct.Alternate = QSPI_FLASH_CS_GPIO_AF;
|
|||
|
HAL_GPIO_Init(QSPI_FLASH_CS_GPIO_PORT, &GPIO_InitStruct);
|
|||
|
|
|||
|
#if USE_DUAL_ExtFLASH
|
|||
|
/*!< <20><><EFBFBD><EFBFBD> QSPI_FLASH_BK2 <20><><EFBFBD><EFBFBD>: IO0 */
|
|||
|
GPIO_InitStruct.Pin = QSPI_FLASH_BK2_IO0_PIN;
|
|||
|
GPIO_InitStruct.Alternate = QSPI_FLASH_BK2_IO0_AF;
|
|||
|
HAL_GPIO_Init(QSPI_FLASH_BK2_IO0_PORT, &GPIO_InitStruct);
|
|||
|
|
|||
|
/*!< <20><><EFBFBD><EFBFBD> QSPI_FLASH_BK2 <20><><EFBFBD><EFBFBD>: IO1 */
|
|||
|
GPIO_InitStruct.Pin = QSPI_FLASH_BK2_IO1_PIN;
|
|||
|
GPIO_InitStruct.Alternate = QSPI_FLASH_BK2_IO1_AF;
|
|||
|
HAL_GPIO_Init(QSPI_FLASH_BK2_IO1_PORT, &GPIO_InitStruct);
|
|||
|
|
|||
|
/*!< <20><><EFBFBD><EFBFBD> QSPI_FLASH_BK2 <20><><EFBFBD><EFBFBD>: IO2 */
|
|||
|
GPIO_InitStruct.Pin = QSPI_FLASH_BK2_IO2_PIN;
|
|||
|
GPIO_InitStruct.Alternate = QSPI_FLASH_BK2_IO2_AF;
|
|||
|
HAL_GPIO_Init(QSPI_FLASH_BK2_IO2_PORT, &GPIO_InitStruct);
|
|||
|
|
|||
|
/*!< <20><><EFBFBD><EFBFBD> QSPI_FLASH_BK2 <20><><EFBFBD><EFBFBD>: IO3 */
|
|||
|
GPIO_InitStruct.Pin = QSPI_FLASH_BK2_IO3_PIN;
|
|||
|
GPIO_InitStruct.Alternate = QSPI_FLASH_BK2_IO3_AF;
|
|||
|
HAL_GPIO_Init(QSPI_FLASH_BK2_IO3_PORT, &GPIO_InitStruct);
|
|||
|
#endif
|
|||
|
|
|||
|
/* QSPI_FLASH ģʽ<C4A3><CABD><EFBFBD><EFBFBD> */
|
|||
|
QSPIHandle.Instance = QUADSPI;
|
|||
|
/*<2A><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>ʱ<EFBFBD><CAB1>Ϊ216/(1+1)=108MHz */
|
|||
|
QSPIHandle.Init.ClockPrescaler = 1;
|
|||
|
/*FIFO <20><>ֵΪ 4 <20><><EFBFBD>ֽ<EFBFBD>*/
|
|||
|
QSPIHandle.Init.FifoThreshold = 32;
|
|||
|
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|||
|
QSPIHandle.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
|
|||
|
#if USE_DUAL_ExtFLASH
|
|||
|
/*Flash<73><68>СΪ64M<34>ֽڣ<D6BD>2^26<32><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡȨֵ26-1=25*/
|
|||
|
QSPIHandle.Init.FlashSize = 25;
|
|||
|
#else
|
|||
|
/*Flash<73><68>СΪ32M<32>ֽڣ<D6BD>2^25<32><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡȨֵ25-1=24*/
|
|||
|
QSPIHandle.Init.FlashSize = 24;
|
|||
|
#endif
|
|||
|
/*Ƭѡ<C6AC>ߵ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>50ns<6E><73><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>6*9.2ns =55.2ns*/
|
|||
|
QSPIHandle.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_6_CYCLE;
|
|||
|
/*ʱ<><CAB1>ģʽѡ<CABD><D1A1>ģʽ0<CABD><30>nCSΪ<53>ߵ<EFBFBD>ƽ<EFBFBD><C6BD>Ƭѡ<C6AC>ͷţ<CDB7>ʱ<EFBFBD><CAB1>CLK<4C><4B><EFBFBD>뱣<EFBFBD>ֵ͵<D6B5>ƽ*/
|
|||
|
QSPIHandle.Init.ClockMode = QSPI_CLOCK_MODE_0;
|
|||
|
/*<2A><><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>һƬFlash*/
|
|||
|
QSPIHandle.Init.FlashID = QSPI_FLASH_ID_1;
|
|||
|
#if USE_DUAL_ExtFLASH
|
|||
|
/*ʹ<><CAB9>˫<EFBFBD><CBAB><EFBFBD><EFBFBD>ģʽ*/
|
|||
|
QSPIHandle.Init.DualFlash= QSPI_DUALFLASH_ENABLE;
|
|||
|
#endif
|
|||
|
HAL_QSPI_Init(&QSPIHandle);
|
|||
|
/*<2A><>ʼ<EFBFBD><CABC>QSPI<50>ӿ<EFBFBD>*/
|
|||
|
BSP_QSPI_Init();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>QSPIΪ<EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><EFBFBD>ģʽ
|
|||
|
* @retval QSPI<EFBFBD>ڴ<EFBFBD>״̬
|
|||
|
*/
|
|||
|
uint32_t QSPI_EnableMemoryMappedMode(void)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
QSPI_MemoryMappedTypeDef s_mem_mapped_cfg;
|
|||
|
|
|||
|
/* <20><><EFBFBD>ö<EFBFBD>ָ<EFBFBD><D6B8> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = QUAD_INOUT_FAST_READ_CMD_4BYTE;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_4_LINES;
|
|||
|
s_command.AddressSize = QSPI_ADDRESS_32_BITS;
|
|||
|
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;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><D3B3>ģʽ */
|
|||
|
s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
|
|||
|
s_mem_mapped_cfg.TimeOutPeriod = 0;
|
|||
|
|
|||
|
if (HAL_QSPI_MemoryMapped(&QSPIHandle, &s_command, &s_mem_mapped_cfg) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>QSPI<EFBFBD>洢<EFBFBD><EFBFBD>
|
|||
|
* @retval QSPI<EFBFBD>洢<EFBFBD><EFBFBD>״̬
|
|||
|
*/
|
|||
|
uint8_t BSP_QSPI_Init(void)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
uint8_t value = W25Q256JV_FSR_QE;
|
|||
|
|
|||
|
/* QSPI<50>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD>λ */
|
|||
|
if (QSPI_ResetMemory() != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_NOT_SUPPORTED;
|
|||
|
}
|
|||
|
|
|||
|
/* ʹ<><CAB9>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_WriteEnable() != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·ʹ<C2B7>ܵ<EFBFBD>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>IO2<4F><32>IO3<4F><33><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = WRITE_STATUS_REG2_CMD;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_NONE;
|
|||
|
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
|
|||
|
s_command.DataMode = QSPI_DATA_1_LINE;
|
|||
|
s_command.DummyCycles = 0;
|
|||
|
s_command.NbData = 1;
|
|||
|
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
|
|||
|
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
|
|||
|
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Transmit(&QSPIHandle, &value, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
/* <20>Զ<EFBFBD><D4B6><EFBFBD>ѯģʽ<C4A3>ȴ<EFBFBD><C8B4>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_AutoPollingMemReady(W25Q256JV_SUBSECTOR_ERASE_MAX_TIME) != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD>õ<EFBFBD>ַģʽΪ 4 <20>ֽ<EFBFBD> */
|
|||
|
if (QSPI_Addr_Mode_Init() != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽڵ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ4<EFBFBD>ֽ<EFBFBD>
|
|||
|
* @retval QSPI<EFBFBD>洢<EFBFBD><EFBFBD>״̬
|
|||
|
*/
|
|||
|
static uint8_t QSPI_Addr_Mode_Init(void)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
uint8_t reg;
|
|||
|
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = READ_STATUS_REG3_CMD;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_NONE;
|
|||
|
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
|
|||
|
s_command.DataMode = QSPI_DATA_1_LINE;
|
|||
|
s_command.DummyCycles = 0;
|
|||
|
s_command.NbData = 1;
|
|||
|
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
|
|||
|
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
|
|||
|
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Receive(&QSPIHandle, ®, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ֵ */
|
|||
|
if((reg & W25Q256FV_FSR_4ByteAddrMode) == 1) // 4<>ֽ<EFBFBD>ģʽ
|
|||
|
{
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
else // 3<>ֽ<EFBFBD>ģʽ
|
|||
|
{
|
|||
|
/* <20><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD> 4 <20>ֽڵ<D6BD>ַģʽ<C4A3><CABD><EFBFBD><EFBFBD> */
|
|||
|
s_command.Instruction = Enter_4Byte_Addr_Mode_CMD;
|
|||
|
s_command.DataMode = QSPI_DATA_NONE;
|
|||
|
|
|||
|
/* <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20>Զ<EFBFBD><D4B6><EFBFBD>ѯģʽ<C4A3>ȴ<EFBFBD><C8B4>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_AutoPollingMemReady(W25Q256JV_SUBSECTOR_ERASE_MAX_TIME) != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>QSPI<EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
* @param pData: ָ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* @param ReadAddr: <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
|
|||
|
* @param Size: Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С
|
|||
|
* @retval QSPI<EFBFBD>洢<EFBFBD><EFBFBD>״̬
|
|||
|
*/
|
|||
|
uint8_t BSP_QSPI_FastRead(uint8_t* pData, uint32_t ReadAddr, uint32_t Size)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
|
|||
|
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = QUAD_INOUT_FAST_READ_CMD_4BYTE;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_4_LINES;
|
|||
|
s_command.AddressSize = QSPI_ADDRESS_32_BITS;
|
|||
|
s_command.Address = ReadAddr;
|
|||
|
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
|
|||
|
s_command.DataMode = QSPI_DATA_4_LINES;
|
|||
|
s_command.DummyCycles = 6;
|
|||
|
s_command.NbData = Size;
|
|||
|
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
|
|||
|
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
|
|||
|
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Receive(&QSPIHandle, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>QSPI<EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
* @note <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>50MHzһ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param pData: ָ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* @param ReadAddr: <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
|
|||
|
* @param Size: Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С
|
|||
|
* @retval QSPI<EFBFBD>洢<EFBFBD><EFBFBD>״̬
|
|||
|
*/
|
|||
|
uint8_t BSP_QSPI_Read(uint8_t* pData, uint32_t ReadAddr, uint32_t Size)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = READ_CMD_4BYTE; //READ_CMD;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_1_LINE;
|
|||
|
s_command.AddressSize = QSPI_ADDRESS_32_BITS;
|
|||
|
s_command.Address = ReadAddr;
|
|||
|
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
|
|||
|
s_command.DataMode = QSPI_DATA_1_LINE;
|
|||
|
s_command.DummyCycles = 0;
|
|||
|
s_command.NbData = Size;
|
|||
|
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
|
|||
|
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
|
|||
|
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Receive(&QSPIHandle, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>QSPI<EFBFBD>洢<EFBFBD><EFBFBD>
|
|||
|
* @param pData: ָ<EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* @param WriteAddr: д<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
|
|||
|
* @param Size: Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С
|
|||
|
* @retval QSPI<EFBFBD>洢<EFBFBD><EFBFBD>״̬
|
|||
|
*/
|
|||
|
uint8_t BSP_QSPI_Write(uint8_t* pData, uint32_t WriteAddr, uint32_t Size)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
uint32_t end_addr, current_size, current_addr;
|
|||
|
/* <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ҳ<EFBFBD><D2B3>ĩβ֮<CEB2><D6AE><EFBFBD>Ĵ<EFBFBD>С */
|
|||
|
current_addr = 0;
|
|||
|
|
|||
|
while (current_addr <= WriteAddr)
|
|||
|
{
|
|||
|
current_addr += W25Q256JV_PAGE_SIZE;
|
|||
|
}
|
|||
|
current_size = current_addr - WriteAddr;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĴ<DDB5>С<EFBFBD>Ƿ<EFBFBD>С<EFBFBD><D0A1>ҳ<EFBFBD><D2B3><EFBFBD>е<EFBFBD>ʣ<EFBFBD><CAA3>λ<EFBFBD><CEBB> */
|
|||
|
if (current_size > Size)
|
|||
|
{
|
|||
|
current_size = Size;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD> */
|
|||
|
current_addr = WriteAddr;
|
|||
|
end_addr = WriteAddr + Size;
|
|||
|
|
|||
|
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = EXT_QUAD_IN_FAST_PROG_CMD_4BYTE;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_1_LINE;
|
|||
|
s_command.AddressSize = QSPI_ADDRESS_32_BITS;
|
|||
|
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
|
|||
|
s_command.DataMode = QSPI_DATA_4_LINES;
|
|||
|
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;
|
|||
|
|
|||
|
/* <20><>ҳִ<D2B3><D6B4>д<EFBFBD><D0B4> */
|
|||
|
do
|
|||
|
{
|
|||
|
s_command.Address = current_addr;
|
|||
|
s_command.NbData = current_size;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_WriteEnable() != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Transmit(&QSPIHandle, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ѯģʽ<C4A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_AutoPollingMemReady(HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һҳ<D2BB><D2B3><EFBFBD>̵ĵ<CCB5>ַ<EFBFBD>ʹ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD> */
|
|||
|
current_addr += current_size;
|
|||
|
pData += current_size;
|
|||
|
current_size = ((current_addr + W25Q256JV_PAGE_SIZE) > end_addr) ? (end_addr - current_addr) : W25Q256JV_PAGE_SIZE;
|
|||
|
} while (current_addr < end_addr);
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>QSPI<EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param SectorAddress: <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
* @retval QSPI<EFBFBD>洢<EFBFBD><EFBFBD>״̬
|
|||
|
*/
|
|||
|
uint8_t BSP_QSPI_Erase_Sector(uint32_t SectorAddress)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = SECTOR_ERASE_CMD_4BYTE;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_1_LINE;
|
|||
|
s_command.AddressSize = QSPI_ADDRESS_32_BITS;
|
|||
|
s_command.Address = SectorAddress;
|
|||
|
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;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_WriteEnable() != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ѯģʽ<C4A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_AutoPollingMemReady(W25Q256JV_SECTOR_ERASE_MAX_TIME) != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>QSPI<EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>飬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С32k
|
|||
|
* @param BlockAddress: <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
* @retval QSPI<EFBFBD>洢<EFBFBD><EFBFBD>״̬
|
|||
|
*/
|
|||
|
uint8_t BSP_QSPI_Erase_Block32(uint32_t BlockAddress)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = BLOCK32_ERASE_CMD;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_1_LINE;
|
|||
|
s_command.AddressSize = QSPI_ADDRESS_32_BITS;
|
|||
|
s_command.Address = BlockAddress;
|
|||
|
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;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_WriteEnable() != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ѯģʽ<C4A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_AutoPollingMemReady(W25Q256JV_SECTOR_ERASE_MAX_TIME) != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>QSPI<EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>飬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С64k
|
|||
|
* @param BlockAddress: <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
* @retval QSPI<EFBFBD>洢<EFBFBD><EFBFBD>״̬
|
|||
|
*/
|
|||
|
uint8_t BSP_QSPI_Erase_Block64(uint32_t BlockAddress)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = BLOCK64_ERASE_CMD_4BYTE;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_1_LINE;
|
|||
|
s_command.AddressSize = QSPI_ADDRESS_32_BITS;
|
|||
|
s_command.Address = BlockAddress;
|
|||
|
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;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_WriteEnable() != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ѯģʽ<C4A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_AutoPollingMemReady(W25Q256JV_SECTOR_ERASE_MAX_TIME) != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QSPI<EFBFBD>洢<EFBFBD><EFBFBD>
|
|||
|
* @retval QSPI<EFBFBD>洢<EFBFBD><EFBFBD>״̬
|
|||
|
*/
|
|||
|
uint8_t BSP_QSPI_Erase_Chip(void)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = CHIP_ERASE_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;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_WriteEnable() != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ѯģʽ<C4A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_AutoPollingMemReady(W25Q256JV_BULK_ERASE_MAX_TIME) != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ȡQSPI<EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ǰ״̬
|
|||
|
* @retval QSPI<EFBFBD>洢<EFBFBD><EFBFBD>״̬
|
|||
|
*/
|
|||
|
uint8_t BSP_QSPI_GetStatus(void)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
uint8_t reg;
|
|||
|
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = READ_STATUS_REG1_CMD;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_NONE;
|
|||
|
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
|
|||
|
s_command.DataMode = QSPI_DATA_1_LINE;
|
|||
|
s_command.DummyCycles = 0;
|
|||
|
s_command.NbData = 1;
|
|||
|
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
|
|||
|
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
|
|||
|
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Receive(&QSPIHandle, ®, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ֵ */
|
|||
|
if((reg & W25Q256JV_FSR_BUSY) != 0)
|
|||
|
{
|
|||
|
return QSPI_BUSY;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>QSPI<EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param pInfo: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ýṹ<EFBFBD>ϵ<EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* @retval QSPI<EFBFBD>洢<EFBFBD><EFBFBD>״̬
|
|||
|
*/
|
|||
|
uint8_t BSP_QSPI_GetInfo(QSPI_Info* pInfo)
|
|||
|
{
|
|||
|
/* <20><><EFBFBD>ô洢<C3B4><E6B4A2><EFBFBD><EFBFBD><EFBFBD>ýṹ */
|
|||
|
pInfo->FlashSize = W25Q256JV_FLASH_SIZE;
|
|||
|
pInfo->EraseSectorSize = W25Q256JV_SECTOR_SIZE;
|
|||
|
pInfo->EraseSectorsNumber = (W25Q256JV_FLASH_SIZE/W25Q256JV_SECTOR_SIZE);
|
|||
|
pInfo->ProgPageSize = W25Q256JV_PAGE_SIZE;
|
|||
|
pInfo->ProgPagesNumber = (W25Q256JV_FLASH_SIZE/W25Q256JV_PAGE_SIZE);
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>λQSPI<EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param QSPIHandle: QSPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
static uint8_t QSPI_ResetMemory()
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>λʹ<CEBB><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = RESET_ENABLE_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;
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>λ<EFBFBD>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
s_command.Instruction = RESET_MEMORY_CMD;
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ѯģʽ<C4A3>ȴ<EFBFBD><C8B4>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_AutoPollingMemReady(HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч.
|
|||
|
* @param QSPIHandle: QSPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
static uint8_t QSPI_WriteEnable()
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
QSPI_AutoPollingTypeDef s_config;
|
|||
|
/* <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = WRITE_ENABLE_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;
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ѯģʽ<C4A3>ȴ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
|
|||
|
s_config.Match = W25Q256JV_FSR_WREN;
|
|||
|
s_config.Mask = W25Q256JV_FSR_WREN;
|
|||
|
s_config.MatchMode = QSPI_MATCH_MODE_AND;
|
|||
|
s_config.StatusBytesSize = 1;
|
|||
|
s_config.Interval = 0x10;
|
|||
|
s_config.AutomaticStop = QSPI_AUTOMATIC_STOP_ENABLE;
|
|||
|
|
|||
|
s_command.Instruction = READ_STATUS_REG1_CMD;
|
|||
|
s_command.DataMode = QSPI_DATA_1_LINE;
|
|||
|
s_command.NbData = 1;
|
|||
|
|
|||
|
if (HAL_QSPI_AutoPolling(&QSPIHandle, &s_command, &s_config, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD>洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>SR<EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>EOP
|
|||
|
* @param QSPIHandle: QSPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param Timeout <EFBFBD><EFBFBD>ʱ
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
static uint8_t QSPI_AutoPollingMemReady(uint32_t Timeout)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
QSPI_AutoPollingTypeDef s_config;
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ѯģʽ<C4A3>ȴ<EFBFBD><C8B4>洢<EFBFBD><E6B4A2><EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = READ_STATUS_REG1_CMD;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_NONE;
|
|||
|
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
|
|||
|
s_command.DataMode = QSPI_DATA_1_LINE;
|
|||
|
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;
|
|||
|
|
|||
|
s_config.Match = 0x00;
|
|||
|
s_config.Mask = W25Q256JV_FSR_BUSY;
|
|||
|
s_config.MatchMode = QSPI_MATCH_MODE_AND;
|
|||
|
s_config.StatusBytesSize = 1;
|
|||
|
s_config.Interval = 0x10;
|
|||
|
s_config.AutomaticStop = QSPI_AUTOMATIC_STOP_ENABLE;
|
|||
|
|
|||
|
if (HAL_QSPI_AutoPolling(&QSPIHandle, &s_command, &s_config, Timeout) != HAL_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ȡFLASH ID
|
|||
|
* @param <EFBFBD><EFBFBD>
|
|||
|
* @retval FLASH ID
|
|||
|
*/
|
|||
|
uint32_t QSPI_FLASH_ReadID(void)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
uint32_t Temp = 0;
|
|||
|
uint8_t pData[3];
|
|||
|
/* <20><>ȡJEDEC ID */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = READ_JEDEC_ID_CMD;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_NONE;
|
|||
|
s_command.DataMode = QSPI_DATA_1_LINE;
|
|||
|
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
|
|||
|
s_command.DummyCycles = 0;
|
|||
|
s_command.NbData = 3;
|
|||
|
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
|
|||
|
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
|
|||
|
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
|
|||
|
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
printf("something wrong ....\r\n");
|
|||
|
/* <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
while(1)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
if (HAL_QSPI_Receive(&QSPIHandle, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
printf("something wrong ....\r\n");
|
|||
|
/* <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
while(1)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Temp = ( pData[2] | pData[1]<<8 )| ( pData[0]<<16 );
|
|||
|
|
|||
|
return Temp;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ȡFLASH Device ID
|
|||
|
* @param <EFBFBD><EFBFBD>
|
|||
|
* @retval FLASH Device ID
|
|||
|
*/
|
|||
|
uint32_t QSPI_FLASH_ReadDeviceID(void)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
uint32_t Temp = 0;
|
|||
|
uint8_t pData[3];
|
|||
|
/*##-2-<2D><>ȡ<EFBFBD>豸ID<49><44><EFBFBD><EFBFBD> ###########################################*/
|
|||
|
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>/<2F>豸 ID */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
s_command.Instruction = READ_ID_CMD;
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_1_LINE;
|
|||
|
s_command.AddressSize = QSPI_ADDRESS_24_BITS;
|
|||
|
s_command.Address = 0x000000;
|
|||
|
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
|
|||
|
s_command.DataMode = QSPI_DATA_1_LINE;
|
|||
|
s_command.DummyCycles = 0;
|
|||
|
s_command.NbData = 2;
|
|||
|
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
|
|||
|
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
|
|||
|
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
|
|||
|
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
printf("something wrong ....\r\n");
|
|||
|
/* <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
while(1)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
if (HAL_QSPI_Receive(&QSPIHandle, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
printf("something wrong ....\r\n");
|
|||
|
/* <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
while(1)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Temp = pData[1] |( pData[0]<<8 ) ;
|
|||
|
|
|||
|
return Temp;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ȡReadStatusReg
|
|||
|
* @param <EFBFBD><EFBFBD>
|
|||
|
* @retval ReadStatusReg
|
|||
|
*/
|
|||
|
uint32_t QSPI_FLASH_ReadStatusReg(uint8_t reg)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
uint32_t Temp = 0;
|
|||
|
uint8_t pData[10];
|
|||
|
|
|||
|
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>/<2F>豸 ID */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
if(reg == 1)
|
|||
|
s_command.Instruction = READ_STATUS_REG1_CMD;
|
|||
|
else if(reg == 2)
|
|||
|
s_command.Instruction = READ_STATUS_REG2_CMD;
|
|||
|
else if(reg == 3)
|
|||
|
s_command.Instruction = READ_STATUS_REG3_CMD;
|
|||
|
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_1_LINE;
|
|||
|
s_command.AddressSize = QSPI_ADDRESS_32_BITS;
|
|||
|
s_command.Address = 0x000000;
|
|||
|
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
|
|||
|
s_command.DataMode = QSPI_DATA_1_LINE;
|
|||
|
s_command.DummyCycles = 0;
|
|||
|
s_command.NbData = 1;
|
|||
|
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
|
|||
|
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
|
|||
|
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
|
|||
|
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
printf("something wrong ....\r\n");
|
|||
|
/* <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
while(1)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
if (HAL_QSPI_Receive(&QSPIHandle, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
printf("something wrong ....\r\n");
|
|||
|
/* <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
while(1)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//<2F><>flashʱ<68><CAB1>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>ΪpData[0]<5D><>pData[1]
|
|||
|
//Temp = pData[0] |( pData[1]<<8 ) ;
|
|||
|
|
|||
|
//˫flashʱ<68><CAB1>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>ΪpData[0]<5D><>pData[2]
|
|||
|
//Temp = pData[1] |( pData[0]<<8 ) ;
|
|||
|
Temp = pData[0] ;
|
|||
|
return Temp;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ȡReadStatusReg
|
|||
|
* @param <EFBFBD><EFBFBD>
|
|||
|
* @retval ReadStatusReg
|
|||
|
*/
|
|||
|
uint32_t QSPI_FLASH_WriteStatusReg(uint8_t reg,uint8_t regvalue)
|
|||
|
{
|
|||
|
QSPI_CommandTypeDef s_command;
|
|||
|
|
|||
|
/* ʹ<><CAB9>д<EFBFBD><D0B4><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_WriteEnable() != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>/<2F>豸 ID */
|
|||
|
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
|
|||
|
if(reg == 1)
|
|||
|
s_command.Instruction = WRITE_STATUS_REG1_CMD;
|
|||
|
else if(reg == 2)
|
|||
|
s_command.Instruction = WRITE_STATUS_REG2_CMD;
|
|||
|
else if(reg == 3)
|
|||
|
s_command.Instruction = WRITE_STATUS_REG3_CMD;
|
|||
|
|
|||
|
s_command.AddressMode = QSPI_ADDRESS_NONE;
|
|||
|
s_command.AddressSize = QSPI_ADDRESS_8_BITS;
|
|||
|
s_command.Address = 0x000000;
|
|||
|
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
|
|||
|
s_command.DataMode = QSPI_DATA_1_LINE;
|
|||
|
s_command.DummyCycles = 0;
|
|||
|
s_command.NbData = 1;
|
|||
|
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
|
|||
|
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
|
|||
|
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
|
|||
|
|
|||
|
if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
printf("something wrong ....\r\n");
|
|||
|
/* <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
while(1)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
if (HAL_QSPI_Transmit(&QSPIHandle, ®value, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
|
|||
|
{
|
|||
|
printf("something wrong ....\r\n");
|
|||
|
/* <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
while(1)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
/* <20>Զ<EFBFBD><D4B6><EFBFBD>ѯģʽ<C4A3>ȴ<EFBFBD><C8B4>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
if (QSPI_AutoPollingMemReady(W25Q256JV_SUBSECTOR_ERASE_MAX_TIME) != QSPI_OK)
|
|||
|
{
|
|||
|
return QSPI_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
return QSPI_OK;
|
|||
|
}
|
|||
|
|
|||
|
void QSPI_Set_WP_High(void)
|
|||
|
{
|
|||
|
/*<2A><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>GPIO_InitTypeDef<65><66><EFBFBD>͵Ľṹ<C4BD><E1B9B9>*/
|
|||
|
GPIO_InitTypeDef GPIO_InitStruct;
|
|||
|
__GPIOF_CLK_ENABLE();
|
|||
|
/*ѡ<><D1A1>Ҫ<EFBFBD><D2AA><EFBFBD>Ƶ<EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>*/
|
|||
|
GPIO_InitStruct.Pin = GPIO_PIN_7;
|
|||
|
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
|||
|
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ*/
|
|||
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
|||
|
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD> */
|
|||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
|||
|
/*<2A><><EFBFBD>ÿ⺯<C3BF><E2BAAF><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>GPIO_InitStructure<72><65>ʼ<EFBFBD><CABC>GPIO*/
|
|||
|
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
|
|||
|
|
|||
|
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_7,1);
|
|||
|
}
|
|||
|
|
|||
|
void QSPI_Set_WP_TO_QSPI_IO(void)
|
|||
|
{
|
|||
|
/*<2A><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>GPIO_InitTypeDef<65><66><EFBFBD>͵Ľṹ<C4BD><E1B9B9>*/
|
|||
|
GPIO_InitTypeDef GPIO_InitStruct;
|
|||
|
QSPI_FLASH_BK1_IO2_CLK_ENABLE();
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
|||
|
/*!< <20><><EFBFBD><EFBFBD> QSPI_FLASH <20><><EFBFBD><EFBFBD>: IO2 */
|
|||
|
GPIO_InitStruct.Pin = QSPI_FLASH_BK1_IO2_PIN;
|
|||
|
GPIO_InitStruct.Alternate = QSPI_FLASH_BK1_IO2_AF;
|
|||
|
HAL_GPIO_Init(QSPI_FLASH_BK1_IO2_PORT, &GPIO_InitStruct);
|
|||
|
}
|
|||
|
|
|||
|
/*********************************************END OF FILE**********************/
|