LPC54608 SST25VF016B SPI Flash Issue

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

LPC54608 SST25VF016B SPI Flash Issue

ソリューションへジャンプ
8,628件の閲覧回数
fatihozen
Contributor IV

Hello,

I have my own custom board and want to use sst25vf016b flash for bootloader. I have some problem about reading and writing. Actually reading.  I checked polarity and phase. In SPI_MasterGetDefaultConfig() function they arranged as spi mode 0 . sst25vf016b supports mode 0 and 3, so I didn't change it.

void vInitializeSpiFlash(void){

uint32_t srcFreq = 0;
spi_master_config_t MasterConfig = {0};

CLOCK_AttachClk(kFRO12M_to_FLEXCOMM2);
RESET_PeripheralReset(kFC2_RST_SHIFT_RSTn);

IOCON->PIO[4][19] = 0x0303;
IOCON->PIO[4][20] = 0x0303;
IOCON->PIO[4][21] = 0x0303;
IOCON->PIO[3][23] = 0x0B01;

IOCON->PIO[3][24] = 0x0300;
SPI_MasterGetDefaultConfig(&MasterConfig);
MasterConfig.sselNum = kSPI_Ssel0;
MasterConfig.sselPol = (spi_spol_t)kSPI_SpolActiveAllLow;
srcFreq = CLOCK_GetFreq(kCLOCK_Flexcomm2);
SPI_MasterInit(SPI2, &MasterConfig, srcFreq);
}

Reading jedec id issue:

///////////////////////////////

uint32_t E_Flash_Read_JedecID(){
volatile uint8_t a,b,c;
volatile uint32_t d;

SPI_WriteData(SPI2, 0x9F, 0);
a = SPI_ReadData(SPI2);
SPI_WriteData(SPI2, DUMMY_BYTE, 0);
a = SPI_ReadData(SPI2);
SPI_WriteData(SPI2, DUMMY_BYTE, 0);
b = SPI_ReadData(SPI2);
SPI_WriteData(SPI2, DUMMY_BYTE, kSPI_FrameAssert);
c = SPI_ReadData(SPI2);
d = (a<<16) | (b<<8) | (c) ;
return(d);
}

When I use this function to read jedec id I see 41ffbf.

///////////////////

uint32_t E_Flash_Read_JedecID(){
volatile uint8_t a,b,c;
volatile uint32_t d;

SPI_WriteData(SPI2, 0x9F, 0);

SPI_WriteData(SPI2, DUMMY_BYTE, 0);
a = SPI_ReadData(SPI2);
SPI_WriteData(SPI2, DUMMY_BYTE, 0);
a = SPI_ReadData(SPI2);
SPI_WriteData(SPI2, DUMMY_BYTE, 0);
b = SPI_ReadData(SPI2);
SPI_WriteData(SPI2, DUMMY_BYTE, kSPI_FrameAssert);
c = SPI_ReadData(SPI2);
d = (a<<16) | (b<<8) | (c) ;
return(d);
}

If I use this I see an expected data : bf2541. I just sent dummy data to flash after sending command data.
Anyway, When I want to read status register of flash I use this function. And I see "1c" as expected.

///////////////////////
int16_t E_Flash_Read_Status_Register(){
volatile int16_t pui32Data, dummy;
SPI_WriteData(SPI2, RDSR, 0);
dummy = SPI_ReadData(SPI2);
SPI_WriteData(SPI2, DUMMY_BYTE,kSPI_FrameAssert);
pui32Data = SPI_ReadData(SPI2);
return(pui32Data);
dummy = dummy;
}

 ///////////
When it comes to read both or calling two or more functions, I see meanless datas.

E_Flash_Read_JedecID();
n = E_Flash_Read_Status_Register();

Eg: When I call these 2 functions I expect to see status register "1c". But I see "41". The last data of jedec id.
Why  that happens ?

ラベル(1)
タグ(2)
1 解決策
7,842件の閲覧回数
kerryzhou
NXP TechSupport
NXP TechSupport

Hi Fatih ozen,

   After I modify your API, now it can get the correct data, please check my attached result:

int32_t E_Flash_Read_Byte_kerry(uint32_t ui32Address){
     int16_t dummy,dummy20, Testbuff[8];
     uint8_t i=0;
     uint32_t dummyTest=0;
     for(i=0;i<8;i++)
     {
          Testbuff[i]=0;
     }

     //CE_Clear();
     i=0;
     SPI9->FIFOCFG |= SPI_FIFOCFG_EMPTYTX_MASK | SPI_FIFOCFG_EMPTYRX_MASK;

     while(SPI_GetStatusFlags(SPI9) & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
     {
          dummyTest = SPI_ReadData(SPI9);//Put breakpoint here, if it really won't enter, this while code can be delete.
     }
     SPI9->FIFOSTAT |= SPI_FIFOSTAT_TXERR_MASK | SPI_FIFOSTAT_RXERR_MASK;


     if (SPI_GetStatusFlags(SPI9) & kSPI_TxNotFullFlag)
     { SPI_WriteData(SPI9, 0x0B, 0);}
     while(!(SPI_GetStatusFlags(SPI9) & SPI_FIFOSTAT_RXNOTEMPTY_MASK));
     Testbuff[i++] = (SPI9->FIFORD);

     if (SPI_GetStatusFlags(SPI9) & kSPI_TxNotFullFlag)
     {SPI_WriteData(SPI9, 0x00, 0);}
     while(!(SPI_GetStatusFlags(SPI9) & SPI_FIFOSTAT_RXNOTEMPTY_MASK));
     Testbuff[i++] = (SPI9->FIFORD);

     if (SPI_GetStatusFlags(SPI9) & kSPI_TxNotFullFlag)
     {SPI_WriteData(SPI9, 0x00, 0);}
     while(!(SPI_GetStatusFlags(SPI9) & SPI_FIFOSTAT_RXNOTEMPTY_MASK));
     Testbuff[i++] = (SPI9->FIFORD);

     if (SPI_GetStatusFlags(SPI9) & kSPI_TxNotFullFlag)
     {SPI_WriteData(SPI9, 0x91, 0);}
     while(!(SPI_GetStatusFlags(SPI9) & SPI_FIFOSTAT_RXNOTEMPTY_MASK));
     Testbuff[i++] = (SPI9->FIFORD);

     if (SPI_GetStatusFlags(SPI9) & kSPI_TxNotFullFlag)
     {SPI_WriteData(SPI9, 0x00, 0);}
     while(!(SPI_GetStatusFlags(SPI9) & SPI_FIFOSTAT_RXNOTEMPTY_MASK));
     Testbuff[i++] = (SPI9->FIFORD);

     if (SPI_GetStatusFlags(SPI9) & kSPI_TxNotFullFlag)
     {SPI_WriteData(SPI9, 0x00, kSPI_FrameAssert);}
     while(!(SPI_GetStatusFlags(SPI9) & SPI_FIFOSTAT_RXNOTEMPTY_MASK));
     Testbuff[i++] = (SPI9->FIFORD);

     while (!(SPI9->FIFOSTAT & SPI_FIFOSTAT_TXEMPTY_MASK)){};




}‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

pastedImage_1.png

Just use while to wait the received status finished.

Your problem is caused by the received data is not received with if, but use while to wait, it will be enough time to get the received data.

Please try my new function again with your external flash


Have a great day,
Kerry

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

元の投稿で解決策を見る

0 件の賞賛
返信
26 返答(返信)
1,391件の閲覧回数
fatihozen
Contributor IV

Hi kerryzhou,

It took some time because of cleaning unuseful datas for you, you can find the project and circuit in attachment.
Im using MCUXpresso. ( MCUXpresso IDE v10.1.1 [Build 606] [2018-01-02] ).

0 件の賞賛
返信
1,387件の閲覧回数
kerryzhou
NXP TechSupport
NXP TechSupport

Good, after I get the chip these days, I will test it, then give you feedback!

Please give me more time!


Have a great day,
Kerry

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

1,382件の閲覧回数
fatihozen
Contributor IV

I found half of problem. The data comes earlier than I expect. Still not working properly.
When I read byte function below works:

int8_t E_Flash_Read_Byte(uint32_t ui32Address){

while(!(SPI2->FIFOSTAT & SPI_FIFOSTAT_TXEMPTY_MASK)){}
int8_t dummy,dummy2;

if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, READ, 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, ((ui32Address >> 16) & 0xff), 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, ((ui32Address >> 8) & 0xff), 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, (ui32Address & 0xff), 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, DUMMY_BYTE, kSPI_FrameAssert);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
return((dummy));
}

 
when it comes to read word, it is getting stranger. I have to read data after lsb of address at first not after first dummy data.

Normally it should be like this : dummy3 = ((dummy2<<8) & 0xFF00)|(dummy3 & 0x00FF);

But here it is like :                     dummy3 = ((dummy<<8) & 0xFF00)|(dummy2 & 0x00FF);
Datas on logic analyzer still the same as previous pictures.

while(!(SPI2->FIFOSTAT & SPI_FIFOSTAT_TXEMPTY_MASK)){}
int16_t dummy,dummy2,dummy3;

if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, READ, 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, ((ui32Address >> 16) & 0xff), 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, ((ui32Address >> 8) & 0xff), 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, (ui32Address & 0xff), 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
Delay_Spi2;

if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, DUMMY_BYTE, 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy2 = SPI_ReadData(SPI2);}

if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, DUMMY_BYTE, kSPI_FrameAssert);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy3 = SPI_ReadData(SPI2);}

dummy3 = ((dummy<<8) & 0xFF00)|(dummy2 & 0x00FF);
return(dummy3);

0 件の賞賛
返信
1,382件の閲覧回数
kerryzhou
NXP TechSupport
NXP TechSupport

Hi Fatih ozen,

    My demo board is LPC54608J512, it is 180 pin, so I can't use your code directly, so I use the SPI9 instead of your SPI2.

   My pin is:

   SPI_CS  :  P3_30, J9_15 on LPCXpresso 54608

   SPI_MISO:P3_22, J9_11 on LPCXpresso 54608

  SPI_MOSI:P3_21, J9_13 on LPCXpresso 54608 

   SPI_CLK:P3_20,  J9_9  on LPCXpresso 54608 

  My SST25VF016B MISO can't output the data, maybe my SST25 board have the problem, because I don't have the according board for SST25, I just sold it in my another board, mybe that board still have problem to this external chip.

  So, I test your FastRead_91.JPG on my LPC54608 directly, two lpc54608, one is master, used to send the 91 data(0X0B, 0X00, 0X00,0X91,0X00,0X00), another board used as the slave, send out:0XFF,0XFF,0XFF,0XFF,0XFF,0XAA

pastedImage_270.jpg

This is my test result:

pastedImage_271.png

This is the debug result with SDK code in master:

pastedImage_272.png

So, you can find, when master send out 0X0B, 0X00, 0X00,0X91,0X00,0X00, it can get the correct data:

0XFF,0XFF,0XFF,0XFF,0XFF,0XAA

If you have time, could you use this code to test the read data:

    srcBuff[0]=0x0b;
    srcBuff[1]=0x00;
    srcBuff[2]=0x00;
    srcBuff[3]=0x91;
    srcBuff[4]=0x00;
    srcBuff[5]=0x00;

    /*Start Transfer*/
    xfer.txData = srcBuff;
    xfer.rxData = destBuff;
    xfer.dataSize = 6;//sizeof(destBuff);
    SPI_MasterTransferBlocking(EXAMPLE_SPI_MASTER, &xfer);

I test it based on spi_polling_b2b transfter project.

At least, when the SPI bus wave is correct, the SDK code can get the correct MISO data.


Have a great day,
Kerry

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 件の賞賛
返信
1,382件の閲覧回数
fatihozen
Contributor IV

I am confused about RXIGNORE bit. In UM10912 in SPI Chapter at Basic Configuration step, there is written 

– Set the RXIGNORE bit to only transmit data and not read the incoming data. Otherwise, the transmit halts when the FIFORD buffer is full.

Maybe problem is there ? I am not sure. But if I set this bit in every write sequence, I see all zeros. And I tried to write word. normal speed READ function worked there.

-----------------------------------------------------------------

E_Flash_Write_Byte(0x000491,0xa1);

Delay_Spi;
E_Flash_Write_Byte(0x000492,0xb2);

Delay_Spi;

E_Flash_Write_Word(0x000493,0xc3d4);

Delay_Spi;

E_Flash_Write_Word(0x000494,0xe5a6);

stat1=E_Flash_Read_Fast_Byte(0x000491);

Delay_Spi;

stat2=E_Flash_Read_Fast_Byte(0x000492);

Delay_Spi;

stat3=E_Flash_Read_Word(0x000493);

Delay_Spi;

stat4=E_Flash_Read_Word(0x000494);


I see the result as : 0xff 0xa1 0xb2 0xc3c4

-------------------------------------

void E_Flash_Write_Word(uint32_t ui32Address, uint16_t data){
E_Flash_Write_Byte(ui32Address, (data>>8)&0x00FF);
Delay_Spi;
E_Flash_Write_Byte( (ui32Address+1), data&0x00FF);
Delay_Spi;
}

int16_t E_Flash_Read_Word(uint32_t ui32Address){
while(!(SPI2->FIFOSTAT & SPI_FIFOSTAT_TXEMPTY_MASK)){}
int16_t dummy,dummy2,dummy3;
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, READ, 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, ((ui32Address >> 16) & 0xff), 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, ((ui32Address >> 8) & 0xff), 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, (ui32Address & 0xff), 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, DUMMY_BYTE, 0);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy2 = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, DUMMY_BYTE, kSPI_FrameAssert);}
if (SPI2->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK)
{dummy3 = SPI_ReadData(SPI2);}
dummy = (dummy2<<8) | (dummy3);
return(dummy);
}

0 件の賞賛
返信
1,391件の閲覧回数
fatihozen
Contributor IV

Sorry, I am too late,

I could not see any data at first and then I deleted 14-17 lines.

I checked fifostat at line 21 and its value is 0x30.

at line 62  TestBuff[5] is 0,
TestBuff[6] was 0xff.  and fifostat at line 62 is 0x32. sometimes 0x30 but mostly 0x32.
And it looks correct on the bus.

0 件の賞賛
返信