323 lines
8.9 KiB
C
Raw 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_HandleTypeDef QSPI_Handler; //QSPI<50><49><EFBFBD><EFBFBD>
/**********************************************************************/
//<2F>ȴ<EFBFBD>״̬<D7B4><CCAC>־
//flag:<3A><>Ҫ<EFBFBD>ȴ<EFBFBD><C8B4>ı<EFBFBD>־λ
//sta:<3A><>Ҫ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>״̬
//wtime:<3A>ȴ<EFBFBD>ʱ<EFBFBD><CAB1>
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ȴ<EFBFBD><C8B4>ɹ<EFBFBD>.
// 1,<2C>ȴ<EFBFBD>ʧ<EFBFBD><CAA7>.
//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_Wait_Flag(u32 flag,u8 sta,u32 wtime)
{
u8 flagsta=0;
while(wtime)
{
flagsta=(QUADSPI->SR&flag)?1:0;
if(flagsta==sta)break;
wtime--;
}
if(wtime)return 0;
else return 1;
}
/**********************************************************************/
//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
/**********************************************************************/
u8 QSPI_Init(void)
{
QSPI_Handler.Instance=QUADSPI; //QSPI
QSPI_Handler.Init.ClockPrescaler=1; //QPSI<53><49>Ƶ<EFBFBD>ȣ<EFBFBD>W25Q256<35><36><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>
//cmd:Ҫ<><D2AA><EFBFBD>͵<EFBFBD>ָ<EFBFBD><D6B8>
//addr:<3A><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>Ŀ<EFBFBD>ĵ<EFBFBD>ַ
//mode:ģʽ,<2C><>ϸλ<CFB8><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// mode[1:0]:ָ<><D6B8>ģʽ;00,<2C><>ָ<EFBFBD><D6B8>;01,<2C><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>;10,˫<>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>;11,<2C><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>.
// mode[3:2]:<3A><>ַģʽ;00,<2C>޵<EFBFBD>ַ;01,<2C><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ַ;10,˫<>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ַ;11,<2C><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ַ.
// mode[5:4]:<3A><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>;00,8λ<38><CEBB>ַ;01,16λ<36><CEBB>ַ;10,24λ<34><CEBB>ַ;11,32λ<32><CEBB>ַ.
// mode[7:6]:<3A><><EFBFBD><EFBFBD>ģʽ;00,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;01,<2C><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;10,˫<>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;11,<2C><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
//dmcycle:<3A><>ָ<EFBFBD><D6B8><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
/**********************************************************************/
void QSPI_Send_CMD(u8 cmd,u32 addr,u8 mode,u8 dmcycle)
{
QSPI_CommandTypeDef Cmdhandler;
Cmdhandler.Instruction=cmd; //ָ<><D6B8>
Cmdhandler.Address=addr; //<2F><>ַ
Cmdhandler.DummyCycles=dmcycle; //<2F><><EFBFBD>ÿ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(((mode>>0)&0x03) == 0)
Cmdhandler.InstructionMode=QSPI_INSTRUCTION_NONE; //ָ<><D6B8>ģʽ
else if(((mode>>0)&0x03) == 1)
Cmdhandler.InstructionMode=QSPI_INSTRUCTION_1_LINE; //ָ<><D6B8>ģʽ
else if(((mode>>0)&0x03) == 2)
Cmdhandler.InstructionMode=QSPI_INSTRUCTION_2_LINES; //ָ<><D6B8>ģʽ
else if(((mode>>0)&0x03) == 3)
Cmdhandler.InstructionMode=QSPI_INSTRUCTION_4_LINES; //ָ<><D6B8>ģʽ
if(((mode>>2)&0x03) == 0)
Cmdhandler.AddressMode=QSPI_ADDRESS_NONE; //<2F><>ַģʽ
else if(((mode>>2)&0x03) == 1)
Cmdhandler.AddressMode=QSPI_ADDRESS_1_LINE; //<2F><>ַģʽ
else if(((mode>>2)&0x03) == 2)
Cmdhandler.AddressMode=QSPI_ADDRESS_2_LINES; //<2F><>ַģʽ
else if(((mode>>2)&0x03) == 3)
Cmdhandler.AddressMode=QSPI_ADDRESS_4_LINES; //<2F><>ַģʽ
if(((mode>>4)&0x03) == 0)
Cmdhandler.AddressSize=QSPI_ADDRESS_8_BITS; //<2F><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
else if(((mode>>4)&0x03) == 1)
Cmdhandler.AddressSize=QSPI_ADDRESS_16_BITS; //<2F><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
else if(((mode>>4)&0x03) == 2)
Cmdhandler.AddressSize=QSPI_ADDRESS_24_BITS; //<2F><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
else if(((mode>>4)&0x03) == 3)
Cmdhandler.AddressSize=QSPI_ADDRESS_32_BITS; //<2F><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
if(((mode>>6)&0x03) == 0)
Cmdhandler.DataMode=QSPI_DATA_NONE; //<2F><><EFBFBD><EFBFBD>ģʽ
else if(((mode>>6)&0x03) == 1)
Cmdhandler.DataMode=QSPI_DATA_1_LINE; //<2F><><EFBFBD><EFBFBD>ģʽ
else if(((mode>>6)&0x03) == 2)
Cmdhandler.DataMode=QSPI_DATA_2_LINES; //<2F><><EFBFBD><EFBFBD>ģʽ
else if(((mode>>6)&0x03) == 3)
Cmdhandler.DataMode=QSPI_DATA_4_LINES; //<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;
}
/**********************************************************************/
//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
/**********************************************************************/