5.34 XSPI_V2 使用说明
本章说明 N32H49x 标准外设库中 XSPI_V2 驱动的文件组成与 50 个公开函数,以及 XSPI_Enhanced_Mode、XSPI_XIP_Mode 2 个示例。XSPI_V2 面向增强型 SPI 与内存映射(XIP)访问外扩 Flash,提供标准、增强、XIP、Hyperbus 等初始化接口,请配合用户手册的“多线串行外设接口(xSPI)”章节阅读。
5.34.1 相关文件
| 相对路径 | 作用 |
|---|---|
firmware/n32h49x_std_periph_driver/inc/n32h49x_xspi_v2.h |
定义帧格式、传输模式、FIFO 阈值、XIP、Hyperbus、中断与 DMA 选择等宏与 XSPI 初始化结构,声明 50 个公开函数 |
firmware/n32h49x_std_periph_driver/src/n32h49x_xspi_v2.c |
实现上述 50 个函数:基础与增强初始化、XIP 与 Hyperbus、FIFO 阈值与数据量、数据收发与标志、DMA、识别与版本、中断 |
projects/n32h49x_EVAL/examples/XSPI_V2/ |
XSPI_V2 示例根目录,含 XSPI_Enhanced_Mode、XSPI_XIP_Mode 2 个示例 |
projects/n32h49x_EVAL/examples/XSPI_V2/XSPI_Enhanced_Mode/ |
该示例的工程目录组成:MDK-ARM/、EWARM/、inc/、src/、readme.txt |
projects/n32h49x_EVAL/bsp/ |
该示例引用的公共板级文件:串口日志函数 |
5.34.2 API 参考
以下 50 个公开函数按 n32h49x_xspi_v2.h 的声明顺序分为 10 组;每个条目给出功能摘要与 n32h49x_xspi_v2.c 中该函数正上方的注释原文。
基础初始化与使能
XSPI_DeInit、XSPI_InitBase、XSPI_InitEnhanced、XSPI_InitXIP、XSPI_InitHyperbus
结构体默认值
XSPI_StructBaseInit、XSPI_InitEnhancedStruct、XSPI_InitXIPStruct、XSPI_InitHyperbusStruct
模式使能与片选
XSPI_EnableHyperbus、XSPI_EnableXIPHyperbusRead、XSPI_EnableXIPHyperbusWrite、XSPI_Enable、XSPI_Slave_Select、XSPI_XIP_Slave_Select
数据帧、时钟延长与数据掩码
XSPI_SetNumberOfDataFrame、XSPI_EnableClockStrech、XSPI_EnableDataMask
FIFO 阈值与数据量
XSPI_SetTXStartFIFOThreshold、XSPI_GetTXStartFIFOThreshold、XSPI_SetTXFIFOEmptyThreshold、XSPI_GetTXFIFOEmptyThreshold、XSPI_SetRXFIFOFullThreshold、XSPI_GetRXFIFOFullThreshold、XSPI_GetTXFIFODataNum、XSPI_GetRXFIFODataNum
数据收发与标志
XSPI_GetDataPointer、XSPI_SendData、XSPI_ReceiveData、XSPI_ClearRxFIFO、XSPI_GetFlagStatus
DMA
XSPI_EnableDma、XSPI_SetDMATxFIFOThreshold、XSPI_GetDMATxFIFOThreshold、XSPI_SetDMARxFIFOThreshold、XSPI_GetDMARxFIFOThreshold、XSPI_GetDMACompletedDataFrameNum
识别与版本
XSPI_GetIdentification、XSPI_GetComponentVersion
XIP 操作码
XSPI_SetXIPModeBit、XSPI_SetXIPReadIncrOpcode、XSPI_SetXIPReadWrapOpcode、XSPI_SetXIPWriteIncrOpcode、XSPI_SetXIPWriteWrapOpcode
中断
XSPI_DisbaleAllInt、XSPI_EnableInt、XSPI_GetINTStatus、XSPI_GetINTRawStatus、XSPI_ClrITPendingBit、XSPI_ClrITAllPendingBit
void XSPI_DeInit(void)将 XSPI 外设寄存器恢复为默认复位值。
name XSPI_DeInit.
fun Deinitializes the XSPI peripheral registers to its default reset values.
return none
void XSPI_InitBase(XSPI_Module *xSPIx, XSPI_InitType* XSPI_StandInitStruct)按基础初始化结构配置 XSPI。
name XSPI_InitBase.
fun Initilizes the Standard SPI Master mode or Slave mode.
param SCPH:
- XSPI_SCPH_FIRST_EDGE
- XSPI_SCPH_SECOND_EDGE
param SCPOL:
- XSPI_SCPOL_LOW_LEVEL
- XSPI_SCPOL_HIGH_LEVEL
param FrameFormat:
- XSPI_STANDARD_MODE
- XSPI_DUAL_LINE_MODE Note: Only Slave mode can used
- XSPI_QUAD_LINE_MODE Note: Only Slave mode can used
- XSPI_OCTAL_LINE_MODE Note: Only Slave mode can used
param DataFrameSize:
- XSPI_FRAME_SIZE_4_BIT
- XSPI_FRAME_SIZE_5_BIT
- XSPI_FRAME_SIZE_6_BIT
- XSPI_FRAME_SIZE_7_BIT
- XSPI_FRAME_SIZE_8_BIT
- XSPI_FRAME_SIZE_9_BIT
- XSPI_FRAME_SIZE_10_BIT
- XSPI_FRAME_SIZE_11_BIT
- XSPI_FRAME_SIZE_12_BIT
- XSPI_FRAME_SIZE_13_BIT
- XSPI_FRAME_SIZE_14_BIT
- XSPI_FRAME_SIZE_15_BIT
- XSPI_FRAME_SIZE_16_BIT
- XSPI_FRAME_SIZE_17_BIT
- XSPI_FRAME_SIZE_18_BIT
- XSPI_FRAME_SIZE_19_BIT
- XSPI_FRAME_SIZE_20_BIT
- XSPI_FRAME_SIZE_21_BIT
- XSPI_FRAME_SIZE_22_BIT
- XSPI_FRAME_SIZE_23_BIT
- XSPI_FRAME_SIZE_24_BIT
- XSPI_FRAME_SIZE_25_BIT
- XSPI_FRAME_SIZE_26_BIT
- XSPI_FRAME_SIZE_27_BIT
- XSPI_FRAME_SIZE_28_BIT
- XSPI_FRAME_SIZE_29_BIT
- XSPI_FRAME_SIZE_30_BIT
- XSPI_FRAME_SIZE_31_BIT
- XSPI_FRAME_SIZE_32_BIT
param TransferMode:
- XSPI_TX_AND_RX_MODE
- XSPI_TX_ONLY_MODE
- XSPI_RX_ONLY_MODE
- XSPI_EEPROM_READ_MODE
param Role:
- XSPI_SLAVE_ROLE
- XSPI_MASTER_ROLE
param Baudr:
- Any even number between 2 and 65534
param RxdSamplingEdge:
- XSPI_RXD_HCLK_RISING_SAMPLING
- XSPI_RXD_HCLK_FALLING_SAMPLING
param RxdSampleDelay:
- Valid values 0 ~ 255, measured in HCLK
param NssToggle:
- XSPI_NSS_TOGGLE_DISABLE
- XSPI_NSS_TOGGLE_ENABLE
param EnhSlave_ClockStrech:
- XSPI_CLOCK_STRETCH_DISABLE
- XSPI_CLOCK_STRETCH_ENABLE
return none
void XSPI_InitEnhanced(XSPI_Module *xSPIx, XSPI_EnhancedInitType* XSPI_EnhancedInitStruct)按增强型初始化结构配置 XSPI。
name XSPI_InitEnhanced.
fun Initilizes the enhanced SPI mode.
param SCPH:
- XSPI_SCPH_FIRST_EDGE
- XSPI_SCPH_SECOND_EDGE
param SCPOL:
- XSPI_SCPOL_LOW_LEVEL
- XSPI_SCPOL_HIGH_LEVEL
param FrameFormat:
- XSPI_DUAL_LINE_MODE
- XSPI_QUAD_LINE_MODE
- XSPI_OCTAL_LINE_MODE
param DataFrameSize:
- XSPI_FRAME_SIZE_4_BIT
- XSPI_FRAME_SIZE_5_BIT
- XSPI_FRAME_SIZE_6_BIT
- XSPI_FRAME_SIZE_7_BIT
- XSPI_FRAME_SIZE_8_BIT
- XSPI_FRAME_SIZE_9_BIT
- XSPI_FRAME_SIZE_10_BIT
- XSPI_FRAME_SIZE_11_BIT
- XSPI_FRAME_SIZE_12_BIT
- XSPI_FRAME_SIZE_13_BIT
- XSPI_FRAME_SIZE_14_BIT
- XSPI_FRAME_SIZE_15_BIT
- XSPI_FRAME_SIZE_16_BIT
- XSPI_FRAME_SIZE_17_BIT
- XSPI_FRAME_SIZE_18_BIT
- XSPI_FRAME_SIZE_19_BIT
- XSPI_FRAME_SIZE_20_BIT
- XSPI_FRAME_SIZE_21_BIT
- XSPI_FRAME_SIZE_22_BIT
- XSPI_FRAME_SIZE_23_BIT
- XSPI_FRAME_SIZE_24_BIT
- XSPI_FRAME_SIZE_25_BIT
- XSPI_FRAME_SIZE_26_BIT
- XSPI_FRAME_SIZE_27_BIT
- XSPI_FRAME_SIZE_28_BIT
- XSPI_FRAME_SIZE_29_BIT
- XSPI_FRAME_SIZE_30_BIT
- XSPI_FRAME_SIZE_31_BIT
- XSPI_FRAME_SIZE_32_BIT
param TransferMode:
- XSPI_TX_ONLY_MODE
- XSPI_RX_ONLY_MODE
param Baudr:
- Any even number between 2 and 65534
param RxdSamplingEdge:
- XSPI_RXD_HCLK_RISING_SAMPLING
- XSPI_RXD_HCLK_FALLING_SAMPLING
Note: no need to worry about it in DDR mode
param RxdSampleDelay:
- Valid values 0 ~ 255, measured in HCLK
Note: no need to worry about it in DDR mode
param TransferType:
- XSPI_INST_ADDR_SINGLE_LINE
- XSPI_INST_SINGLE_LINE_ADDR_MULTI_LINE
- XSPI_INST_ADDR_MULTI_LINE
param AddrLen:
- XSPI_NO_ADDR_PHASE
- XSPI_ADDR_LEN_4BIT
- XSPI_ADDR_LEN_8BIT
- XSPI_ADDR_LEN_12BIT
- XSPI_ADDR_LEN_16BIT
- XSPI_ADDR_LEN_20BIT
- XSPI_ADDR_LEN_24BIT
- XSPI_ADDR_LEN_28BIT
- XSPI_ADDR_LEN_32BIT
- XSPI_ADDR_LEN_36BIT
- XSPI_ADDR_LEN_40BIT
- XSPI_ADDR_LEN_44BIT
- XSPI_ADDR_LEN_48BIT
- XSPI_ADDR_LEN_52BIT
- XSPI_ADDR_LEN_56BIT
- XSPI_ADDR_LEN_60BIT
param InstructLen:
- XSPI_NO_INST_PHASE
- XSPI_INST_LEN_4BIT
- XSPI_INST_LEN_8BIT
- XSPI_INST_LEN_16BIT
param WaitCycles:
- XSPI_WAIT_0_CYCLES
- XSPI_WAIT_1_CYCLES
- XSPI_WAIT_2_CYCLES
- XSPI_WAIT_3_CYCLES
- XSPI_WAIT_4_CYCLES
- XSPI_WAIT_5_CYCLES
- XSPI_WAIT_6_CYCLES
- XSPI_WAIT_7_CYCLES
- XSPI_WAIT_8_CYCLES
- XSPI_WAIT_9_CYCLES
- XSPI_WAIT_10_CYCLES
- XSPI_WAIT_11_CYCLES
- XSPI_WAIT_12_CYCLES
- XSPI_WAIT_13_CYCLES
- XSPI_WAIT_14_CYCLES
- XSPI_WAIT_15_CYCLES
- XSPI_WAIT_16_CYCLES
- XSPI_WAIT_17_CYCLES
- XSPI_WAIT_18_CYCLES
- XSPI_WAIT_19_CYCLES
- XSPI_WAIT_20_CYCLES
- XSPI_WAIT_21_CYCLES
- XSPI_WAIT_22_CYCLES
- XSPI_WAIT_23_CYCLES
- XSPI_WAIT_24_CYCLES
- XSPI_WAIT_25_CYCLES
- XSPI_WAIT_26_CYCLES
- XSPI_WAIT_27_CYCLES
- XSPI_WAIT_28_CYCLES
- XSPI_WAIT_29_CYCLES
- XSPI_WAIT_30_CYCLES
- XSPI_WAIT_31_CYCLES
- XSPI_WAIT_32_CYCLES
param ClockStrech:
- XSPI_CLOCK_STRETCH_DISABLE
- XSPI_CLOCK_STRETCH_ENABLE
param DDREable:
- XSPI_DDR_DISABLE
- XSPI_DDR_ENABLE
param DDR_InitType:
Note: The following parameters only need to be configured in DDR mode
param InstrucDDR:
- XSPI_INST_DDR_DISABLE
- XSPI_INST_DDR_ENABLE
param RxdsSignal:
- XSPI_RXDS_SIGNAL_DISABLE
- XSPI_RXDS_SIGNAL_ENABLE
param TxdDataMask:
- XSPI_DATA_MASK_DISABLE
- XSPI_DATA_MASK_ENABLE
param TxdDriverEdge:
- 0 ~ 255, Max value = (BAUD/2) - 1, BAUDR = CLKDIV[14:0] * 2)
return none
void XSPI_InitXIP(XSPI_Module *xSPIx, XSPI_XIPInitType* XSPI_XIPInitStruct)按 XIP 初始化结构配置 XSPI。
name XSPI_InitEnhanced.
fun Initilizes the XIP mode.
param SCPH:
- XSPI_SCPH_FIRST_EDGE
- XSPI_SCPH_SECOND_EDGE
param SCPOL:
- XSPI_SCPOL_LOW_LEVEL
- XSPI_SCPOL_HIGH_LEVEL
param DataFrameSize:
- XSPI_FRAME_SIZE_4_BIT
- XSPI_FRAME_SIZE_5_BIT
- XSPI_FRAME_SIZE_6_BIT
- XSPI_FRAME_SIZE_7_BIT
- XSPI_FRAME_SIZE_8_BIT
- XSPI_FRAME_SIZE_9_BIT
- XSPI_FRAME_SIZE_10_BIT
- XSPI_FRAME_SIZE_11_BIT
- XSPI_FRAME_SIZE_12_BIT
- XSPI_FRAME_SIZE_13_BIT
- XSPI_FRAME_SIZE_14_BIT
- XSPI_FRAME_SIZE_15_BIT
- XSPI_FRAME_SIZE_16_BIT
- XSPI_FRAME_SIZE_17_BIT
- XSPI_FRAME_SIZE_18_BIT
- XSPI_FRAME_SIZE_19_BIT
- XSPI_FRAME_SIZE_20_BIT
- XSPI_FRAME_SIZE_21_BIT
- XSPI_FRAME_SIZE_22_BIT
- XSPI_FRAME_SIZE_23_BIT
- XSPI_FRAME_SIZE_24_BIT
- XSPI_FRAME_SIZE_25_BIT
- XSPI_FRAME_SIZE_26_BIT
- XSPI_FRAME_SIZE_27_BIT
- XSPI_FRAME_SIZE_28_BIT
- XSPI_FRAME_SIZE_29_BIT
- XSPI_FRAME_SIZE_30_BIT
- XSPI_FRAME_SIZE_31_BIT
- XSPI_FRAME_SIZE_32_BIT
param TransferMode:
- XSPI_TX_ONLY_MODE
- XSPI_RX_ONLY_MODE
param Baudr:
- Any even number between 2 and 65534
param XipFrameFormat:
- XSPI_DUAL_LINE_MODE
- XSPI_QUAD_LINE_MODE
- XSPI_OCTAL_LINE_MODE
param XipTransferType:
- XSPI_INST_ADDR_SINGLE_LINE
- XSPI_INST_SINGLE_LINE_ADDR_MULTI_LINE
- XSPI_INST_ADDR_MULTI_LINE
param XipAddrLen:
For XIP Read Mode:
- XSPI_NO_ADDR_PHASE
- XSPI_ADDR_LEN_4BIT
- XSPI_ADDR_LEN_8BIT
- XSPI_ADDR_LEN_12BIT
- XSPI_ADDR_LEN_16BIT
- XSPI_ADDR_LEN_20BIT
- XSPI_ADDR_LEN_24BIT
- XSPI_ADDR_LEN_28BIT
- XSPI_ADDR_LEN_32BIT
- XSPI_ADDR_LEN_36BIT
- XSPI_ADDR_LEN_40BIT
- XSPI_ADDR_LEN_44BIT
- XSPI_ADDR_LEN_48BIT
- XSPI_ADDR_LEN_52BIT
- XSPI_ADDR_LEN_56BIT
- XSPI_ADDR_LEN_60BIT
For XIP Read Mode:
- XSPI_NO_ADDR_PHASE
- XSPI_ADDR_LEN_4BIT
- XSPI_ADDR_LEN_8BIT
- XSPI_ADDR_LEN_12BIT
- XSPI_ADDR_LEN_16BIT
- XSPI_ADDR_LEN_20BIT
- XSPI_ADDR_LEN_24BIT
- XSPI_ADDR_LEN_28BIT
- XSPI_ADDR_LEN_32BIT
param XipWaitCycles:
- XSPI_WAIT_0_CYCLES
- XSPI_WAIT_1_CYCLES
- XSPI_WAIT_2_CYCLES
- XSPI_WAIT_3_CYCLES
- XSPI_WAIT_4_CYCLES
- XSPI_WAIT_5_CYCLES
- XSPI_WAIT_6_CYCLES
- XSPI_WAIT_7_CYCLES
- XSPI_WAIT_8_CYCLES
- XSPI_WAIT_9_CYCLES
- XSPI_WAIT_10_CYCLES
- XSPI_WAIT_11_CYCLES
- XSPI_WAIT_12_CYCLES
- XSPI_WAIT_13_CYCLES
- XSPI_WAIT_14_CYCLES
- XSPI_WAIT_15_CYCLES
- XSPI_WAIT_16_CYCLES
- XSPI_WAIT_17_CYCLES
- XSPI_WAIT_18_CYCLES
- XSPI_WAIT_19_CYCLES
- XSPI_WAIT_20_CYCLES
- XSPI_WAIT_21_CYCLES
- XSPI_WAIT_22_CYCLES
- XSPI_WAIT_23_CYCLES
- XSPI_WAIT_24_CYCLES
- XSPI_WAIT_25_CYCLES
- XSPI_WAIT_26_CYCLES
- XSPI_WAIT_27_CYCLES
- XSPI_WAIT_28_CYCLES
- XSPI_WAIT_29_CYCLES
- XSPI_WAIT_30_CYCLES
- XSPI_WAIT_31_CYCLES
- XSPI_WAIT_32_CYCLES
param XipDDREable:
- XSPI_DDR_DISABLE
- XSPI_DDR_ENABLE
param Info:
param Read_XIPInitType:
Note: XIP Read Parameter, Configuration is only needed when reading from XIP
param XipInstructLen:
- XSPI_NO_INST_PHASE
- XSPI_INST_LEN_4BIT
- XSPI_INST_LEN_8BIT
- XSPI_INST_LEN_16BIT
param XipInstrctEnable:
- XSPI_XIP_INSTRUCT_DISABLE
- XSPI_XIP_INSTRUCT_ENABLE
param XipDFSHC:
- XSPI_XIP_DFSHC_DISABLE
- XSPI_XIP_DFSHC_ENABLE
param XipPrefetch:
- XSPI_XIP_PREFETCH_DISABLE
- XSPI_XIP_PREFETCH_ENABLE
param XipModeBit:
- XSPI_XIP_MODE_BIT_DISABLE
- XSPI_XIP_MODE_BIT_ENABLE
param XipModeBitLen:
- XSPI_XIP_MODE_BIT_LEN_2_BIT
- XSPI_XIP_MODE_BIT_LEN_4_BIT
- XSPI_XIP_MODE_BIT_LEN_8_BIT
- XSPI_XIP_MODE_BIT_LEN_16_BIT
param ContinueTransfer:
Note: XIP Read Parameter
param XipContinueTransfer:
- XSPI_XIP_CONTINUE_TRANSFER_DISABLE
- XSPI_XIP_CONTINUE_TRANSFER_ENABLE
param XipWatchDogTimeout:
- 0 ~ 255, in terms of HCLK
param DDR_Info:
param DDR_InitType:
Note: Configuration is only required for XIP DDR reads
param TxdDriverEdge:
- 0 ~ 255, Max value = (BAUD/2) - 1, BAUDR = CLKDIV[14:0] * 2)
param XipInstrucDDR:
- XSPI_INST_DDR_DISABLE
- XSPI_INST_DDR_ENABLE
param XipRxdsSignal:
- XSPI_RXDS_SIGNAL_DISABLE
- XSPI_RXDS_SIGNAL_ENABLE
param Rxds_InitType:
Note: Configuration is only required for XIP Non-DDR reads
param RxdSamplingEdge:
- XSPI_RXD_HCLK_RISING_SAMPLING
- XSPI_RXD_HCLK_FALLING_SAMPLING
param RxdSampleDelay:
- Valid values 0 ~ 255, measured in HCLK
param Write_XIPInitType:
Note: XIP Write Parameter, Configuration is only needed when writing from XIP
param XipInstructLen:
- XSPI_NO_INST_PHASE
- XSPI_INST_LEN_4BIT
- XSPI_INST_LEN_8BIT
- XSPI_INST_LEN_16BIT
param DDR_InitType:
Note: Configuration is only required for XIP DDR writes
param TxdDriverEdge:
- 0 ~ 255, Max value = (BAUD/2) - 1, BAUDR = CLKDIV[14:0] * 2)
param XipInstrucDDR:
- XSPI_INST_DDR_DISABLE
- XSPI_RXDS_SIGNAL_ENABLE
return none
使用提示: 源码注释的 name 字段写作 XSPI_InitEnhanced.,与函数名 XSPI_InitXIP 不一致,按函数名调用即可。
void XSPI_InitHyperbus(XSPI_Module *xSPIx, XSPI_HyperbusInitType* XSPI_HyperbusInitStruct)按 Hyperbus 初始化结构配置 XSPI。
name XSPI_InitHyperbus.
fun Initilizes the Hyperbus mode.
param Baudr:
- Any even number between 2 and 65534
param TransferMode:
- XSPI_TX_ONLY_MODE
- XSPI_RX_ONLY_MODE
param DataFrameSize:
- XSPI_FRAME_SIZE_4_BIT
- XSPI_FRAME_SIZE_5_BIT
- XSPI_FRAME_SIZE_6_BIT
- XSPI_FRAME_SIZE_7_BIT
- XSPI_FRAME_SIZE_8_BIT
- XSPI_FRAME_SIZE_9_BIT
- XSPI_FRAME_SIZE_10_BIT
- XSPI_FRAME_SIZE_11_BIT
- XSPI_FRAME_SIZE_12_BIT
- XSPI_FRAME_SIZE_13_BIT
- XSPI_FRAME_SIZE_14_BIT
- XSPI_FRAME_SIZE_15_BIT
- XSPI_FRAME_SIZE_16_BIT
- XSPI_FRAME_SIZE_17_BIT
- XSPI_FRAME_SIZE_18_BIT
- XSPI_FRAME_SIZE_19_BIT
- XSPI_FRAME_SIZE_20_BIT
- XSPI_FRAME_SIZE_21_BIT
- XSPI_FRAME_SIZE_22_BIT
- XSPI_FRAME_SIZE_23_BIT
- XSPI_FRAME_SIZE_24_BIT
- XSPI_FRAME_SIZE_25_BIT
- XSPI_FRAME_SIZE_26_BIT
- XSPI_FRAME_SIZE_27_BIT
- XSPI_FRAME_SIZE_28_BIT
- XSPI_FRAME_SIZE_29_BIT
- XSPI_FRAME_SIZE_30_BIT
- XSPI_FRAME_SIZE_31_BIT
- XSPI_FRAME_SIZE_32_BIT
param WaitCycles:
- XSPI_WAIT_0_CYCLES
- XSPI_WAIT_1_CYCLES
- XSPI_WAIT_2_CYCLES
- XSPI_WAIT_3_CYCLES
- XSPI_WAIT_4_CYCLES
- XSPI_WAIT_5_CYCLES
- XSPI_WAIT_6_CYCLES
- XSPI_WAIT_7_CYCLES
- XSPI_WAIT_8_CYCLES
- XSPI_WAIT_9_CYCLES
- XSPI_WAIT_10_CYCLES
- XSPI_WAIT_11_CYCLES
- XSPI_WAIT_12_CYCLES
- XSPI_WAIT_13_CYCLES
- XSPI_WAIT_14_CYCLES
- XSPI_WAIT_15_CYCLES
- XSPI_WAIT_16_CYCLES
- XSPI_WAIT_17_CYCLES
- XSPI_WAIT_18_CYCLES
- XSPI_WAIT_19_CYCLES
- XSPI_WAIT_20_CYCLES
- XSPI_WAIT_21_CYCLES
- XSPI_WAIT_22_CYCLES
- XSPI_WAIT_23_CYCLES
- XSPI_WAIT_24_CYCLES
- XSPI_WAIT_25_CYCLES
- XSPI_WAIT_26_CYCLES
- XSPI_WAIT_27_CYCLES
- XSPI_WAIT_28_CYCLES
- XSPI_WAIT_29_CYCLES
- XSPI_WAIT_30_CYCLES
- XSPI_WAIT_31_CYCLES
- XSPI_WAIT_32_CYCLES
param CAPhaseRxds:
- XSPI_HYPERBUS_CA_RXDS_DISABLE
- XSPI_HYPERBUS_CA_RXDS_ENABLE
param ClockStrech:
- XSPI_CLOCK_STRETCH_DISABLE
- XSPI_CLOCK_STRETCH_ENABLE
param TxdDriverEdge:
- 0 ~ 255, Max value = (BAUD/2) - 1, BAUDR = CLKDIV[14:0] * 2)
param XIPHyperbus:
- XSPI_XIP_HYPERBUS_MODE
- XSPI_NON_XIP_HYPERBUS_MODE
param XIP_ReadHyperbusInitType:
Note: XIP Hyperbus Read Parameters
param XipFixDFS:
- XSPI_XIP_DFSHC_DISABLE
- XSPI_XIP_DFSHC_ENABLE
param XipPrefetch:
- XSPI_XIP_PREFETCH_DISABLE
- XSPI_XIP_PREFETCH_ENABLE
return none
void XSPI_StructBaseInit(XSPI_InitType* XSPI_StandInitStruct)把基础初始化结构体的每个成员填充为默认值。
name XSPI_StructBaseInit.
fun Fills each XSPI_InitType member with its default value.
param XSPI_InitType (The input parameters must be the following values):
- SCPH
- SCPOL
- FrameFormat
- DataFrameSize
- TransferMode
- Role
- Baudr
- RxdSamplingEdge
- RxdSampleDelay
- NssToggle
- EnhSlave_ClockStrech
return none
void XSPI_InitEnhancedStruct(XSPI_EnhancedInitType* XSPI_EnhancedInitStruct)把增强型初始化结构体的每个成员填充为默认值。
name XSPI_InitEnhancedStruct.
fun Fills each XSPI_EnhancedInitType member with its default value.
param XSPI_EnhancedInitType (The input parameters must be the following values):
- SCPH
- SCPOL
- FrameFormat
- DataFrameSize
- TransferMode
- Baudr
- RxdSamplingEdge
- RxdSampleDelay
- TransferType
- AddrLen
- InstructLen
- WaitCycles
- ClockStrech
- DDREable
- InstrucDDR
- RxdsSignal
- TxdDataMask
- TxdDriverEdge
return none
void XSPI_InitXIPStruct(XSPI_XIPInitType* XSPI_XIPInitStruct)把 XIP 初始化结构体的每个成员填充为默认值。
name XSPI_InitXIPStruct.
fun Fills each XSPI_XIPInitType member with its default value.
param XSPI_XIPInitType (The input parameters must be the following values):
- SCPH
- SCPOL
- DataFrameSize
- TransferMode
- Baudr
- XipFrameFormat
- XipTransferType
- XipAddrLen
- XipWaitCycles
- XipDDREable
- XIP_Info
XIP Read Parameter:
- XipInstructLen
- XipInstrctEnable
- Info
DDR Parameter:
- TxdDriverEdge
- XipInstrucDDR
- XipRxdsSignal
- XipDFSHC
- XipPrefetch
- XipModeBit
- XipModeBitLen
- ContinueTransfer
Continue Transfer Parameter:
- XipContinueTransfer
- XipWatchDogTimeout
return none
void XSPI_InitHyperbusStruct(XSPI_HyperbusInitType* XSPI_HyperbusInitStruct)把 Hyperbus 初始化结构体的每个成员填充为默认值。
name XSPI_InitHyperbusStruct.
fun Fills each XSPI_HyperbusInitType member with its default value.
param XSPI_HyperbusInitType (The input parameters must be the following values):
- Baudr
- TransferMode
- DataFrameSize
- WaitCycles
- CAPhaseRxds
- ClockStrech
- TxdDriverEdge
- XIPHyperbus
- XIP_ReadHyperbusInitType
XIP Hyperbus Read Parameter:
- XipFixDFS
- XipPrefetch
return none
void XSPI_EnableHyperbus(XSPI_Module* xSPIx, FunctionalState cmd)使能或禁止 XSPI Hyperbus。
name XSPI_EnableHyperbus.
fun Control XSPI Hyperbus function switch.
param cmd
- ENABLE
- DISABLE
return none
void XSPI_EnableXIPHyperbusRead(XSPI_Module* xSPIx, FunctionalState cmd)使能或禁止 XIP Hyperbus 读。
name XSPI_EnableXIPHyperbusRead.
fun Control XSPI XIP Hyperbus Read function switch.
param cmd
- ENABLE
- DISABLE
return none
void XSPI_EnableXIPHyperbusWrite(XSPI_Module* xSPIx, FunctionalState cmd)使能或禁止 XIP Hyperbus 写。
name XSPI_EnableXIPHyperbusWrite.
fun Control XSPI XIP Hyperbus Write function switch.
param cmd
- ENABLE
- DISABLE
return none
void XSPI_SetNumberOfDataFrame(XSPI_Module* xSPIx, uint32_t NumDataFrame)设置数据帧数量。
name XSPI_SetNumberOfDataFrame.
fun Set Number of Data Frames.
param NumDataFrame
- 1 ~ 65536
return none
void XSPI_EnableClockStrech(XSPI_Module* xSPIx, FunctionalState cmd)使能或禁止时钟延长。
name XSPI_EnableClockStrech.
fun Control XSPI Clock Strech function switch.
param cmd
- ENABLE
- DISABLE
return none
void XSPI_EnableDataMask(XSPI_Module* xSPIx, FunctionalState cmd)使能或禁止数据掩码。
name XSPI_EnableDataMask.
fun Control XSPI Data Mask function switch.
param cmd
- ENABLE
- DISABLE
return none
void XSPI_Enable(XSPI_Module* xSPIx, FunctionalState cmd)使能或禁止 XSPI。
name XSPI_Enable.
fun Control XSPI function switch.
param cmd
- ENABLE
- DISABLE
return none
void XSPI_Slave_Select(XSPI_Module* xSPIx, uint32_t Slave)选择从设备片选。
name XSPI_Slave_Select.
fun Slave Select Enable.
param Slave:
- XSPI_NO_SELECT_SLAVE
- XSPI_SELECT_SLAVE_1
- XSPI_SELECT_SLAVE_2
return none
void XSPI_XIP_Slave_Select(XSPI_Module* xSPIx, uint32_t Slave)在 XIP 模式下选择从设备片选。
name XSPI_XIP_Slave_Select.
fun XIP Mode Slave Select Enable.
param Slave:
- XSPI_NO_SELECT_SLAVE
- XSPI_SELECT_SLAVE_1
- XSPI_SELECT_SLAVE_2
return none
void XSPI_SetTXStartFIFOThreshold(XSPI_Module* xSPIx, uint32_t fifo_level)设置发送启动 FIFO 阈值。
name XSPI_SetTXStartFIFOThreshold.
fun Set Transfer start FIFO Threshold
param fifo_level:
- XSPI_FIFO_THRESHOLD_LEVEL0
- XSPI_FIFO_THRESHOLD_LEVEL1
- XSPI_FIFO_THRESHOLD_LEVEL2
- XSPI_FIFO_THRESHOLD_LEVEL3
- XSPI_FIFO_THRESHOLD_LEVEL4
- XSPI_FIFO_THRESHOLD_LEVEL5
- XSPI_FIFO_THRESHOLD_LEVEL6
- XSPI_FIFO_THRESHOLD_LEVEL7
- XSPI_FIFO_THRESHOLD_LEVEL8
- XSPI_FIFO_THRESHOLD_LEVEL9
- XSPI_FIFO_THRESHOLD_LEVEL10
- XSPI_FIFO_THRESHOLD_LEVEL11
- XSPI_FIFO_THRESHOLD_LEVEL12
- XSPI_FIFO_THRESHOLD_LEVEL13
- XSPI_FIFO_THRESHOLD_LEVEL14
- XSPI_FIFO_THRESHOLD_LEVEL15
return none
uint16_t XSPI_GetTXStartFIFOThreshold(XSPI_Module* xSPIx)获取发送启动 FIFO 阈值。
name XSPI_GetTXStartFIFOThreshold.
fun Get Transfer start FIFO Threshold
param fifo_level:
return Transfer start FIFO Threshold
void XSPI_SetTXFIFOEmptyThreshold(XSPI_Module* xSPIx, uint32_t fifo_level)设置发送 FIFO 空阈值。
name XSPI_SetTXFIFOEmptyThreshold.
fun Set Transmit FIFO Empty Threshold
not When the value is less than or equal to this threshold, a transmit FIFO empty interrupt is triggered.
param fifo_level:
- XSPI_FIFO_THRESHOLD_LEVEL0
- XSPI_FIFO_THRESHOLD_LEVEL1
- XSPI_FIFO_THRESHOLD_LEVEL2
- XSPI_FIFO_THRESHOLD_LEVEL3
- XSPI_FIFO_THRESHOLD_LEVEL4
- XSPI_FIFO_THRESHOLD_LEVEL5
- XSPI_FIFO_THRESHOLD_LEVEL6
- XSPI_FIFO_THRESHOLD_LEVEL7
- XSPI_FIFO_THRESHOLD_LEVEL8
- XSPI_FIFO_THRESHOLD_LEVEL9
- XSPI_FIFO_THRESHOLD_LEVEL10
- XSPI_FIFO_THRESHOLD_LEVEL11
- XSPI_FIFO_THRESHOLD_LEVEL12
- XSPI_FIFO_THRESHOLD_LEVEL13
- XSPI_FIFO_THRESHOLD_LEVEL14
- XSPI_FIFO_THRESHOLD_LEVEL15
return none
uint16_t XSPI_GetTXFIFOEmptyThreshold(XSPI_Module* xSPIx)获取发送 FIFO 空阈值。
name XSPI_GetTXFIFOEmptyThreshold.
fun Get Transmit FIFO Empty Threshold
param fifo_level:
return Transmit FIFO Empty Threshold
void XSPI_SetRXFIFOFullThreshold(XSPI_Module* xSPIx, uint32_t fifo_level)设置接收 FIFO 满阈值。
name XSPI_SetRXFIFOFullThreshold.
fun Set Receive FIFO Full Threshold
not When the data number is greater than or equal to (this threshold + 1), triggered receive FIFO full interrupt.
param fifo_level:
- XSPI_FIFO_THRESHOLD_LEVEL0
- XSPI_FIFO_THRESHOLD_LEVEL1
- XSPI_FIFO_THRESHOLD_LEVEL2
- XSPI_FIFO_THRESHOLD_LEVEL3
- XSPI_FIFO_THRESHOLD_LEVEL4
- XSPI_FIFO_THRESHOLD_LEVEL5
- XSPI_FIFO_THRESHOLD_LEVEL6
- XSPI_FIFO_THRESHOLD_LEVEL7
- XSPI_FIFO_THRESHOLD_LEVEL8
- XSPI_FIFO_THRESHOLD_LEVEL9
- XSPI_FIFO_THRESHOLD_LEVEL10
- XSPI_FIFO_THRESHOLD_LEVEL11
- XSPI_FIFO_THRESHOLD_LEVEL12
- XSPI_FIFO_THRESHOLD_LEVEL13
- XSPI_FIFO_THRESHOLD_LEVEL14
- XSPI_FIFO_THRESHOLD_LEVEL15
return none
uint16_t XSPI_GetRXFIFOFullThreshold(XSPI_Module* xSPIx)获取接收 FIFO 满阈值。
name XSPI_GetRXFIFOFullThreshold.
fun Get Receive FIFO Full Threshold
param fifo_level:
return Receive FIFO Full Threshold
uint16_t XSPI_GetTXFIFODataNum(XSPI_Module* xSPIx)获取发送 FIFO 中的数据个数。
name XSPI_GetTXFIFODataNum.
fun Get Transmit FIFO Data Number
note Contains the number of valid data entries in the transmit FIFO
param fifo_level:
return Transmit FIFO Data Number
uint16_t XSPI_GetRXFIFODataNum(XSPI_Module* xSPIx)获取接收 FIFO 中的数据个数。
name XSPI_GetRXFIFODataNum.
fun Get Receive FIFO Data Number
note Contains the number of valid data entries in the receive FIFO
param fifo_level:
return Receive FIFO Data Number
uint32_t XSPI_GetDataPointer(XSPI_Module* xSPIx)获取 XSPI DAT0 寄存器的指针。
name XSPIGetDataPointer.
fun Get Pointer of XSPI DAT0 register.
return The pointer of XSPI DAT0 register.
使用提示: 源码注释的 name 字段写作 XSPIGetDataPointer.,与函数名 XSPI_GetDataPointer 不一致,按函数名调用即可。
void XSPI_SendData(XSPI_Module* xSPIx, uint32_t SendData)向 XSPI DAT 寄存器写入一个数据以发送。
name XSPI_SendData.
fun Write one data direct to XSPI DAT register to send.
param SendData:
- data to be send
return none
uint32_t XSPI_ReceiveData(XSPI_Module* xSPIx)从 XSPI DAT0 寄存器读取一个数据。
name XSPI_ReceiveData.
fun Read one data from XSPI DAT0 register.
return The value of XSPI DAT0 register.
void XSPI_ClearRxFIFO(XSPI_Module* xSPIx)清空接收 FIFO。
name XSPI_ClearRxFIFO.
fun Clear RX FIFO
return none
void XSPI_EnableDma(XSPI_Module* xSPIx, uint16_t XSPI_DMAReq, FunctionalState Cmd)使能或禁止 XSPI 的 DMA 接口。
name XSPI_EnableDma.
fun Enables or disables the XSPI DMA interface.
param xSPIx :
param XSPI_DMAReq :
- XSPI_DMA_TX
- XSPI_DMA_RX
param Cmd :
- ENABLE
- DISABLE
return none
void XSPI_SetDMATxFIFOThreshold(XSPI_Module* xSPIx, uint32_t fifo_level)设置 DMA 发送 FIFO 阈值。
name XSPI_SetDMATxFIFOThreshold.
fun Set DMA Tx FIFO Threshold
param fifo_level:
- XSPI_FIFO_THRESHOLD_LEVEL0
- XSPI_FIFO_THRESHOLD_LEVEL1
- XSPI_FIFO_THRESHOLD_LEVEL2
- XSPI_FIFO_THRESHOLD_LEVEL3
- XSPI_FIFO_THRESHOLD_LEVEL4
- XSPI_FIFO_THRESHOLD_LEVEL5
- XSPI_FIFO_THRESHOLD_LEVEL6
- XSPI_FIFO_THRESHOLD_LEVEL7
- XSPI_FIFO_THRESHOLD_LEVEL8
- XSPI_FIFO_THRESHOLD_LEVEL9
- XSPI_FIFO_THRESHOLD_LEVEL10
- XSPI_FIFO_THRESHOLD_LEVEL11
- XSPI_FIFO_THRESHOLD_LEVEL12
- XSPI_FIFO_THRESHOLD_LEVEL13
- XSPI_FIFO_THRESHOLD_LEVEL14
- XSPI_FIFO_THRESHOLD_LEVEL15
return none
uint16_t XSPI_GetDMATxFIFOThreshold(XSPI_Module* xSPIx)获取 DMA 发送 FIFO 阈值。
name XSPI_GetDMATxFIFOThreshold.
fun Get DMA Tx FIFO Threshold
param fifo_level:
return DMA Tx FIFO Threshold
void XSPI_SetDMARxFIFOThreshold(XSPI_Module* xSPIx, uint32_t fifo_level)设置 DMA 接收 FIFO 阈值。
name XSPI_SetDMARxFIFOThreshold.
fun Set DMA Rx FIFO Threshold
not dma_rx_req is generated when the number of valid data entries in the receive FIFO is equal to or above this field value + 1
param fifo_level:
- XSPI_FIFO_THRESHOLD_LEVEL0
- XSPI_FIFO_THRESHOLD_LEVEL1
- XSPI_FIFO_THRESHOLD_LEVEL2
- XSPI_FIFO_THRESHOLD_LEVEL3
- XSPI_FIFO_THRESHOLD_LEVEL4
- XSPI_FIFO_THRESHOLD_LEVEL5
- XSPI_FIFO_THRESHOLD_LEVEL6
- XSPI_FIFO_THRESHOLD_LEVEL7
- XSPI_FIFO_THRESHOLD_LEVEL8
- XSPI_FIFO_THRESHOLD_LEVEL9
- XSPI_FIFO_THRESHOLD_LEVEL10
- XSPI_FIFO_THRESHOLD_LEVEL11
- XSPI_FIFO_THRESHOLD_LEVEL12
- XSPI_FIFO_THRESHOLD_LEVEL13
- XSPI_FIFO_THRESHOLD_LEVEL14
- XSPI_FIFO_THRESHOLD_LEVEL15
return none
uint16_t XSPI_GetDMARxFIFOThreshold(XSPI_Module* xSPIx)获取 DMA 接收 FIFO 阈值。
name XSPI_GetDMARxFIFOThreshold.
fun Get DMA Rx FIFO Threshold
param fifo_level:
return DMA Rx FIFO Threshold
uint32_t XSPI_GetDMACompletedDataFrameNum(XSPI_Module* xSPIx)获取 DMA 已完成的数据帧数。
name XSPI_GetDMACompletedDataFrameNum.
fun Get Completed Data frames.
note indicates total data frames transferred in the previous internal DMA transfer
param Flag:
return The new state of XSPI_FLAG (SET or RESET).
uint32_t XSPI_GetIdentification(XSPI_Module* xSPIx)获取识别码。
name XSPI_GetIdentification.
fun Get Identification code
param fifo_level:
return Identification code
uint32_t XSPI_GetComponentVersion(XSPI_Module* xSPIx)获取组件版本。
name XSPI_GetComponentVersion.
fun Get component version
param fifo_level:
return component version
void XSPI_SetXIPModeBit(XSPI_Module* xSPIx, uint16_t mode_bit)设置 XIP 传输中地址阶段后发送的 XIP 模式位。
name XSPI_SetXIPModeBit.
fun Set XIP mode bits to be sent after address phase of XIP transfer
param mode_bit: 0x0000 ~ 0xFFFF
return none
void XSPI_SetXIPReadIncrOpcode(XSPI_Module* xSPIx, uint16_t opcode)设置 AHB 总线请求 INCR 类型读传输时发送的指令操作码。
name XSPI_SetXIPReadIncrOpcode.
fun Set instruction op-code to be sent when an INCR type transfer is requested on AHB bus.
param opcode: 0x0000 ~ 0xFFFF
note The effective length of the op-code is configured by XIP_CTRL.INSTL[1:0]
return none
void XSPI_SetXIPReadWrapOpcode(XSPI_Module* xSPIx, uint16_t opcode)设置 AHB 总线请求 WRAP 类型读传输时发送的指令操作码。
name XSPI_SetXIPReadWrapOpcode.
fun Set instruction op-code to be sent when an WRAP type transfer is requested on AHB bus.
param opcode: 0x0000 ~ 0xFFFF
note The effective length of the op-code is configured by XIP_CTRL.INSTL[1:0]
return none
void XSPI_SetXIPWriteIncrOpcode(XSPI_Module* xSPIx, uint16_t opcode)设置 AHB 总线请求 INCR 类型写传输时发送的指令操作码。
name XSPI_SetXIPReadIncrOpcode.
fun Set the instruction op-code to be sent when an INCR type XIP Write transfer is requested on AHB bus.
param opcode: 0x0000 ~ 0xFFFF
note The effective length of the op-code is configured by XIP_CTRL.INSTL[1:0]
return none
使用提示: 源码注释的 name 字段写作 XSPI_SetXIPReadIncrOpcode.,与函数名 XSPI_SetXIPWriteIncrOpcode 不一致,按函数名调用即可。
void XSPI_SetXIPWriteWrapOpcode(XSPI_Module* xSPIx, uint16_t opcode)设置 AHB 总线请求 WRAP 类型写传输时发送的指令操作码。
name XSPI_SetXIPWriteWrapOpcode.
fun Set the instruction op-code to be sent when an WRAP type XIP Write transfer is requested on AHB bus.
param opcode: 0x0000 ~ 0xFFFF
note The effective length of the op-code is configured by XIP_CTRL.INSTL[1:0]
return none
FlagStatus XSPI_GetFlagStatus(XSPI_Module* xSPIx, uint32_t Flag)检查指定的 XSPI 标志是否置位。
name XSPI_GetFlagStatus.
fun Checks whether the specified XSPI flag is set or not.
param Flag:
- XSPI_BUSY_FLAG
- XSPI_TXFNF_FLAG
- XSPI_TXFE_FLAG
- XSPI_RXFNF_FLAG
- XSPI_RXFF_FLAG
- XSPI_TXE_FLAG
- XSPI_DCERR_FLAG
return The new state of XSPI_FLAG (SET or RESET).
void XSPI_DisbaleAllInt(XSPI_Module* xSPIx)禁止 XSPI 的全部中断。
name XSPI_DisbaleAllInt.
fun Disables the all XSPI interrupts.
param XSPI_IT:
return none.
void XSPI_EnableInt(XSPI_Module* xSPIx, uint32_t XSPI_IT, FunctionalState Cmd)使能或禁止指定的 XSPI 中断。
name XSPI_ConfigInt.
fun Enables or disables the specified XSPI interrupts.
param XSPI_IT:
- XSPI_INT_TXFEMPTY
- XSPI_INT_TXFOVER
- XSPI_INT_RXFUNDER
- XSPI_INT_RXFOVER
- XSPI_INT_RXFFULL
- XSPI_INT_MMCONTENTION
- XSPI_INT_XIP_RXFOVER
- XSPI_INT_TXFUNDER
param Cmd:
- ENABLE
- DISABLE
return none.
使用提示: 源码注释的 name 字段写作 XSPI_ConfigInt.,与函数名 XSPI_EnableInt 不一致,按函数名调用即可。
INTStatus XSPI_GetINTStatus(XSPI_Module* xSPIx, uint32_t XSPI_IT)检查指定的 XSPI 中断是否发生。
name XSPI_GetINTStatus.
fun Checks whether the specified XSPI interrupt has occurred or not.
param XSPI_IT:
- XSPI_INT_TXFEMPTY
- XSPI_INT_TXFOVER
- XSPI_INT_RXFUNDER
- XSPI_INT_RXFOVER
- XSPI_INT_RXFFULL
- XSPI_INT_MMCONTENTION
- XSPI_INT_XIP_RXFOVER
- XSPI_INT_TXFUNDER
return The new state of XSPI_IT (SET or RESET).
INTStatus XSPI_GetINTRawStatus(XSPI_Module* xSPIx, uint32_t XSPI_IT)获取 XSPI 的原始中断状态。
name XSPI_GetINTRawStatus.
fun Get XSPI Raw Interrupt Status.
param XSPI_IT:
- XSPI_INT_TXFEMPTY
- XSPI_INT_TXFOVER
- XSPI_INT_RXFUNDER
- XSPI_INT_RXFOVER
- XSPI_INT_RXFFULL
- XSPI_INT_MMCONTENTION
- XSPI_INT_XIP_RXFOVER
- XSPI_INT_TXFUNDER
return The new state of XSPI_IT (SET or RESET).
void XSPI_ClrITPendingBit(XSPI_Module* xSPIx, uint32_t XSPI_IT)清除指定的 XSPI 中断挂起位。
name XSPI_ClrITPendingBit.
fun Clears the XSPI interrupt pending bit.
param XSPI_IT:
- XSPI_INT_TXFOVER
- XSPI_INT_RXFUNDER
- XSPI_INT_RXFOVER
- XSPI_INT_MMCONTENTION
- XSPI_INT_XIP_RXFOVER
- XSPI_INT_TXFUNDER
return none.
void XSPI_ClrITAllPendingBit(XSPI_Module* xSPIx)清除 XSPI 的全部中断挂起位。
name XSPI_ClrITAllPendingBit.
fun Clears the XSPI interrupt all pending bit.
param XSPI_IT:
return none.
5.34.3 Demo 示例说明
本节说明 XSPI_V2 的 2 个示例:XSPI_Enhanced_Mode 在增强型模式下用轮询、中断与 DMA 三条路径读写外置 Flash,XSPI_XIP_Mode 用内存映射方式读写外置 Flash。
5.34.3.1 XSPI_Enhanced_Mode 增强模式读写外置 Flash
工程目录: projects/n32h49x_EVAL/examples/XSPI_V2/XSPI_Enhanced_Mode/
初始化日志、时钟与 GPIO→置 QE 使能四线并擦除扇区→写入并轮询读回比较→用中断方式读回并比较→用 DMA 写、读并比较
| 项目 | 源码解读 |
|---|---|
| 功能 | 在增强型 SPI 模式下完成外置 Flash 的擦除、写、读; 分别用轮询、中断与 DMA 三条路径读回并比较读写一致性。 |
| 源码组成 | src/main.c:main、Delay;src/xspi_flash.c:RCC_Configuration、Hardware_Configuration、DMA_Configuration、XSPI_Standard_Mode_Config、XSPI_Enhanced_Mode_Config、Flash_Read_Buffer_DMA 等;src/n32h49x_it.c:XSPI_IRQHandler;inc/main.h、inc/xspi_flash.h:宏与声明;readme.txt、MDK-ARM/、EWARM/:说明与工程文件。 |
| 关键配置 | 标准模式:XSPI_InitBase 配 XSPI_FRAME_SIZE_8_BIT 与收发模式;增强模式: XSPI_InitEnhanced 配 XSPI_QUAD_LINE_MODE、XSPI_FRAME_SIZE_32_BIT、XSPI_RX_ONLY_MODE;中断: XSPI_EnableInt(XSPI, XSPI_INT_RXFFULL, ENABLE) 与 XSPI_SetRXFIFOFullThreshold;DMA: XSPI_EnableDma 与 DMA_Configuration(DMA1_CH1/DMA1_CH2)。 |
| 程序与数据路径 | main 配好时钟与引脚后置 QE 使能四线;擦除扇区后写入数据,再轮询读回比较; 以接收 FIFO 满中断读回,中断服务程序中取数; 用 DMA 完成写与读并比较。 |
| 主要 API | XSPI_InitBase、XSPI_InitEnhanced、XSPI_EnableInt、XSPI_EnableDma、XSPI_SendData、XSPI_ReceiveData |
| 验证方法 | 串口分别打印 Write data and Read data succeed、Interrupt-Read data succeed、DMA Write data and DMA Read data succeed 表示三条路径数据一致;任一比较失败会打印对应的错误信息。 |
| 使用提示 | 标准模式与增强模式各自需重新调用 XSPI_Standard_Mode_Config、XSPI_Enhanced_Mode_Config 配置;中断读依赖 XSPI_IRQHandler 与 XSPI_INT_RXFFULL,DMA 读等待 DMA_FLAG_TC2;示例默认以 P25Q40 外置 Flash 与全功能板为准。 |
核心代码解读与移植
示例在同一份数据上分别用轮询、中断与 DMA 三条路径读写外置 Flash,并逐条比较结果。
数据路径: XSPI_Standard_Mode_Config 进入标准模式 → Flash_Quad_Mode_Enable 置 QE → Flash_Sector_Erase 擦除扇区 → Flash_Write_Buffer 写入、Flash_Read_Buffer 轮询读回 → Flash_Read_Buffer_Int 与中断服务程序读取 → Flash_Write_Buffer_DMA、Flash_Read_Buffer_DMA 用 DMA 搬运
1. 标准模式初始化。 XSPI_Standard_Mode_Config 填充基础初始化结构体并调用 XSPI_InitBase,用于寄存器读写阶段的单线访问。
void XSPI_Standard_Mode_Config(uint32_t DataFrameSize, uint32_t TransferMode, uint32_t Baudr)
{
XSPI_InitType StandInitStruct;
XSPI_Enable(XSPI, DISABLE);
XSPI_StructBaseInit(&StandInitStruct);
StandInitStruct.Role = XSPI_MASTER_ROLE;
StandInitStruct.DataFrameSize = DataFrameSize;
StandInitStruct.SCPH = XSPI_SCPH_FIRST_EDGE;
StandInitStruct.SCPOL = XSPI_SCPOL_LOW_LEVEL;
StandInitStruct.TransferMode = TransferMode;
StandInitStruct.Baudr = Baudr;
StandInitStruct.NssToggle = XSPI_NSS_TOGGLE_DISABLE;
StandInitStruct.RxdSamplingEdge = XSPI_RXD_HCLK_RISING_SAMPLING;
StandInitStruct.RxdSampleDelay = Baudr / 2;
XSPI_InitBase(XSPI, &StandInitStruct);
XSPI_Slave_Select(XSPI, XSPI_SELECT_SLAVE_1);
}
2. 增强模式初始化。 XSPI_Enhanced_Mode_Config 在基础配置之外再设置帧格式、传输类型与等待周期,用于四线数据访问。
void XSPI_Enhanced_Mode_Config(uint32_t DataFrameSize, uint32_t TransferMode, uint32_t FrameFormat, uint32_t TransferType, uint32_t Baudr, uint32_t WaitCycles)
{
XSPI_EnhancedInitType EnhancedInitStruct;
XSPI_Enable(XSPI, DISABLE);
XSPI_InitEnhancedStruct(&EnhancedInitStruct);
EnhancedInitStruct.SCPH = XSPI_SCPH_FIRST_EDGE;
EnhancedInitStruct.SCPOL = XSPI_SCPOL_LOW_LEVEL;
EnhancedInitStruct.FrameFormat = FrameFormat;
EnhancedInitStruct.DataFrameSize = DataFrameSize;
EnhancedInitStruct.TransferMode = TransferMode;
EnhancedInitStruct.Baudr = Baudr;
EnhancedInitStruct.RxdSamplingEdge = XSPI_RXD_HCLK_RISING_SAMPLING;
EnhancedInitStruct.RxdSampleDelay = 3U;
EnhancedInitStruct.TransferType = TransferType;
EnhancedInitStruct.AddrLen = XSPI_ADDR_LEN_24BIT;
EnhancedInitStruct.InstructLen = XSPI_INST_LEN_8BIT;
EnhancedInitStruct.WaitCycles = WaitCycles;
EnhancedInitStruct.ClockStrech = XSPI_CLOCK_STRETCH_ENABLE;
EnhancedInitStruct.DDREable = XSPI_DDR_DISABLE;
XSPI_InitEnhanced(XSPI, &EnhancedInitStruct);
XSPI_Slave_Select(XSPI, XSPI_SELECT_SLAVE_1);
}
3. 中断方式读取与中断服务程序。 Flash_Read_Buffer_Int 使能接收 FIFO 满中断并配置接收模式,每收到一个数据由中断服务程序取走。
void Flash_Read_Buffer_Int(uint32_t* pBuffer, uint32_t ReadAddr, uint32_t NumWordToRead)
{
XSPI_DisbaleAllInt(XSPI);
NVIC_Initialize();
XSPI_EnableInt(XSPI, XSPI_INT_RXFFULL, ENABLE);
#ifdef P25Q40
/* Quad SPI Format Mode */
#if (READ_SPI_FORMAT_MODE == READ_QUAD_SPI_FORMAT)
#ifdef ADDR_MUTTI_WIRE_TX
/* Instruction will be sent in Standard SPI Mode and Address will be sent in the Quad-wire mode */
XSPI_Enhanced_Mode_Config(XSPI_FRAME_SIZE_32_BIT, XSPI_RX_ONLY_MODE, XSPI_QUAD_LINE_MODE, XSPI_INST_SINGLE_LINE_ADDR_MULTI_LINE, TEST_WR_CLKDIV, FAST_READ_QUAD_IO_WAIT_CYCLES);
#else
/* Instruction and Address will be sent in Standard SPI Mode */
XSPI_Enhanced_Mode_Config(XSPI_FRAME_SIZE_32_BIT, XSPI_RX_ONLY_MODE, XSPI_QUAD_LINE_MODE, XSPI_INST_ADDR_SINGLE_LINE, TEST_WR_CLKDIV, FAST_READ_QUAD_OUTPUT_WAIT_CYCLES);
#endif
中断服务程序在接收 FIFO 满中断中把数据取回缓冲区并累加计数。
void XSPI_IRQHandler(void)
{
if (XSPI_GetINTStatus(XSPI, XSPI_INT_RXFFULL) == SET)
{
XSPI_Rbuffer[rSize] = XSPI_ReceiveData(XSPI);
rSize++;
}
}
4. DMA 方式写页。 Flash_Write_Page_DMA 关闭 XSPI 后设置 DMA 发送阈值并使能发送请求,再启动 DMA 搬移数据并等待传输完成。
void Flash_Write_Page_DMA(uint32_t* pBuffer, uint32_t WriteAddr, uint32_t NumWordToWrite)
{
if(NumWordToWrite != 0)
{
Flash_Write_Enable();
XSPI_Enhanced_Mode_Config(XSPI_FRAME_SIZE_32_BIT, XSPI_TX_ONLY_MODE, XSPI_QUAD_LINE_MODE, XSPI_INST_ADDR_SINGLE_LINE, TEST_WR_CLKDIV, QUAD_INPUT_PAGE_PROGRAM_WAIT_CYCLES);
XSPI_SetNumberOfDataFrame(XSPI, NumWordToWrite);
XSPI_SetTXStartFIFOThreshold(XSPI, XSPI_FIFO_THRESHOLD_LEVEL4);
XSPI_SetDMATxFIFOThreshold(XSPI, XSPI_FIFO_THRESHOLD_LEVEL5);
XSPI_EnableDma(XSPI, XSPI_DMA_TX, ENABLE);
XSPI_Enable(XSPI, ENABLE);
XSPI_Waie_Tx_Compelete();
DMA_Configuration((uint32_t)&XSPI->DAT0, (uint32_t)pBuffer, NumWordToWrite, DMA_TX, DISABLE);
#ifdef P25Q40
XSPI_SendData(XSPI, SPIFLASH_QuadPage_Pro);
XSPI_SendData(XSPI, WriteAddr);
#else
/* Other Flash Operation */
#endif
DMA_RequestRemap(DMA_REMAP_XSPI_TX, DMA1_CH1, ENABLE);
DMA_EnableChannel(DMA1_CH1, ENABLE);
while (XSPI_GetFlagStatus(XSPI, XSPI_TXFE_FLAG) == RESET)
{
}
/*wait TX end */
while(DMA_GetFlagStatus(DMA_FLAG_TC1,DMA1) == RESET) /*wait DMA transfer complete*/
{
}
DMA_ClearFlag(DMA_FLAG_TC1, DMA1);
XSPI_Enable(XSPI, DISABLE);
DMA_Configuration((uint32_t)&XSPI->DAT0, (uint32_t)pBuffer, NumWordToWrite, DMA_TX, DISABLE);
XSPI_Enable(XSPI, ENABLE);
Flash_Check_Busy();
}
}
对应源码: src/xspi_flash.c、src/n32h49x_it.c
5.34.3.2 XSPI_XIP_Mode 内存映射方式读写外置 Flash
工程目录: projects/n32h49x_EVAL/examples/XSPI_V2/XSPI_XIP_Mode/
初始化日志、时钟与 GPIO→置 QE 使能四线并擦除扇区→配置 XIP 读并从映射地址读回→配置 XIP 写并逐字写入→读回比较并打印结论
| 项目 | 源码解读 |
|---|---|
| 功能 | 在 XIP(内存映射)模式下访问外置 Flash; 读操作直接从映射基址取数,写操作通过 XIP 写操作码逐字下发。 |
| 源码组成 | src/main.c:main、Delay;src/xspi_flash.c:RCC_Configuration、Hardware_Configuration、XSPI_Standard_Mode_Config、XSPI_XIP_Mode_Config、Flash_XIP_Read_Buffer、Flash_XIP_Write_Buffer 等;inc/main.h、inc/xspi_flash.h:宏与声明;readme.txt、MDK-ARM/、EWARM/:说明与工程文件。 |
| 关键配置 | 映射基址:XIP_REMAP_BASE_ADDR 为 0x90000000;XIP 读:读模式配置加 XSPI_SetXIPReadIncrOpcode;XIP 写:写模式配置加 XSPI_SetXIPWriteIncrOpcode,并把 XSPI_SetNumberOfDataFrame 设为 1。 |
| 程序与数据路径 | main 配好时钟与引脚后置 QE 并擦除扇区;Flash_XIP_Read_Buffer 配置 XIP 读并读映射地址校验擦除结果;Flash_XIP_Write_Buffer 逐字配置 XIP 写并写映射地址,再读回;main 比较读回与写入并打印结论。 |
| 主要 API | XSPI_InitXIP、XSPI_SetXIPModeBit、XSPI_SetXIPReadIncrOpcode、XSPI_SetXIPWriteIncrOpcode、XSPI_SetNumberOfDataFrame |
| 验证方法 | 串口打印 XIP-Write data and XIP-Read data succeed 表示写入与读回一致;擦除后读回若含非 0xFFFFFFFF 数据会打印 XIP 读错误。 |
| 使用提示 | XIP 读通过 XIP_REMAP_BASE_ADDR 加偏移直接读取,无需逐字搬移;XIP 写需逐字配置并把数据帧数量设为 1; 示例默认以 P25Q40 外置 Flash 与全功能板为准。 |
核心代码解读与移植
示例用 XIP 模式把外置 Flash 映射到固定基址,读操作直接按地址取数,写操作通过 XIP 写操作码逐字完成。
数据路径: XSPI_Standard_Mode_Config 进入标准模式 → Flash_Quad_Mode_Enable 置 QE 与 Flash_Sector_Erase 擦除 → XSPI_XIP_Mode_Config 配置 XIP 读并 XSPI_SetXIPReadIncrOpcode 设读操作码 → Flash_XIP_Read_Buffer 按映射地址读回 → Flash_XIP_Write_Buffer 配置 XIP 写并逐字写映射地址 → 读回比较
1. XIP 模式配置。 XSPI_XIP_Mode_Config 填充 XIP 初始化结构体,按读或写分别设置只收或只发模式与相关参数。
void XSPI_XIP_Mode_Config(uint32_t TransferMode, uint32_t FrameFormat, uint32_t TransferType, uint32_t Baudr, uint32_t WaitCycles, uint32_t XipModeBit)
{
XSPI_XIPInitType XIPInitStruct;
XSPI_Enable(XSPI, DISABLE);
XSPI_InitXIPStruct(&XIPInitStruct);
XIPInitStruct.SCPH = XSPI_SCPH_FIRST_EDGE;
XIPInitStruct.SCPOL = XSPI_SCPOL_LOW_LEVEL;
XIPInitStruct.DataFrameSize = XSPI_FRAME_SIZE_32_BIT;
XIPInitStruct.Baudr = Baudr;
XIPInitStruct.XipFrameFormat = FrameFormat;
XIPInitStruct.XipTransferType = TransferType;
XIPInitStruct.XipAddrLen = XSPI_ADDR_LEN_24BIT;
XIPInitStruct.XipWaitCycles = WaitCycles;
XIPInitStruct.XipDDREable = XSPI_DDR_DISABLE;
if (TransferMode == XSPI_RX_ONLY_MODE)
{
XIPInitStruct.TransferMode = XSPI_RX_ONLY_MODE;
XIPInitStruct.XIP_Info.Read_XIPInitType.XipInstructLen = XSPI_INST_LEN_8BIT;
XIPInitStruct.XIP_Info.Read_XIPInitType.XipInstrctEnable = XSPI_XIP_INSTRUCT_ENABLE;
XIPInitStruct.XIP_Info.Read_XIPInitType.XipDFSHC = XSPI_XIP_DFSHC_ENABLE;
XIPInitStruct.XIP_Info.Read_XIPInitType.XipPrefetch = XSPI_XIP_PREFETCH_ENABLE;
XIPInitStruct.XIP_Info.Read_XIPInitType.XipModeBit = XipModeBit;
XIPInitStruct.XIP_Info.Read_XIPInitType.XipModeBitLen = XSPI_XIP_MODE_BIT_LEN_8_BIT;
XIPInitStruct.XIP_Info.Read_XIPInitType.ContinueTransfer.XipContinueTransfer = XSPI_XIP_CONTINUE_TRANSFER_ENABLE;
XIPInitStruct.XIP_Info.Read_XIPInitType.ContinueTransfer.XipWatchDogTimeout = 100U;
XIPInitStruct.XIP_Info.Read_XIPInitType.Info.Rxds_InitType.RxdSamplingEdge = XSPI_RXD_HCLK_RISING_SAMPLING;
XIPInitStruct.XIP_Info.Read_XIPInitType.Info.Rxds_InitType.RxdSampleDelay = 3U;
}
else
{
XIPInitStruct.TransferMode = XSPI_TX_ONLY_MODE;
XIPInitStruct.XIP_Info.Write_XIPInitType.XipInstructLen = XSPI_INST_LEN_8BIT;
}
XSPI_InitXIP(XSPI, &XIPInitStruct);
XSPI_XIP_Slave_Select(XSPI, XSPI_SELECT_SLAVE_1);
}
2. XIP 读回。 Flash_XIP_Read_Buffer 使能 XSPI 后按 XIP_REMAP_BASE_ADDR 加偏移逐字读取映射地址。
XSPI_SetRXFIFOFullThreshold(XSPI, XSPI_FIFO_THRESHOLD_LEVEL13);
XSPI_Enable(XSPI, ENABLE);
while (number < NumWordToRead)
{
pBuffer[number] = *((uint32_t *)(XIP_REMAP_BASE_ADDR + ReadAddr + number * 4));
number++;
}
3. XIP 写入。 Flash_XIP_Write_Buffer 逐个数据重新配置 XIP 写模式并把数据帧数量设为 1,再写入映射地址。
void Flash_XIP_Write_Buffer(uint32_t* pBuffer, uint32_t WriteAddr, uint32_t NumWordToWrite)
{
uint32_t number = 0;
while (number < NumWordToWrite)
{
Flash_Write_Enable();
XSPI_XIP_Mode_Config(XSPI_TX_ONLY_MODE, XSPI_QUAD_LINE_MODE, XSPI_INST_ADDR_SINGLE_LINE, TEST_WR_CLKDIV, QUAD_INPUT_PAGE_PROGRAM_WAIT_CYCLES, 0);
XSPI_SetXIPWriteIncrOpcode(XSPI, SPIFLASH_QuadPage_Pro);
XSPI_SetNumberOfDataFrame(XSPI, 1);
XSPI_Enable(XSPI, ENABLE);
XSPI_Waie_Tx_Compelete();
*((uint32_t *)(XIP_REMAP_BASE_ADDR + WriteAddr + number * 4)) = pBuffer[number];
number++;
Flash_Check_Busy();
}
}
对应源码: src/xspi_flash.c
5.34.4 注意与排障
| 场景 | 检查与建议 | 来源 |
|---|---|---|
| 命令阶段 | 命令包含 Instruction、Address、Mode bits、Wait cycles、Data 五个阶段,任一阶段可跳过,但至少要保留其中一个。 | 用户手册 |
| Mode bits | Mode bits 阶段只在 XIP 模式使用; 使能后会在地址阶段后插入模式位,位宽为 2、4、8 或 16。 |
用户手册 |
| DDR 波特率 | DDR 模式下波特率值应为 4 的倍数。 | 用户手册 |
| XIP 帧格式 | XIP 操作只支持 Dual、Quad、Octal 模式,XSPI_CTRL0.SPIFRF 不能配置为 0。 |
用户手册 |
| Tx and Rx 模式 | Tx and Rx 模式只有在标准 SPI 模式(XSPI_CTRL0.SPIFRF 为 00)下才可使用。 |
用户手册 |
| EEPROM read 模式 | EEPROM read 模式只有在标准 SPI 模式(XSPI_CTRL0.SPIFRF 为 00)下才可使用,读取字节数在 XSPI_CTRL1.NDF 中指定。 |
用户手册 |
| 指令与地址 | 一条指令占用 1 个 FIFO 地址,地址可以占用多个 FIFO 位置,指令和地址都需写入 XSPI_DATx 寄存器。 |
用户手册 |
| XIP 接收 FIFO 溢出 | XIP 传输中若 RX FIFO 深度不足可能溢出导致数据错误,软件检测到 RX FIFO 溢出后必须重新尝试数据传输。 | 用户手册 |