247 lines
7.3 KiB
C
Raw Permalink Normal View History

2021-07-28 13:15:22 +08:00
#include "qspi.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
/************************************************************/
//QSPI<50><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
//////////////////////////////////////////////////////////////////////////////////
/************************************************************/
///QSPI<50><49>ʼ<EFBFBD><CABC>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
QSPI_HandleTypeDef QSPI_Handler; //QSPI<50><49><EFBFBD><EFBFBD>
u8 QSPI_Init(void)
{
QSPI_Handler.Instance=QUADSPI; //QSPI
QSPI_Handler.Init.ClockPrescaler=1; //QPSI<53><49>Ƶ<EFBFBD>ȣ<EFBFBD>W25Q64<36><34><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>Ϊ104M<34><4D>
//<2F><><EFBFBD>Դ˴<D4B4>Ӧ<EFBFBD><D3A6>Ϊ2<CEAA><32>QSPIƵ<49>ʾ<EFBFBD>Ϊ200/(1+1)=100MHZ
QSPI_Handler.Init.FifoThreshold=4; //FIFO<46><4F>ֵΪ4<CEAA><34><EFBFBD>ֽ<EFBFBD>
QSPI_Handler.Init.SampleShifting=QSPI_SAMPLE_SHIFTING_HALFCYCLE;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(DDRģʽ<C4A3><CABD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0)
QSPI_Handler.Init.FlashSize=POSITION_VAL(0X800000)-1; //SPI FLASH<53><48>С<EFBFBD><D0A1>W25Q64<36><34>СΪ8M<38>ֽ<EFBFBD>
QSPI_Handler.Init.ChipSelectHighTime=QSPI_CS_HIGH_TIME_5_CYCLE;//Ƭѡ<C6AC>ߵ<EFBFBD>ƽʱ<C6BD><CAB1>Ϊ5<CEAA><35>ʱ<EFBFBD><CAB1>(10*5=55ns),<2C><><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tSHSL<53><4C><EFBFBD><EFBFBD>
QSPI_Handler.Init.ClockMode=QSPI_CLOCK_MODE_0; //ģʽ0
QSPI_Handler.Init.FlashID=QSPI_FLASH_ID_1; //<2F><>һƬflash
QSPI_Handler.Init.DualFlash=QSPI_DUALFLASH_DISABLE; //<2F><>ֹ˫<D6B9><CBAB><EFBFBD><EFBFBD>ģʽ
if(HAL_QSPI_Init(&QSPI_Handler)==HAL_OK) return 0; //QSPI<50><49>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
else return 1;
}
/**********************************************************************/
//QSPI<50>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9>
//<2F>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>ᱻHAL_QSPI_Init()<29><><EFBFBD><EFBFBD>
//hqspi:QSPI<50><49><EFBFBD><EFBFBD>
//PB2,AF9 PB2-- QUADSPI_CLK
//PB6,AF10 PB6-- QSPI_BK1_NCS
//PD11,AF9 PD11-- QUADSPI_BK1_IO0
//PD12,AF9 PD12-- QUADSPI_BK1_IO1
//PD13,AF9 PD13-- QUADSPI_BK1_IO3
//PE2,AF9 PE2-- QUADSPI_BK1_IO2
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/**********************************************************************/
void HAL_QSPI_MspInit(QSPI_HandleTypeDef *hqspi)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_QSPI_CLK_ENABLE(); //ʹ<><CAB9>QSPIʱ<49><CAB1>
__HAL_RCC_GPIOB_CLK_ENABLE(); //ʹ<><CAB9>GPIOBʱ<42><CAB1>
__HAL_RCC_GPIOD_CLK_ENABLE(); //ʹ<><CAB9>GPIODʱ<44><CAB1>
__HAL_RCC_GPIOE_CLK_ENABLE(); //ʹ<><CAB9>GPIOEʱ<45><CAB1>
//<2F><>ʼ<EFBFBD><CABC>PB6 Ƭѡ<C6AC>ź<EFBFBD>
GPIO_Initure.Pin=GPIO_PIN_6;
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //<2F><><EFBFBD><EFBFBD>
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //<2F><><EFBFBD><EFBFBD>
GPIO_Initure.Alternate=GPIO_AF10_QUADSPI; //<2F><><EFBFBD><EFBFBD>ΪQSPI
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
//<2F><>ʼ<EFBFBD><CABC>PB2 ʱ<><CAB1><EFBFBD>ź<EFBFBD>
GPIO_Initure.Pin=GPIO_PIN_2;
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //<2F><><EFBFBD><EFBFBD>
GPIO_Initure.Pull=GPIO_NOPULL;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //<2F><><EFBFBD><EFBFBD>
GPIO_Initure.Alternate=GPIO_AF9_QUADSPI; //<2F><><EFBFBD><EFBFBD>ΪQSPI
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
//PD11-- QUADSPI_BK1_IO0 PD12-- QUADSPI_BK1_IO1 PD13-- QUADSPI_BK1_IO3
GPIO_Initure.Pin=GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13;
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //<2F><><EFBFBD><EFBFBD>
GPIO_Initure.Pull=GPIO_NOPULL;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //<2F><><EFBFBD><EFBFBD>
GPIO_Initure.Alternate=GPIO_AF9_QUADSPI; //<2F><><EFBFBD><EFBFBD>ΪQSPI
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
//PE2-- QUADSPI_BK1_IO2
GPIO_Initure.Pin=GPIO_PIN_2;
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //<2F><><EFBFBD><EFBFBD>
GPIO_Initure.Pull=GPIO_NOPULL;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //<2F><><EFBFBD><EFBFBD>
GPIO_Initure.Alternate=GPIO_AF9_QUADSPI; //<2F><><EFBFBD><EFBFBD>ΪQSPI
HAL_GPIO_Init(GPIOE,&GPIO_Initure);
}
/************************************************************************************************************************************/
//QSPI<50><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//instruction:Ҫ<><D2AA><EFBFBD>͵<EFBFBD>ָ<EFBFBD><D6B8>
//address:<3A><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>Ŀ<EFBFBD>ĵ<EFBFBD>ַ
//dummyCycles:<3A><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// instructionMode:ָ<><D6B8>ģʽ;QSPI_INSTRUCTION_NONE,QSPI_INSTRUCTION_1_LINE,QSPI_INSTRUCTION_2_LINE,QSPI_INSTRUCTION_4_LINE
// addressMode:<3A><>ַģʽ; QSPI_ADDRESS_NONE,QSPI_ADDRESS_1_LINE,QSPI_ADDRESS_2_LINE,QSPI_ADDRESS_4_LINE
// addressSize:<3A><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>;QSPI_ADDRESS_8_BITS,QSPI_ADDRESS_16_BITS,QSPI_ADDRESS_24_BITS,QSPI_ADDRESS_32_BITS
// dataMode:<3A><><EFBFBD><EFBFBD>ģʽ; QSPI_DATA_NONE,QSPI_DATA_1_LINE,QSPI_DATA_2_LINE,QSPI_DATA_4_LINE
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************************************************************************************/
void QSPI_Send_CMD(u32 instruction,u32 address,u32 dummyCycles,u32 instructionMode,u32 addressMode,u32 addressSize,u32 dataMode)
{
QSPI_CommandTypeDef Cmdhandler;
Cmdhandler.Instruction=instruction; //ָ<><D6B8>
Cmdhandler.Address=address; //<2F><>ַ
Cmdhandler.DummyCycles=dummyCycles; //<2F><><EFBFBD>ÿ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Cmdhandler.InstructionMode=instructionMode; //ָ<><D6B8>ģʽ
Cmdhandler.AddressMode=addressMode; //<2F><>ַģʽ
Cmdhandler.AddressSize=addressSize; //<2F><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
Cmdhandler.DataMode=dataMode; //<2F><><EFBFBD><EFBFBD>ģʽ
Cmdhandler.SIOOMode=QSPI_SIOO_INST_EVERY_CMD; //ÿ<>ζ<EFBFBD><CEB6><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
Cmdhandler.AlternateByteMode=QSPI_ALTERNATE_BYTES_NONE; //<2F>޽<EFBFBD><DEBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
Cmdhandler.DdrMode=QSPI_DDR_MODE_DISABLE; //<2F>ر<EFBFBD>DDRģʽ
Cmdhandler.DdrHoldHalfCycle=QSPI_DDR_HHC_ANALOG_DELAY;
HAL_QSPI_Command(&QSPI_Handler,&Cmdhandler,5000);
}
/************************************************************/
//QSPI<50><49><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>
//buf:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
//datalen:Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
u8 QSPI_Receive(u8* buf,u32 datalen)
{
QSPI_Handler.Instance->DLR=datalen-1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
if(HAL_QSPI_Receive(&QSPI_Handler,buf,5000)==HAL_OK) return 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else return 1;
}
/************************************************************/
//QSPI<50><49><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>
//buf:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ
//datalen:Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
u8 QSPI_Transmit(u8* buf,u32 datalen)
{
QSPI_Handler.Instance->DLR=datalen-1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
if(HAL_QSPI_Transmit(&QSPI_Handler,buf,5000)==HAL_OK) return 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else return 1;
}
/************************************************************/
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/