Hello Kerry Zhou,
I did as you said now I can read write status register correctly and the successful about reading jedec ID. Problem is still about reading a byte. I am erasing all datas via Chip Erase Command and then write a byte to an address (0x000065) (Data : 0xAD). and then I try reading this byte from same address via reding command. I see data is on MISO line but I still see 0xff on my screen. Screenshots are below.


I little bit changed the code as you see below.
///////////////////////////////////////////////////////
#define DUMMY_BYTE 0x00
#define READ 0x03
#define READ_FAST 0x0B
#define ERASE_4KB 0x20
#define ERASE_32KB 0x52
#define ERASE_64KB 0xD8
#define ERASE_CHIP 0x60
#define PROGRAM_BYTE 0x02
#define PROGRAM_AAI 0xAD
#define RDSR 0x05
#define EWRS 0x50
#define WRSR 0x01
#define WREN 0x06
#define WRDIS 0x04
#define RDID 0x90
#define R_JEDEC 0x9F
#define EBSY 0x70
#define DBSY 0x80
#define WRSR_NOT 0x9C
#define ENABLE_PROTECTION 0x1C
#define DISABLE_PROTECTION 0x00
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] = 0x0B41;
IOCON->PIO[3][24] = 0x0300;
gpio_pin_config_t pin_config = {kGPIO_DigitalOutput, 0};
GPIO_PortInit(GPIO, 3);
GPIO_PinInit(GPIO, 3, 24, &pin_config);
SPI_MasterGetDefaultConfig(&MasterConfig);
MasterConfig.sselNum = kSPI_Ssel0;
MasterConfig.sselPol = (spi_spol_t)kSPI_SpolActiveAllLow;
srcFreq = CLOCK_GetFreq(kCLOCK_Flexcomm2);
SPI_MasterInit(SPI2, &MasterConfig, srcFreq);
}
void WP_Set(void){GPIO_PinWrite(GPIO, 3, 24, 1);}
void WP_Clear(void){GPIO_PinWrite(GPIO, 3, 24, 0);}
void E_Flash_Protection_Enable(void){E_Flash_Write_Status_Register(WRSR_NOT);}
void E_Flash_Protection_Disable(void){E_Flash_Write_Status_Register(DISABLE_PROTECTION);}
void E_Flash_Write_Enable(void){
volatile uint16_t dummy;
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, WREN, kSPI_FrameAssert);}
{dummy = SPI_ReadData(SPI2);}
dummy = dummy;
}
void E_Flash_Write_Disable(void){
volatile uint16_t dummy;
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, WRDIS, kSPI_FrameAssert);}
{dummy = SPI_ReadData(SPI2);}
dummy = dummy;
}
void E_Flash_Enable_Write_Status_Register(void){
volatile uint16_t dummy;
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, EWRS, kSPI_FrameAssert);}
{dummy = SPI_ReadData(SPI2);}
dummy=dummy;
}
void E_Flash_Write_Status_Register(int16_t value){
E_Flash_Enable_Write_Status_Register();
WP_Set();
volatile uint16_t dummy;
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, WRSR, 0);}
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, value, kSPI_FrameAssert);}
{dummy = SPI_ReadData(SPI2);}
dummy=dummy;
WP_Clear();
}
int16_t E_Flash_Read_Status_Register(){
volatile int16_t pui32Data;
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, RDSR, 0);}
{pui32Data = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, DUMMY_BYTE,kSPI_FrameAssert);}
{pui32Data = SPI_ReadData(SPI2);}
return(pui32Data);
}
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);
}
void E_Flash_Write_Byte(uint32_t ui32Address, uint8_t data){
E_Flash_Protection_Disable();
E_Flash_Write_Enable();
volatile uint16_t dummy;
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, PROGRAM_BYTE, 0);}
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, ((ui32Address >> 16) & 0xff), 0);}
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, ((ui32Address >> 8) & 0xff), 0);}
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, (ui32Address & 0xff), 0);}
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, data, kSPI_FrameAssert);}
{dummy = SPI_ReadData(SPI2);}
dummy = dummy;
}
int16_t E_Flash_Read_Byte(uint32_t ui32Address){
int16_t dummy,dummy20;
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, READ, 0);}
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, ((ui32Address >> 16) & 0xff), 0);}
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, ((ui32Address >> 8) & 0xff), 0);}
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, (ui32Address & 0xff), 0);}
{dummy = SPI_ReadData(SPI2);}
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, DUMMY_BYTE, kSPI_FrameAssert);}
{dummy20 = SPI_ReadData(SPI2);}
return(dummy20);
}
void E_Flash_Chip_Erase(void){
E_Flash_Protection_Disable();
E_Flash_Write_Enable();
volatile int16_t dummy;
if (SPI_GetStatusFlags(SPI2) & kSPI_TxNotFullFlag)
{SPI_WriteData(SPI2, ERASE_CHIP, kSPI_FrameAssert);}
{dummy = SPI_ReadData(SPI2);}
dummy = dummy;
for(int i=0;i<750000;i++){__ASM("NOP");} // 50 ms waiting for erasing all chip according to datasheet.
}