#include "fsl_flexspi.h"
#include "fsl_iomuxc.h"
#define FPGA_COMM_FLEXSPI FLEXSPI
#define FLASH_SIZE 0x2000
#define EXAMPLE_FLEXSPI_AMBA_BASE FlexSPI_AMBA_BASE
#define FPGA_CMD_LUT_SEQ_IDX_READ 0U
#define FPGA_CMD_LUT_SEQ_IDX_WRITE 1U
static flexspi_device_config_t deviceconfig = {
.flexspiRootClk = 25000000, // 25MHz (<30MHz)
//.isSck2Enabled = false,
.flashSize = FLASH_SIZE,
.CSIntervalUnit = kFLEXSPI_CsIntervalUnit1SckCycle,
.CSInterval = 2,
.CSHoldTime = 3,
.CSSetupTime = 3,
.dataValidTime = 0,
.columnspace = 0,
.enableWordAddress = 0,
.AWRSeqIndex = FPGA_CMD_LUT_SEQ_IDX_WRITE,
.AWRSeqNumber = 1,
.ARDSeqIndex = FPGA_CMD_LUT_SEQ_IDX_READ,
.ARDSeqNumber = 1,
.AHBWriteWaitUnit = kFLEXSPI_AhbWriteWaitUnit2AhbCycle,
.AHBWriteWaitInterval = 0,
//.enableWriteMask = false
};
#define CUSTOM_LUT_LENGTH 64
const uint32_t customLUT[CUSTOM_LUT_LENGTH] = {
/* Read Data: control byte = 0 (Read), */
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0x0, kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0x18), // 0x0: control byte - read, 0x18 -> 3 byte address, 3*8 = 24 bits
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 0x4, kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0x4), // 0x4(1) = 4 dummy cylces, 0x4(2): 4 bytes read out
0, 0, /* NOTE: initialise this way to avoid "sorry, unimplemented: non-trivial designated initializers not supported" */
/* Write Data: control byte = 0 (Read), */
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0x0B, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 0x18),
0, 0, 0,
};
void initialise()
{
// ************************ initialise pins ************************
IOMUXC_SetPinMux(
IOMUXC_GPIO_SD_B1_00_FLEXSPIB_DATA03,
1U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_SD_B1_01_FLEXSPIB_DATA02,
1U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_SD_B1_02_FLEXSPIB_DATA01,
1U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_SD_B1_03_FLEXSPIB_DATA00,
1U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_SD_B1_04_FLEXSPIB_SCLK,
1U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_SD_B1_05_FLEXSPIB_SS0_B,
1U);
IOMUXC_SetPinMux(
IOMUXC_GPIO_SD_B0_05_FLEXSPIB_DQS,
1U);
// ************************ initialise clock ************************
const clock_usb_pll_config_t g_ccmConfigUsbPll = {.loopDivider = 0U};
/*
* USB1 PLL: 480Mhz
* PLL3_PFD0: 664.61Mhz (/13 * 18)
* FLEXSPI_PODF: 2 (to get 332.3Mhz) */
// CSCMR1[FLEXSPI_PODF]
// 14.7.7 CCM Serial Clock Multiplexer Register 1 (CCM_CSCMR1)
// Figure 14-2. Clock Tree - Part 1: IMXRT1050RM
// USB1 PLL ((480MHz PLL3) => ((480MHz * 18) / fraction)
// PFD0_FRAC = 24
// 480*18/PFD0_FRAC where PFD0_FRAC is in the range 12-35.
CLOCK_InitUsb1Pll(&g_ccmConfigUsbPll);
CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 24); /* Set PLL3 PFD0 clock TO 360MHZ. */
// CCM_CSCMR1 field(bit 30-29) descriptions
// FLEXSPI_CLK_SEL
// 00 derive clock from semc_clk_root_pre
// 01 derive clock from pll3_sw_clk
// 10 derive clock from PLL2 PFD2
// 11 derive clock from PLL3 PFD0
CLOCK_SetMux(kCLOCK_FlexspiMux, 0x3); /* Choose PLL3 PFD0 clock as flexspi source clock. */
//
// FLEXSPI_PODF = 3 bit (0..7)
CLOCK_SetDiv(kCLOCK_FlexspiDiv, 7); /* Divide the clock by 3 to get flexspi root clock 360MHZ / 3 = 120MHZ */
// ************************ initialise flexspi config ************************
flexspi_config_t config;
/*Get FLEXSPI default settings and configure the flexspi. */
FLEXSPI_GetDefaultConfig(&config);
/*Set AHB buffer size for reading data through AHB bus. */
config.ahbConfig.enableAHBPrefetch = true;
config.ahbConfig.enableAHBBufferable = true;
config.ahbConfig.enableReadAddressOpt = true;
config.ahbConfig.enableAHBCachable = true;
config.rxSampleClock = kFLEXSPI_ReadSampleClkLoopbackFromDqsPad;
FLEXSPI_Init(FLEXSPI, &config);
#if 0
/* Configure flash settings according to serial flash feature. */
FLEXSPI_SetFlashConfig(FLEXSPI, &deviceconfig, kFLEXSPI_PortB1);
/* Update LUT table. */
FLEXSPI_UpdateLUT(FLEXSPI, 0, customLUT, CUSTOM_LUT_LENGTH);
/* Do software reset. */
FLEXSPI_SoftwareReset(FLEXSPI);
#endif
}