- static void QspiFlash_Init(void)
- {
- stc_qspi_init_t stcQspiInit;
- /* configuration structure initialization */
- MEM_ZERO_STRUCT(stcQspiInit);
- /* Configuration peripheral clock */
- PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_QSPI, Enable);
- /* Configuration QSPI pin */
- PORT_SetFunc(QSPCK_PORT, QSPCK_PIN, Func_Qspi, Disable);
- PORT_SetFunc(QSNSS_PORT, QSNSS_PIN, Func_Qspi, Disable);
- PORT_SetFunc(QSIO0_PORT, QSIO0_PIN, Func_Qspi, Disable);
- PORT_SetFunc(QSIO1_PORT, QSIO1_PIN, Func_Qspi, Disable);
- PORT_SetFunc(QSIO2_PORT, QSIO2_PIN, Func_Qspi, Disable);
- PORT_SetFunc(QSIO3_PORT, QSIO3_PIN, Func_Qspi, Disable);
- /* Configuration QSPI structure */
- stcQspiInit.enClkDiv = QspiHclkDiv3;
- stcQspiInit.enSpiMode = QspiSpiMode3;
- stcQspiInit.enBusCommMode = QspiBusModeRomAccess;
- stcQspiInit.enPrefetchMode = QspiPrefetchStopComplete;
- stcQspiInit.enPrefetchFuncEn = Disable;
- stcQspiInit.enQssnValidExtendTime = QspiQssnValidExtendSck32;
- stcQspiInit.enQssnIntervalTime = QspiQssnIntervalQsck8;
- stcQspiInit.enQsckDutyCorr = QspiQsckDutyCorrHalfHclk;
- stcQspiInit.enVirtualPeriod = QspiVirtualPeriodQsck8;
- stcQspiInit.enWpPinLevel = QspiWpPinOutputHigh;
- stcQspiInit.enQssnSetupDelayTime = QspiQssnSetupDelay1Dot5Qsck;
- stcQspiInit.enQssnHoldDelayTime = QspiQssnHoldDelay1Dot5Qsck;
- stcQspiInit.enFourByteAddrReadEn = Disable;
- stcQspiInit.enAddrWidth = QspiAddressByteThree;
- stcQspiInit.stcCommProtocol.enReadMode = QspiReadModeFourWiresOutput;
- stcQspiInit.stcCommProtocol.enTransInstrProtocol = QspiProtocolExtendSpi;
- stcQspiInit.stcCommProtocol.enTransAddrProtocol = QspiProtocolExtendSpi;
- stcQspiInit.stcCommProtocol.enReceProtocol = QspiProtocolExtendSpi;
- stcQspiInit.u8RomAccessInstr = QSPI_3BINSTR_FOUR_WIRES_OUTPUT_READ;
- QSPI_Init(&stcQspiInit);
- }
其实这部分配置代码特别好理解咱们分开来看
stc_qspi_init_t stcQspiInit;//首先是定义了一个stc_qspi_init_t 类型的局部变量stcQspiInit
MEM_ZERO_STRUCT(stcQspiInit);//对stcQspiInit初始化清零操作
PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_QSPI, Enable);//开启QSPI电源,也就是要用到这个功能了
//功能定义 引脚名称 功能
PORT_SetFunc(QSPCK_PORT, QSPCK_PIN, Func_Qspi, Disable);
PORT_SetFunc(QSNSS_PORT, QSNSS_PIN, Func_Qspi, Disable);
PORT_SetFunc(QSIO0_PORT, QSIO0_PIN, Func_Qspi, Disable);
PORT_SetFunc(QSIO1_PORT, QSIO1_PIN, Func_Qspi, Disable);
PORT_SetFunc(QSIO2_PORT, QSIO2_PIN, Func_Qspi, Disable);
PORT_SetFunc(QSIO3_PORT, QSIO3_PIN, Func_Qspi, Disable);
//下面是重点了,对参数进行配置,我们来看看都配置了哪些寄存器吧
stcQspiInit.enClkDiv = QspiHclkDiv3;//QspiHclkDiv3 = 2u,
//Clock source: HCLK/3
//串行接口基准时钟选择
// b5 b4 b3 b2 b1 b0
// 0 0 0 0 0 0:2个HCLK周期
// 0 0 0 0 0 1:2个HCLK周期*
// 0 0 0 0 1 0:3个HCLK周期
// 0 0 0 0 1 1:4个HCLK周期*
stcQspiInit.enSpiMode = QspiSpiMode3;//QspiSpiMode3 = 1u,
SPI模式选择
0:SPI模式0
1:SPI模式3
stcQspiInit.enBusCommMode = QspiBusModeRomAccess;
//访问模式QspiBusModeRomAccess = 0u, Rom access mode
//QSPI总线通信模式选择
//0:ROM访问模式
//1:直接通信模式
stcQspiInit.enPrefetchMode = QspiPrefetchStopComplete;
//QspiPrefetchStopComplete = 0u,
//Stop after prefetch data complete
//选择重置预读取动作的位置
//0:当前的预读取动作在字节边界中止
//1:当前的预读取动作即时中止
stcQspiInit.enPrefetchFuncEn = Disable;
//预读取功能有效/无效选择
//0:预读取功能无效
//1:预读取功能有效
stcQspiInit.enQssnValidExtendTime = QspiQssnValidExtendSck32;
// QspiQssnValidExtendSck32 = 1u,
// QSSN valid time extend 32 QSCK cycles
// QSPI总线访问后QSSN有效时间延长功能选择
// b5 b4
// 0 0:不延长QSSN有效时间0
// 0 1:将QSSN有效时间延长32个QSCK周期1
// 1 0:将QSSN有效时间延长128个QSCK周期2
// 1 1:将QSSN有效时间无限延长3
stcQspiInit.enQssnIntervalTime = QspiQssnIntervalQsck8;
//QspiQssnIntervalQsck8 = 7u,
//QSSN signal min interval time 8 QSCK
//QSSN信号最小无效时间选择
// b3 b2 b1 b0
//0 0 0 0:1个QSCK周期
//0 0 0 1:2个QSCK周期
stcQspiInit.enQsckDutyCorr = QspiQsckDutyCorrHalfHclk;//QspiQsckDutyCorrHalfHclk = 1u,
//QSCK's rising edge delay 0.5 HCLK cycle when Qsck select HCLK is odd
//QSCK输出波形占空比补正
//0:不进行占空比补正
//1:将QSCK的上升沿滞后0.5个HCLK周期
//(当QSCK选择的频率是HCLK的奇数倍时有效)
stcQspiInit.enVirtualPeriod = QspiVirtualPeriodQsck8;QspiVirtualPeriodQsck8 = 7u,
Virtual period select 8 QSCK
//使用快速读指令时虚拟周期数量选择
//b3 b2 b1 b0
//0 0 0 0:3个QSCK周期*1
//0 0 0 1:4个QSCK周期
//0 0 1 0:5个QSCK周期
stcQspiInit.enWpPinLevel = QspiWpPinOutputHigh;//QspiWpPinOutputHigh = 1u,
//WP pin(QIO2) output high level
//WP管脚(QIO2)电平设置
//0:低电平
//1:高电平
stcQspiInit.enQssnSetupDelayTime = QspiQssnSetupDelay1Dot5Qsck;
//QspiQssnSetupDelay1Dot5Qsck = 1u,
//QSSN setup delay 1.5 QSCK output than QSCK first rising edge
//QSSN信号输出时序选择
//0:比QSCK第一个上升沿提前0.5个QSCK输出QSSN
//1:比QSCK第一个上升沿提前1.5个QSCK输出QSSN
stcQspiInit.enQssnHoldDelayTime = QspiQssnHoldDelay1Dot5Qsck;
//QspiQssnHoldDelay1Dot5Qsck = 1u,
//QSSN hold delay 1.5 QSCK release than QSCK last rising edge
//QSSN信号释放时序选择
//0:比QSCK最后一个上升沿滞后0.5个QSCK释放QSSN
//1:比QSCK最后一个上升沿滞后1.5个QSCK释放QSSN
stcQspiInit.enFourByteAddrReadEn = Disable;
// 当地址宽度为4字节时的读指令代码选择
//0:不使用4字节地址读指令代码
//1:使用4字节地址读指令代码
stcQspiInit.enAddrWidth = QspiAddressByteThree;
//QspiAddressByteThree = 2u, Three byte address
//串行接口地址宽度选择
//b1 b0
//0 0:1字节
//0 1:2字节
//1 0:3字节
//1 1:4字节
stcQspiInit.stcCommProtocol.enReadMode = QspiReadModeFourWiresOutput;
// QspiReadModeFourWiresIO = 5u,
// Four wires input/output fast read
//串行接口读取模式选择
//b2 b1 b0
//0 0 0:标准读0
//0 0 1:快速读1
//0 1 0:二线式输出快速读2
//0 1 1:二线式输入输出快速读3
//1 0 0:四线式输出快速读4
//1 0 1:四线式输入输出快速读5
//1 1 0:自定义标准读6
//1 1 1:自定义快速读7
stcQspiInit.stcCommProtocol.enTransInstrProtocol = QspiProtocolExtendSpi;
stcQspiInit.stcCommProtocol.enTransAddrProtocol = QspiProtocolExtendSpi;
stcQspiInit.stcCommProtocol.enReceProtocol = QspiProtocolExtendSpi;
QspiProtocolExtendSpi = 0u,
Extend spi protocol
指令发送阶段SPI协议选择。
地址发送阶段SPI协议选择
数据接收阶段SPI协议选择
b1 b0
0 0:扩展式SPI协议
0 1:二线式SPI协议
1 0:四线式SPI协议
1 1:设定禁止
stcQspiInit.u8RomAccessInstr = QSPI_3BINSTR_FOUR_WIRES_OUTPUT_READ;
//0xEBu
//替换指令代码 用于替代默认指令的串行闪存指令代码
QSPI_Init(&stcQspiInit);
以上就是我总结的QSPI的初始化部分
因为HC32F460有自己QSPI库函数,在应用的时候大家可以根据需要来调用库函数进行通讯
4. 库函数- /**
- *******************************************************************************
- ** \brief De-Initialize QSPI unit
- **
- ** \param [in] None
- **
- ** \retval Ok Process successfully done
- **
- ******************************************************************************/
- en_result_t QSPI_DeInit(void)
- /**
- *******************************************************************************
- ** \brief Initialize QSPI unit
- **
- ** \param [in] pstcQspiInitCfg Pointer to qspi configuration
- ** \arg See the struct #stc_qspi_init_t
- **
- ** \retval Ok Process successfully done
- ** \retval Error Parameter error
- **
- ******************************************************************************/
- en_result_t QSPI_Init(const stc_qspi_init_t *pstcQspiInitCfg)
- /**
- *******************************************************************************
- ** \brief Config communication protocol structure
- **
- ** \param [in] pstcCommProtocol Pointer to qspi communication protocol configuration
- ** \arg See the struct #stc_qspi_comm_protocol_t
- **
- ** \retval Ok Process successfully done
- ** \retval Error Parameter error
- **
- ******************************************************************************/
- en_result_t QSPI_CommProtocolConfig(const stc_qspi_comm_protocol_t *pstcCommProtocol)
- /**
- *******************************************************************************
- ** \brief Enable or disable prefetch function
- **
- ** \param [in] enNewSta The function new state
- ** \arg Disable Disable prefetch function
- ** \arg Enable Enable prefetch function
- **
- ** \retval Ok Process successfully done
- **
- ******************************************************************************/
- en_result_t QSPI_PrefetchCmd(en_functional_state_t enNewSta)