247 lines
7.3 KiB
C
247 lines
7.3 KiB
C
#include "qspi.h"
|
||
#include "delay.h"
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
/************************************************************/
|
||
|
||
//QSPI驱动代码
|
||
|
||
//STM32H7工程模板-HAL库函数版本
|
||
//DevEBox 大越创新
|
||
//淘宝店铺:mcudev.taobao.com
|
||
//淘宝店铺:shop389957290.taobao.com
|
||
|
||
/************************************************************/
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/************************************************************/
|
||
|
||
///QSPI初始化
|
||
|
||
//STM32H7工程模板-HAL库函数版本
|
||
//DevEBox 大越创新
|
||
//淘宝店铺:mcudev.taobao.com
|
||
//淘宝店铺:shop389957290.taobao.com
|
||
|
||
/************************************************************/
|
||
|
||
QSPI_HandleTypeDef QSPI_Handler; //QSPI句柄
|
||
|
||
|
||
u8 QSPI_Init(void)
|
||
{
|
||
QSPI_Handler.Instance=QUADSPI; //QSPI
|
||
QSPI_Handler.Init.ClockPrescaler=1; //QPSI分频比,W25Q64最大频率为104M,
|
||
//所以此处应该为2,QSPI频率就为200/(1+1)=100MHZ
|
||
QSPI_Handler.Init.FifoThreshold=4; //FIFO阈值为4个字节
|
||
QSPI_Handler.Init.SampleShifting=QSPI_SAMPLE_SHIFTING_HALFCYCLE;//采样移位半个周期(DDR模式下,必须设置为0)
|
||
QSPI_Handler.Init.FlashSize=POSITION_VAL(0X800000)-1; //SPI FLASH大小,W25Q64大小为8M字节
|
||
QSPI_Handler.Init.ChipSelectHighTime=QSPI_CS_HIGH_TIME_5_CYCLE;//片选高电平时间为5个时钟(10*5=55ns),即手册里面的tSHSL参数
|
||
QSPI_Handler.Init.ClockMode=QSPI_CLOCK_MODE_0; //模式0
|
||
QSPI_Handler.Init.FlashID=QSPI_FLASH_ID_1; //第一片flash
|
||
QSPI_Handler.Init.DualFlash=QSPI_DUALFLASH_DISABLE; //禁止双闪存模式
|
||
if(HAL_QSPI_Init(&QSPI_Handler)==HAL_OK) return 0; //QSPI初始化成功
|
||
else return 1;
|
||
}
|
||
|
||
|
||
|
||
/**********************************************************************/
|
||
|
||
//QSPI底层驱动,引脚配置,时钟使能
|
||
//此函数会被HAL_QSPI_Init()调用
|
||
//hqspi:QSPI句柄
|
||
|
||
|
||
//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工程模板-HAL库函数版本
|
||
//DevEBox 大越创新
|
||
//淘宝店铺:mcudev.taobao.com
|
||
//淘宝店铺:shop389957290.taobao.com
|
||
|
||
/**********************************************************************/
|
||
|
||
|
||
void HAL_QSPI_MspInit(QSPI_HandleTypeDef *hqspi)
|
||
{
|
||
GPIO_InitTypeDef GPIO_Initure;
|
||
|
||
__HAL_RCC_QSPI_CLK_ENABLE(); //使能QSPI时钟
|
||
__HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟
|
||
__HAL_RCC_GPIOD_CLK_ENABLE(); //使能GPIOD时钟
|
||
__HAL_RCC_GPIOE_CLK_ENABLE(); //使能GPIOE时钟
|
||
|
||
//初始化PB6 片选信号
|
||
GPIO_Initure.Pin=GPIO_PIN_6;
|
||
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用
|
||
GPIO_Initure.Pull=GPIO_PULLUP;
|
||
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
|
||
GPIO_Initure.Alternate=GPIO_AF10_QUADSPI; //复用为QSPI
|
||
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
|
||
|
||
//初始化PB2 时钟信号
|
||
GPIO_Initure.Pin=GPIO_PIN_2;
|
||
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用
|
||
GPIO_Initure.Pull=GPIO_NOPULL;
|
||
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
|
||
GPIO_Initure.Alternate=GPIO_AF9_QUADSPI; //复用为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; //复用
|
||
GPIO_Initure.Pull=GPIO_NOPULL;
|
||
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
|
||
GPIO_Initure.Alternate=GPIO_AF9_QUADSPI; //复用为QSPI
|
||
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
|
||
|
||
//PE2-- QUADSPI_BK1_IO2
|
||
GPIO_Initure.Pin=GPIO_PIN_2;
|
||
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用
|
||
GPIO_Initure.Pull=GPIO_NOPULL;
|
||
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
|
||
GPIO_Initure.Alternate=GPIO_AF9_QUADSPI; //复用为QSPI
|
||
HAL_GPIO_Init(GPIOE,&GPIO_Initure);
|
||
}
|
||
|
||
|
||
|
||
/************************************************************************************************************************************/
|
||
|
||
//QSPI发送命令
|
||
//instruction:要发送的指令
|
||
//address:发送到的目的地址
|
||
//dummyCycles:空指令周期数
|
||
|
||
// instructionMode:指令模式;QSPI_INSTRUCTION_NONE,QSPI_INSTRUCTION_1_LINE,QSPI_INSTRUCTION_2_LINE,QSPI_INSTRUCTION_4_LINE
|
||
// addressMode:地址模式; QSPI_ADDRESS_NONE,QSPI_ADDRESS_1_LINE,QSPI_ADDRESS_2_LINE,QSPI_ADDRESS_4_LINE
|
||
// addressSize:地址长度;QSPI_ADDRESS_8_BITS,QSPI_ADDRESS_16_BITS,QSPI_ADDRESS_24_BITS,QSPI_ADDRESS_32_BITS
|
||
// dataMode:数据模式; QSPI_DATA_NONE,QSPI_DATA_1_LINE,QSPI_DATA_2_LINE,QSPI_DATA_4_LINE
|
||
|
||
//STM32H7工程模板-HAL库函数版本
|
||
//DevEBox 大越创新
|
||
//淘宝店铺:mcudev.taobao.com
|
||
//淘宝店铺: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; //指令
|
||
Cmdhandler.Address=address; //地址
|
||
Cmdhandler.DummyCycles=dummyCycles; //设置空指令周期数
|
||
Cmdhandler.InstructionMode=instructionMode; //指令模式
|
||
Cmdhandler.AddressMode=addressMode; //地址模式
|
||
Cmdhandler.AddressSize=addressSize; //地址长度
|
||
Cmdhandler.DataMode=dataMode; //数据模式
|
||
Cmdhandler.SIOOMode=QSPI_SIOO_INST_EVERY_CMD; //每次都发送指令
|
||
Cmdhandler.AlternateByteMode=QSPI_ALTERNATE_BYTES_NONE; //无交替字节
|
||
Cmdhandler.DdrMode=QSPI_DDR_MODE_DISABLE; //关闭DDR模式
|
||
Cmdhandler.DdrHoldHalfCycle=QSPI_DDR_HHC_ANALOG_DELAY;
|
||
|
||
HAL_QSPI_Command(&QSPI_Handler,&Cmdhandler,5000);
|
||
}
|
||
|
||
|
||
|
||
|
||
/************************************************************/
|
||
|
||
//QSPI接收指定长度的数据
|
||
//buf:接收数据缓冲区首地址
|
||
//datalen:要传输的数据长度
|
||
//返回值:0,正常
|
||
// 其他,错误代码
|
||
|
||
//STM32H7工程模板-HAL库函数版本
|
||
//DevEBox 大越创新
|
||
//淘宝店铺:mcudev.taobao.com
|
||
//淘宝店铺:shop389957290.taobao.com
|
||
|
||
/************************************************************/
|
||
|
||
u8 QSPI_Receive(u8* buf,u32 datalen)
|
||
{
|
||
QSPI_Handler.Instance->DLR=datalen-1; //配置数据长度
|
||
if(HAL_QSPI_Receive(&QSPI_Handler,buf,5000)==HAL_OK) return 0; //接收数据
|
||
else return 1;
|
||
}
|
||
|
||
|
||
|
||
/************************************************************/
|
||
|
||
//QSPI发送指定长度的数据
|
||
//buf:发送数据缓冲区首地址
|
||
//datalen:要传输的数据长度
|
||
//返回值:0,正常
|
||
// 其他,错误代码
|
||
|
||
//STM32H7工程模板-HAL库函数版本
|
||
//DevEBox 大越创新
|
||
//淘宝店铺:mcudev.taobao.com
|
||
//淘宝店铺:shop389957290.taobao.com
|
||
|
||
/************************************************************/
|
||
|
||
|
||
u8 QSPI_Transmit(u8* buf,u32 datalen)
|
||
{
|
||
QSPI_Handler.Instance->DLR=datalen-1; //配置数据长度
|
||
if(HAL_QSPI_Transmit(&QSPI_Handler,buf,5000)==HAL_OK) return 0; //发送数据
|
||
else return 1;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/************************************************************/
|
||
|
||
|
||
//STM32H7工程模板-HAL库函数版本
|
||
//DevEBox 大越创新
|
||
//淘宝店铺:mcudev.taobao.com
|
||
//淘宝店铺:shop389957290.taobao.com
|
||
|
||
/************************************************************/
|
||
|
||
|