This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS/TMS320F28377S: SPI with FLASH MEMORY PROBELM

Part Number: TMS320F28377S

Tool/software: Code Composer Studio

Hi 

I used TMS320F28377S with external flash memory SST26VF064B-104V/SM and I have a problem with ID read.

The reading procedure looks as follows:
- Master transmit 0x9F to start Read ID
-Master transmit dummy bytes
- Salve transmit three ID bytes
- Master read ID bytes.

I have a question what the reading procedure should look like ?
Where I sholud write 0x9F and dummy bytes ? To SPITxBUF or SPIDAT ?
I attach my code but it doesn't work.
In SPITXBUF, SPIRXBUF and SPIDAT I always have 0xFFFF.

Thank you for help

Best regards
Szymon
#include "F28x_Project.h"

void delay1_loop(void);
void spi_xmit(Uint16 a);
void spi_fifo_init(void);
void InitMySpi(void);
void InitSpiGpioMy();




Uint16 Flash_SpiTransmit(Uint16 Data)
{
    Uint16 i = 0;
    for (i = 0; i < 2; ++i)

    asm ("          NOP");

    SpiaRegs.SPITXBUF = Data;

    for (i = 0; i < 2; ++i)
        asm ("          NOP");

    return (Uint16) SpiaRegs.SPITXBUF;
}

Uint16 Flash_SpiReceive(Uint16 DataToTransmit)
{
    Uint16 i = 0;

    for (i = 0; i < 2; ++i)
        asm ("          NOP");

    SpiaRegs.SPIDAT = DataToTransmit;

    for (i = 0; i < 2; ++i)
        asm ("          NOP");

    return (Uint16)SpiaRegs.SPITXBUF;
}

Uint16 tab[3];
Uint16 statusRegister;
Uint16 configRegister;
Uint16 tabConfig[2];
Uint16 dataSend[256];
Uint16 dataReceive[256];

void FlashReadJedec(void)
{
    Uint16 i = 0;
    EALLOW;

    GpioDataRegs.GPACLEAR.bit.GPIO12 = 1; //CS na 0
    EDIS;
    asm ("          NOP");
    for (i = 0; i < 100; ++i)
    asm ("          NOP");
    Flash_SpiTransmit(0x9F); //command read jedec

    while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }
    Flash_SpiReceive(0x00);
    tab[0] = SpiaRegs.SPIRXBUF;
    tab[1] = SpiaRegs.SPIRXBUF;
    tab[2] = SpiaRegs.SPIRXBUF;
    
    for (i = 0; i < 100; ++i)
    asm ("          NOP");
    EALLOW;
    GpioDataRegs.GPASET.bit.GPIO12 = 1; //CS na 1
    EDIS;
}

void main(void)
{
   InitSysCtrl();
   DINT;
   InitPieCtrl();

   IER = 0x0000;
   IFR = 0x0000;

   InitPieVectTable();

//   InitSpiaGpio();
   InitSpiGpioMy();
   InitMySpi();
   spi_fifo_init();

   while(1)
   {

       FlashReadJedec();
       Uint16 a = tab[0];
       Uint16 b = tab[1];
       Uint16 c = tab[2];

   }
}


void spi_fifo_init()
{
    SpiaRegs.SPIFFTX.all = 0xE040;
    SpiaRegs.SPIFFRX.all = 0x2044;
    SpiaRegs.SPIFFCT.all = 0x0;
}

void InitMySpi(void)
{
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
    SpiaRegs.SPICCR.bit.SPICHAR = (16-1);
    SpiaRegs.SPICCR.bit.SPILBK = 0;

    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
    SpiaRegs.SPICTL.bit.TALK = 1;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
    SpiaRegs.SPICTL.bit.SPIINTENA = 0;
    // Set the baud rate
    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 99;
    SpiaRegs.SPIPRI.bit.FREE = 1;
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;


}

void InitSpiGpioMy()
{
   EALLOW;


    GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;  //  (SPISIMOA)
    GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;  //  (SPISOMIA)
    GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;  //  (SPICLKA)

    GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; //  (SPISIMOA)
    GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; //  (SPISOMIA)
    GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; //  (SPICLKA)

    GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; // SPISIMOA
    GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; //  SPISOMIA
    GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; // SPICLKA

    GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3; // SPISIMOA
    GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3; // SPISOMIA
    GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3; //  SPICLKA

    GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO12 = 1;   // CS
    GpioDataRegs.GPASET.bit.GPIO12 = 1;

    GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;   // WP
    GpioDataRegs.GPASET.bit.GPIO13 = 1;

    GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO14 = 1;   // Hold
    GpioDataRegs.GPASET.bit.GPIO14 = 1;

    EDIS;
}

 

  • On the oscilloscope I can see frame on MOSI, CLK signal and Chip select signal but on MISO I see high condition
  • I would still do the dummy writes to SPITXBUF. You'll need to send one for every byte you want to receive which is three, right? I only see one after you send the 0x9F command.

    Also, is the memory device expecting 8-bit bytes? It looks like you have your character length set to 16 bits. If you do need to switch it to 8 bits, make sure you also add shift your data so it's left justified in the SPITXBUF register.

    Whitney
  • Hi


    I added your suggestions to the code but I still have the same problem. In the SPIRXBUF register I have the value 0x00FF all the time and on the MISO pin high?

    Do you have any idea why it does not work?

    I attach the corrected program code and images of the waveforms from the oscilloscope

    Thank you for help

    Best regards

    Szymon 

    #include "F28x_Project.h"
    
    void delay1_loop(void);
    void spi_xmit(Uint16 a);
    void spi_fifo_init(void);
    void InitMySpi(void);
    void InitSpiGpioMy();
    
    
    
    
    Uint16 Flash_SpiTransmit(Uint16 Data)
    {
        Uint16 i = 0;
        for (i = 0; i < 2; ++i)
    
        asm ("          NOP");
    
        SpiaRegs.SPITXBUF = Data<<8;
    
        for (i = 0; i < 2; ++i)
            asm ("          NOP");
    
    //    return (Uint16) SpiaRegs.SPITXBUF;
    }
    
    
    
    Uint16 tab[4];
    
    
    void FlashReadJedec(void)
    {
        Uint16 i = 0;
        EALLOW;
        GpioDataRegs.GPACLEAR.bit.GPIO19 = 1;
        EDIS;
        asm ("          NOP");
        for (i = 0; i < 5; ++i)
        asm ("          NOP");
       Flash_SpiTransmit(0x9F); //command read jedec
       while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }
        tab[0] = SpiaRegs.SPIRXBUF>>8;
        Flash_SpiTransmit(0x00);
        while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }
        tab[1] = SpiaRegs.SPIRXBUF>>8;
        Flash_SpiTransmit(0x00);
        while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }
       tab[2] = SpiaRegs.SPIRXBUF>>8;
        Flash_SpiTransmit(0x00);
        while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }
        tab[3] = SpiaRegs.SPIRXBUF>>8;
    
       for (i = 0; i < 5; ++i)
        asm ("          NOP");
        EALLOW;
        GpioDataRegs.GPASET.bit.GPIO19 = 1;
        EDIS;
    }
    
    void main(void)
    {
       InitSysCtrl();
       DINT;
       InitPieCtrl();
    
       IER = 0x0000;
       IFR = 0x0000;
    
       InitPieVectTable();
    
    //   InitSpiaGpio();
       InitSpiGpioMy();
       InitMySpi();
       spi_fifo_init();
    
       while(1)
       {
    
           FlashReadJedec();
           Uint16 a = tab[0];
           Uint16 b = tab[1];
           Uint16 c = tab[2];
    
       }
    }
    
    
    void spi_fifo_init()
    {
        SpiaRegs.SPIFFTX.all = 0xE040;
        SpiaRegs.SPIFFRX.all = 0x2044;
        SpiaRegs.SPIFFCT.all = 0x0;
    }
    
    void InitMySpi(void)
    {
        SpiaRegs.SPICCR.bit.SPISWRESET = 0;
        SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
        SpiaRegs.SPICCR.bit.SPICHAR = (7);
        SpiaRegs.SPICCR.bit.SPILBK = 0;
    
        SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
        SpiaRegs.SPICTL.bit.TALK = 1;
        SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
        SpiaRegs.SPICTL.bit.SPIINTENA = 0;
        // Set the baud rate
        SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 99;
        SpiaRegs.SPIPRI.bit.FREE = 1;
        SpiaRegs.SPICCR.bit.SPISWRESET = 1;
    
    
    }
    
    void InitSpiGpioMy()
    {
       EALLOW;
    
    
        GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;  //  (SPISIMOA)
        GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;  //  (SPISOMIA)
        GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;  //  (SPICLKA)
    
        GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // (SPISIMOA)
        GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; //  (SPISOMIA)
        GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; //  (SPICLKA)
    
        GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; //  SPISIMOA
        GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; //  SPISOMIA
        GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; //  SPICLKA
    
        GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3; //  SPISIMOA
        GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3; // SPISOMIA
        GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3; //  SPICLKA
    
        GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;
        GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;   // CS
        GpioDataRegs.GPASET.bit.GPIO19 = 1;
    
        GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;
        GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;   // WP
        GpioDataRegs.GPASET.bit.GPIO13 = 1;
    
        GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;
        GpioCtrlRegs.GPADIR.bit.GPIO14 = 1;   // Hold
        GpioDataRegs.GPASET.bit.GPIO14 = 1;
    
    
    
    
    
        EDIS;
    }





  • Hi,

    I found the cause of the problem.
    I had to set: SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;

    Thank you for help
    Best regards
    Szymon