Read Id using flex SPI on QPI mode

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Read Id using flex SPI on QPI mode

1,272 Views
adi2Intel
Contributor III

we are an the end of our project 

we are now trying to use the QPI mode on the example: flexspi_nor_polling_transfer

we now want to use QPI mode (not quad mode)

the modified LUT table:

const uint32_t customLUT[CUSTOM_LUT_LENGTH] = {
/* Normal read mode -SDR */
[4 * NOR_CMD_LUT_SEQ_IDX_READ_NORMAL] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x13, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20),
[4 * NOR_CMD_LUT_SEQ_IDX_READ_NORMAL + 1] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

/* Fast read mode - SDR */
[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x0C, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20),
[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST + 1] = FLEXSPI_LUT_SEQ(
kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_1PAD, 0x08, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),

/* Fast read quad mode - SDR */
[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x6C, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20),
[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD + 1] = FLEXSPI_LUT_SEQ(
kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_1PAD, 0x08, kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04),

/* Read Identification - REMS */
[4 * NOR_CMD_LUT_SEQ_IDX_READSTATUS] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x90, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x03),
[4 * NOR_CMD_LUT_SEQ_IDX_READSTATUS + 1] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x03, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

/* Write Enable */
[4 * NOR_CMD_LUT_SEQ_IDX_WRITEENABLE] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x06, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

/* Erase Sector */
[4 * NOR_CMD_LUT_SEQ_IDX_ERASESECTOR] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xDC, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20),

/* Page Program - single mode */
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x12, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20),
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE + 1] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

/* Page Program - quad mode */
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x34, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20),
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD + 1] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

/* Read ID */
[4 * NOR_CMD_LUT_SEQ_IDX_READID] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x9F, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),

/* Enable Quad mode, Latency Code set */
[4 * NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x31, kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04),

/* Read Configuration Register (RDCR 35h) */
[4 * NOR_CMD_LUT_SEQ_IDX_ENTERQPI] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x35, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),

/* Exit QPI mode */ /* 使用しない。S25FL512SAGMFA010に無いコマンドだが共通化のため削除しない */
[4 * NOR_CMD_LUT_SEQ_IDX_EXITQPI] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0xFF, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

/* Read status register */
[4 * NOR_CMD_LUT_SEQ_IDX_READSTATUSREG] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x05, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),

/* Erase whole chip */
[4 * NOR_CMD_LUT_SEQ_IDX_ERASECHIP] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xC7, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
};

 

from spec :

adi2Intel_0-1673509824998.png

 

we want to read JedecID on QPI style :

adi2Intel_1-1673509861126.png

but after calling 

flexspi_nor_enable_qpi_mode(EXAMPLE_FLEXSPI);

flexspi_nor_get_vendor_id(EXAMPLE_FLEXSPI, &vendorID,kFLEXSPI_PortB1);

we see on the logic analyzer that we transaction was on single spi and seems QPI not working

I read status register as 0x7f (01111111) and I cannot modify it

 

adi2Intel_0-1673516039184.png

 

#define FLEXSPI_CONFIG_REG_QUAD_SET_VALUE 0x2U // QUAD = 1

status_t flexspi_nor_enable_qpi_mode(FLEXSPI_Type *base)
{
flexspi_transfer_t flashXfer;
status_t status;
uint32_t writeValue = 0x0200;
uint32_t configValue;

/*! Read Configuration Register */
flashXfer.deviceAddress = 0;
flashXfer.port = FLASH_PORT;
flashXfer.cmdType = kFLEXSPI_Read;
flashXfer.SeqNumber = 1;
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_ENTERQPI; //!< Read Configuration Register (RDCR 35h)
flashXfer.data = &configValue;
flashXfer.dataSize = 1;

status = FLEXSPI_TransferBlocking(FLEXSPI, &flashXfer);
if (status != kStatus_Success)
{
return status;
}

//! QUAD bit set
writeValue = (configValue | FLEXSPI_CONFIG_REG_QUAD_SET_VALUE) ;

/* Write enable */
status = flexspi_nor_write_enable(base, 0); //!< flexspi_nor_write_enable

if (status != kStatus_Success)
{
return status;
}

/* Enable quad mode. */
flashXfer.deviceAddress = 0;
flashXfer.port = FLASH_PORT;
flashXfer.cmdType = kFLEXSPI_Write;
flashXfer.SeqNumber = 1;
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG;
flashXfer.data = &writeValue;
flashXfer.dataSize = 1;

status = FLEXSPI_TransferBlocking(base, &flashXfer);
if (status != kStatus_Success)
{
return status;
}

status = flexspi_nor_wait_bus_busy(base);

/* Do software reset. */
FLEXSPI_SoftwareReset(base);

return status;
}

0 Kudos
Reply
4 Replies

1,239 Views
Omar_Anguiano
NXP TechSupport
NXP TechSupport

Hello
I hope you are well.

I notice in your LUTs there is missing the Enter QPI mode:
[4 * NOR_CMD_LUT_SEQ_IDX_ENTERQPI] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x38, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

In the flexspi_nor_enable_qpi_mode() please first enable QE bit, it is correct the way you are setting it but it should be the first thing you do on that function so then the command 0x38 can be called to enter QPI.

Regarding you being unable to erase, could you please use serial download mode in MCUBootUtility to perform a flash erase operation?

Best regards,
Omar

0 Kudos
Reply

1,222 Views
adi2Intel
Contributor III

are you sure "kFLEXSPI_Command_STOP" parameter should be entered to LUT for enter QPI mode?

 

in addition - lets say i will succeed enter QPI mode, the read ID in the LUT mode should be the same?

no parameters needs to be modified?

I need the opcode and the returned data from the device will be spread to 4 lines.

adi2Intel_0-1673947251809.png

 

0 Kudos
Reply

1,205 Views
Omar_Anguiano
NXP TechSupport
NXP TechSupport

Yes, I followed the IS25WP064A LUTs to check this. It is important that QE is enabled first before calling this command.
You need to modify the macro kFLEXSPI_4PAD and the command number if the SPI and QPI numbers were different. You can refer to the Instruction Set Table for the QPI commands:

Omar_Anguiano_0-1674513923624.png

 

Best regards,
Omar

0 Kudos
Reply

1,260 Views
adi2Intel
Contributor III

I'm afraid I somehow broke the status register and now I cannot perform ERASE CHIP. it finish right after starting

 

any help?

0 Kudos
Reply