; -------------------------------------------------------------------------------- ; @Title: SPI FLASH Program script for the LPC54018 ; ; @Description: ; The W25Q128 (Winbond) is connected to the SPIFI controller ; ; SRAM: 0x20001000 ; SPIFI(controller) Base: 0x400800000 ; SPIFI memory mapped ADDRESS: 0x10000000 ; ; PIO0_23 FLASH_CSn ; PIO0_24 FLASH_IO0 ; PIO0_25 FLASH_IO1 ; PIO0_26 FLASH_CLK ; PIO0_27 FLASH_IO3 ; PIO0_28 FLASH_IO2 ; ; Script arguments: ; ; DO lpc54018-spi [PREPAREONLY] [CPU=] [DUALPORT=0|1] ; ; PREPAREONLY only declares flash but does not execute flash programming ; ; CPU= selects CPU derivative ; ; DUALPORT=0|1 default value is 0 (disabled). ; ; Example: ; ; DO ~~/demo/arm/flash/lpc54018-spi.cmm PREPAREONLY DUALPORT=1 ; ; @Chip: LPC54018JET180 ; @Board: LPC540xx Dev Board ; @Author: JIM ; @Keywords: ARM, LPC54018, SPI ; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Id: lpc54018-spi.cmm 12731 2023-11-17 07:20:36Z mschaeffner $ &SPI_BASE=0x40080000 PRIVATE ¶meters ENTRY %LINE ¶meters PRIVATE ¶m_prepareonly ¶m_cpu ¶m_dualport ¶m_prepareonly=(STRing.SCAN(STRing.UPpeR("¶meters"),"PREPAREONLY",0)!=-1) ¶m_cpu=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"CPU=","") ¶m_dualport=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"DUALPORT=","0") ; -------------------------------------------------------------------------------- ; initialize and start the debugger RESet SYStem.RESet SYStem.CPU LPC54018JET180 SYStem.CONFIG.DEBUGPORTTYPE SWD IF hardware.COMBIPROBE()||hardware.UTRACE() ( SYStem.CONFIG.CONNECTOR MIPI20T ) SYStem.Option DUALPORT ON SYStem.MemAccess DAP SYStem.JtagClock CTCK 10MHz Trace.DISable SYStem.Up ; ------------------------------------------------------------------------------ ; clk enable Data.Set SD:0x40000200 %LE %Long 0x1243B ;AHBCLKCTRL0(AHB Clock control 0.), spifi power/clk enable Data.Set SD:0x400002A0 %LE %Long 0x00003 ;SPIFICLKSEL(SPIFI clock select register) , 0x0 main_clk, 0x1:pll_clk Data.Set SD:0x40000390 %LE %Long 0x00003 ;SPIFICLKDIV(SPIFI clock divider register) , div16 ; ------------------------------------------------------------------------------ ; pin mux setting (alternative function setting) Data.Set SD:0x4000105C %LE %Long 0x766 ;PIO0_23, nCS, FUNC6 Data.Set SD:0x40001060 %LE %Long 0x766 ;PIO0_24, IO0, FUNC6 Data.Set SD:0x40001064 %LE %Long 0x766 ;PIO0_25, IO1, FUNC6 Data.Set SD:0x40001068 %LE %Long 0x766 ;PIO0_26, CLK, FUNC6 Data.Set SD:0x4000106C %LE %Long 0x766 ;PIO0_27, IO3, FUNC6 Data.Set SD:0x40001070 %LE %Long 0x766 ;PIO0_28, IO2, FUNC6 ; ------------------------------------------------------------------------------ ; spi controller setting GOSUB SPI_INIT ; enable memory map mode (ahb: 0x1000_0000) GOSUB READ_ID_TEST ; ------------------------------------------------------------------------------ ; Flash declaration GOSUB FlashDeclaration "¶m_dualport" ; Flash script ends here if called with parameter PREPAREONLY IF ¶m_prepareonly ENDDO PREPAREDONE ; ------------------------------------------------------------------------------- ; Flash programming example DIALOG.YESNO "Program flash memory?" LOCAL &progflash ENTRY &progflash IF &progflash ( FLASH.ReProgram.ALL Data.LOAD.auto * FLASH.ReProgram.off ; Reset device SYStem.Down SYStem.Up ) ENDDO READ_ID_TEST: ( Data.Set A:(&SPI_BASE+0x4) %Long 0x9F200004 ; opcode with no address / input (cpu-> flash) / data length 4 &temp=Data.Long(A:&SPI_BASE+0x14) PRINT "1st 0x" (&temp)&0xFF " (Manufacturer)" PRINT "2nd 0x" (&temp>>8.)&0xFF " (Device ID)" PRINT "3rd 0x" (&temp>>16.)&0xFF PRINT "4th 0x" (&temp>>24.)&0xFF GOSUB SPI_INIT ; enable memory map mode (ahb: 0x1000_0000) RETURN ) SPI_INIT: ( Data.Set SD:0x40080000 %LE %Long 0x600F03E8 Data.Set SD:0x4008001C %LE %Long -1 ;clear status Data.Set SD:0x40080018 %LE %Long 0xEB930000 RETURN ) FlashDeclaration: ( PRIVATE &FlashSize &FlashDriver &FlashBaseAddr PARAMETERS &DualPort FLASH.RESet &FlashDriver="snor3b_lpc54018.bin" &FlashSize=0x1000000 ;16Mbytes &FlashBaseAddr=0x10000000 ;SPI AHB base address FLASH.Create &FlashBaseAddr++(&FlashSize-0x1) 0x10000 TARGET2 Byte IF "&DualPort"=="0" FLASH.TARGET2 0x20001000 0x20002000 0x2000 ~~/demo/arm/flash/byte/&FlashDriver ELSE FLASH.TARGET2 0x20001000 E:0x20002000 0x2000 ~~/demo/arm/flash/byte/&FlashDriver /DualPort FLASH.List RETURN )