247 lines
7.3 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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
//所以此处应该为2QSPI频率就为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
/************************************************************/