; -------------------------------------------------------------------------------- ; @Title: SPI(Serial NOR) Flash Program script for IMXRT1176 on IMXRT1170-EVK ; @Description: ; IS25WP128A(ISSI) / ; W25Q128(WINBOND, U23) is on FLEXSPI_A_SS0 ; ; SRAM: 0x20001000 ; FlexSPI(controller) Base: 0x400CC000 ; FlexSPI AHB memory mapped ADDRESS: 0x30000000 ; ; Prerequisites: ; SW1 SW2 ; 0010 00000000 (QSPI_FLASH) ; ; @Keywords: ARM, Cortex-M7 ; @Author: JIM ; @Board: IMXRT1170-EVK ; @Chip: IMXRT1176-CM7 ; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Id: imxrt1170-cm7-spi.cmm 12938 2024-01-15 15:23:13Z pegold $ PRIVATE ¶meters ¶m_prepareonly ENTRY %LINE ¶meters ¶m_prepareonly=(STRing.SCAN(STRing.UPpeR("¶meters"),"PREPAREONLY",0)!=-1) &FLEXSPI_BASE=0x400CC000 ;FLEXSPI_A controller base address &FLASH_SIZE=0x1000000 ;SPI FLASH MEMORY SIZE ex. 16MB &FLASH_SECTOR_SIZE=0x10000 ;SPI FLASH Sector SIZE ex. uniform 64KB sector ; ------------------------------------------------------------------------------ ; Setup CPU SYStem.Down IF SYStem.Mode()<5 ( RESet SYStem.RESet SYStem.CPU IMXRT1176-CM7 SYStem.CONFIG.DEBUGPORTTYPE SWD SYStem.Option.DUALPORT ON SYStem.MemAccess DAP SYStem.JtagClock 10MHz Trace.DISable SYStem.Up ) ; ------------------------------------------------------------------------------ ; Flash Power & Clock Enable GOSUB clockInit ; ------------------------------------------------------------------------------ ; Flash Pin Mux Configuration GOSUB IOMUXconfig ; ------------------------------------------------------------------------------ ; Flash Controller Init GOSUB FLEXSPIconfig ; ------------------------------------------------------------------------------ ; Flash Read ID Test GOSUB READ_ID_TEST ; ------------------------------------------------------------------------------ ; Flash declaration FLASH.RESet FLASH.Create 1. 0x30000000++(&FLASH_SIZE-1) &FLASH_SECTOR_SIZE TARGET Byte ;FLEXSPI1 ;FLASH.Create 2. 0x60000000++(&FLASH_SIZE-1) &FLASH_SECTOR_SIZE TARGET Byte ;FLEXSPI2 IF &FLASH_SIZE>0x1000000 FLASH.TARGET 0x20001000 EAHB:0x20003000 0x2000 ~~/demo/arm/flash/byte/snor_imxrt1170.bin /STACKSIZE 0x400 /DualPort ELSE FLASH.TARGET 0x20001000 EAHB:0x20003000 0x2000 ~~/demo/arm/flash/byte/snor3b_imxrt1170.bin /STACKSIZE 0x400 /DualPort IF ¶m_prepareonly ENDDO FLASH.List ;ReProgram Flash ;FLASH.ReProgram ALL ;Data.LOAD.auto * ;Data.LOAD.Binary * 0x30000000 ;FLASH.ReProgram OFF ENDDO FLEXSPIconfig: ( //unlock Data.Set A:&FLEXSPI_BASE+0x018 %LE %Long 0x5AF05AF0 Data.Set A:&FLEXSPI_BASE+0x01C %LE %Long 2 //controller init Data.Set A:&FLEXSPI_BASE+0x000 %LE %Long 0xFFFF8000|(0x3<<8.) ; CR[10:8] div spi_clk Data.Set A:&FLEXSPI_BASE+0x004 %LE %Long 0xFFFFFFFF Data.Set A:&FLEXSPI_BASE+0x008 %LE %Long 0x200001F7 Data.Set A:&FLEXSPI_BASE+0x00C %LE %Long 0x58 Data.Set A:&FLEXSPI_BASE+0x020 %LE %Long 0x80000000 Data.Set A:&FLEXSPI_BASE+0x024 %LE %Long 0x80000000 Data.Set A:&FLEXSPI_BASE+0x028 %LE %Long 0x80000000 Data.Set A:&FLEXSPI_BASE+0x060 %LE %Long 0x00200000 Data.Set A:&FLEXSPI_BASE+0x060 %LE %Long (&FLASH_SIZE>>10.) ; 0x4000 * 0x400(KB unit size) = 16MB Flash_A0 size. Data.Set A:&FLEXSPI_BASE+0x064 %LE %Long (&FLASH_SIZE>>10.) Data.Set A:&FLEXSPI_BASE+0x068 %LE %Long (&FLASH_SIZE>>10.) Data.Set A:&FLEXSPI_BASE+0x06C %LE %Long (&FLASH_SIZE>>10.) //timing Data.Set A:&FLEXSPI_BASE+0x070 %LE %Long 0x00000063 Data.Set A:&FLEXSPI_BASE+0x074 %LE %Long 0x00000063 Data.Set A:&FLEXSPI_BASE+0x078 %LE %Long 0x00000063 Data.Set A:&FLEXSPI_BASE+0x07C %LE %Long 0x00000063 Data.Set A:&FLEXSPI_BASE+0x080 %LE %Long 0x00000900 Data.Set A:&FLEXSPI_BASE+0x084 %LE %Long 0x00000900 Data.Set A:&FLEXSPI_BASE+0x088 %LE %Long 0x00000900 Data.Set A:&FLEXSPI_BASE+0x08C %LE %Long 0x00000900 Data.Set A:&FLEXSPI_BASE+0x0B8 %LE %Long 0x1 ; water marker level 0 , reset assert 0x1 Data.Set A:&FLEXSPI_BASE+0x0BC %LE %Long 0x1 ; water marker level 0 , reset assert 0x1 Data.Set A:&FLEXSPI_BASE+0x0C0 %LE %Long 0x0100 Data.Set A:&FLEXSPI_BASE+0x0C4 %LE %Long 0x0100 //LUT0 for read the spi memory data to the AHB IF &FLASH_SIZE>0x1000000 ( //4Bytes Address Mode //FAST READ Quad I/O 0xEC : 1-4-4 Data.Set A:&FLEXSPI_BASE+0x200 %LE %Long 0x0A2004EC ; (0x0A: RADDR_SDR(2)| four pad(2)) / (0x04: CMD_SDR(1)| one pad(0)) ; cmd(0xEC) -> addr(32bits) Data.Set A:&FLEXSPI_BASE+0x204 %LE %Long 0x26043206 ; (0x32: DUMMY_SDR(0xC)| four pad(2)) / (0x26: READ_SDR(0x9)|four pad(2)) ; dummy(6bits) -> read data (4Bytes) Data.Set A:&FLEXSPI_BASE+0x208 %LE %Long 0x00 Data.Set A:&FLEXSPI_BASE+0x20C %LE %Long 0x00 //Normal Read Mode 0x13 : 1-1-1 ; Data.Set A:&FLEXSPI_BASE+0x200 %LE %Long 0x08200413 ; (0x08: RADDR_SDR(2)| one pad(0)) / (0x04: CMD_SDR(1)| single pad(0)) ; cmd 03 -> addr(32bits) ; Data.Set A:&FLEXSPI_BASE+0x204 %LE %Long 0x00002404 ; (0x24: READ_SDR(0x9)|one pad(0)) ;read data(4Bytes) ; Data.Set A:&FLEXSPI_BASE+0x208 %LE %Long 0x00 ; Data.Set A:&FLEXSPI_BASE+0x20C %LE %Long 0x00 ) ELSE ( //3Bytes Address Mode //FAST READ Quad I/O 0xEB : 1-4-4 ; Data.Set A:&FLEXSPI_BASE+0x200 %LE %Long 0x0A1804EB ; (0x0A: RADDR_SDR(2)| four pad(2)) / (0x04: CMD_SDR(1)| one pad(0)) ; cmd(0xEB) -> addr(24bits) ; Data.Set A:&FLEXSPI_BASE+0x204 %LE %Long 0x26043206 ; (0x32: DUMMY_SDR(0xC)| four pad(2)) / (0x26: READ_SDR(0x9)|four pad(2)) ; dummy(6bits) -> read data (4Bytes) ; Data.Set A:&FLEXSPI_BASE+0x208 %LE %Long 0x00 ; Data.Set A:&FLEXSPI_BASE+0x20C %LE %Long 0x00 //Normal Read Mode 0x03 : 1-1-1 Data.Set A:&FLEXSPI_BASE+0x200 %LE %Long 0x08180403 ; (0x08: RADDR_SDR(2)| one pad(0)) / (0x04: CMD_SDR(1)| single pad(0)) ; cmd 03 -> addr(24bits) Data.Set A:&FLEXSPI_BASE+0x204 %LE %Long 0x00002404 ; (0x24: READ_SDR(0x9)|one pad(0)) ;read data(4Bytes) Data.Set A:&FLEXSPI_BASE+0x208 %LE %Long 0x00 Data.Set A:&FLEXSPI_BASE+0x20C %LE %Long 0x00 ) //AHB update automatically even though the window size is < 1KB Data.Set A:&FLEXSPI_BASE+0x00C %LE %Long Data.Long(A:&FLEXSPI_BASE+0x00C)&~0x20 RETURN ) IOMUXconfig: ( //pin mux Data.Set SD:0x400E8554 %LE %Long 0x1 ;FLEXSPI1_I_IO_FA_SELECT_INPUT_0 DAISY Data.Set SD:0x400E8558 %LE %Long 0x1 ;FLEXSPI1_I_IO_FA_SELECT_INPUT_1 DAISY Data.Set SD:0x400E855C %LE %Long 0x1 ;FLEXSPI1_I_IO_FA_SELECT_INPUT_2 DAISY Data.Set SD:0x400E8560 %LE %Long 0x1 ;FLEXSPI1_I_IO_FA_SELECT_INPUT_3 DAISY Data.Set SD:0x400E81CC %LE %Long 0x1 ;GPIO_SD_B2_06, FLEXSPI1_A_SS0 Data.Set SD:0x400E81D0 %LE %Long 0x11 ;GPIO_SD_B2_07, FLEXSPI1_A_SCLK Data.Set SD:0x400E81D4 %LE %Long 0x1 ;GPIO_SD_B2_08, FLEXSPI1_A_DATA00 Data.Set SD:0x400E81D8 %LE %Long 0x1 ;GPIO_SD_B2_09, FLEXSPI1_A_DATA01 Data.Set SD:0x400E81DC %LE %Long 0x1 ;GPIO_SD_B2_10, FLEXSPI1_A_DATA02 Data.Set SD:0x400E81E0 %LE %Long 0x1 ;GPIO_SD_B2_11, FLEXSPI1_A_DATA03 RETURN ) clockInit: ( // Enable all clocks RETURN ) READ_ID_TEST: ( PRINT "READ_ID_TEST..." Data.Set ASD:&FLEXSPI_BASE+0x80 %LE %Long 0x80000900 ;FLASHCR2 Data.Set ASD:&FLEXSPI_BASE+0x14 %LE %Long -1 ;INTR clear Data.Set A:&FLEXSPI_BASE+0xB8 %Long 0x1 ;IPRXFCR Data.Set A:&FLEXSPI_BASE+0xBC %Long 0x1 ;IPTXFCR Data.Set A:&FLEXSPI_BASE+0x250 %LE %Long 0x2404049F ;readid with 4 bytes READ data Data.Set A:&FLEXSPI_BASE+0x254 %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x258 %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x25c %LE %Long 0x0 ; Data.Set A:&FLEXSPI_BASE+0x0A4 %LE %Long (5.<<16.)|0x4 Data.Set A:&FLEXSPI_BASE+0x0B0 %LE %Long 1 ;start PRINT "1st 0x" Data.Long(A:&FLEXSPI_BASE+0x100)&0xFF " (Manufacturer)" PRINT "2nd 0x" (Data.Long(A:&FLEXSPI_BASE+0x100)>>8.)&0xFF " (Device ID)" PRINT "3rd 0x" (Data.Long(A:&FLEXSPI_BASE+0x100)>>16.)&0xFF PRINT "4th 0x" Data.Long(A:&FLEXSPI_BASE+0x100)>>24. RETURN )