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/LAUNCHXL-F28379D: SPI communication between two f28379D launchpads

Part Number: LAUNCHXL-F28379D

Tool/software: Code Composer Studio

Dear all,

Hello

I am a beginner in the CCS area and I need help with a project I am doing. The problem is that I am trying to send a particular value (Let's say ADC value) from one F28379d launchpad to the second one. My intention is to send value from the master to the slave.

I have gone through many examples (spi_loopback, spi_ex3_externalloopbak, etc) and different discussions in forums. But it only made me more confused.

Thus, I have started with "spi_loopback" example. I want to send value 1 (just as a constant example) from master to the slave.

For the master, I have the following code:

  sdata = 1;

for(;;)
{
// Transmit data
spi_xmit(sdata);
}

*****************************

void spi_init()
{
SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits
SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
SpiaRegs.SPIBRR.all =0x007F;
SpiaRegs.SPICCR.all =0x009F; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}

void spi_xmit(Uint16 a)
{
SpiaRegs.SPITXBUF=a;
}

void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x2044;
SpiaRegs.SPIFFCT.all=0x0;
}

GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0; // Enable pull-up on GPIO18 (SPICLKA)
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0; // Enable pull-up on GPIO19 (SPISTEA)

GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO16 (SPISIMOA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO17 (SPISOMIA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO18 (SPICLKA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO19 (SPISTEA)

GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA

GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA

And for the slave, I have the following code:

rdata = 0;

for(;;)
{

GPIO_WritePin(19, 1);

rdata = SpiaRegs.SPIRXBUF;

GPIO_WritePin(19, 0);

}

**********

void spi_init()
{
SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits
SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
SpiaRegs.SPIBRR.all =0x007F;
SpiaRegs.SPICCR.all =0x009F; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb
// xmission
}

void spi_fifo_init()
{

SpiaRegs.SPIFFRX.bit.RXFFIL = 0x00; // 4:0 Interrupt level
SpiaRegs.SPIFFRX.bit.RXFFIENA =0; // 5 Interrupt enable0
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1; // 6 Clear INT flag
SpiaRegs.SPIFFRX.bit.RXFFINT = 0; // 7 INT flag
SpiaRegs.SPIFFRX.bit.RXFFST = 0; // 12:8 FIFO status
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1; // 13 FIFO reset
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 0; // 14 Clear overflow
SpiaRegs.SPIFFRX.bit.RXFFOVF = 0; // 15 FIFO overflow
SpiaRegs.SPIFFCT.all=0x0;

}

// Set reset low before configuration changes
// Clock polarity (0 == rising, 1 == falling)
// 16-bit character
// Enable loop-back

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

// Enable master (0 == slave, 1 == master)
// Enable transmission (Talk)
// Clock phase (0 == normal, 1 == delayed)
// SPI interrupts are disabled

SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
SpiaRegs.SPICTL.bit.SPIINTENA = 0;

SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;

SpiaRegs.SPIPRI.bit.FREE = 1;

// Release the SPI from reset
SpiaRegs.SPICCR.bit.SPISWRESET = 1;

GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0; // Enable pull-up on GPIO18 (SPICLKA)
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0; // Enable pull-up on GPIO19 (SPISTEA)

GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO16 (SPISIMOA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO17 (SPISOMIA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO18 (SPICLKA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO19 (SPISTEA)

GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA

GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA

***********************

The problem is that, once I change the SPICTL.bit.MASTER_SLAVE from 0 to 1 (to work as a master), I can see that the evrything is fine (both micros as a master, seprately of course).

But, once the second micro operates in slave mode, it gets stuck on GPIO_WritePin(19, 1). 

I would really appreciate it if you help me out.

Best regards,

Mori

  • Mori,

    There some incorrect configuration on both SPI master and SPI slave code.I have summarized them which would be useful for making corrections in your code.

    Key changes to master mode code:

        - Disable Loop back mode. This mode is for testing purposes only which is useful for testing SPI in standalone mode (without another SPI slave).
            SpiaRegs.SPICCR.all =0x008F;

        - It looks like you don't seem to be using SPI FIFO. So, make sure to disable FIFO
            SpiaRegs.SPIFFTX.bit.SPIFFENA = 0;

        - Enable SPIINTENA to generate INT_FLAG bit on completion of SPI transmission
            SpiaRegs.SPICTL.bit.SPIINTENA = 1;
            
        - From your code, you have configured SPI as master transmitter mode correctly
            SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; //Master mode
            SpiaRegs.SPICTL.bit.TALK         = 1; //Trasnmit mode enabled
        
        - Change you infinite loop look as shown below
            for(;;)
            {
                // Transmit data
                spi_xmit(sdata);
                while(!SpiaRegs.SPISTS.INT_FLAG); //Wait till SPI complete transmission
            }

    Key changes to slave mode code:
        
        - Disable Loop back mode. This mode is for testing purposes only which is useful for testing SPI in standalone mode (without another SPI slave).
            SpiaRegs.SPICCR.all =0x008F;
        
        - Make sure to configure slave as slave receiver as shown below
            SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0; //Slave mode
            SpiaRegs.SPICTL.bit.TALK                   = 0; //Receiver mode enabled
            
        - It looks like you don't seem to be using SPI FIFO. So, make sure to disable FIFO
            SpiaRegs.SPIFFTX.bit.SPIFFENA         = 0; //Disable SPI FIFO
            SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0; //Hold SPI RX FIFO in reset

        - Enable SPIINTENA to generate INT_FLAG bit on completion of SPI transmission
            SpiaRegs.SPICTL.bit.SPIINTENA = 1;
            
        - I don't understand the role of GPIO19 from your SPI slave example code.
        
        - Wait for INT_FLAG to indicate SPI has received information
        
            while(!SpiaRegs.SPISTS.INT_FLAG);
            rdata = SpiaRegs.SPIRXBUF;

    Regards,

    Manoj

  • Dear Manoj,

    Thank you so much for your help. I have gone through your comments.

    It seems that still there is a problem in my code. Unfortunately, I cannot understand whether it is from the master side or the slave side.

    ************************************************************

    Master:

       sdata = 1;
       for(;;)
       {    
         // Transmit data
         spi_xmit(sdata);
         while(!SpiaRegs.SPISTS.bit.INT_FLAG); //Wait till SPI complete transmission
       }


    void error(void)
    {
        asm("     ESTOP0");                        // Test failed!! Stop!
        for (;;);
    }

    void spi_init()
    {    

        SpiaRegs.SPIBRR.all =0x007F;
        SpiaRegs.SPIPRI.bit.FREE = 1;                // Set so breakpoints don't disturb xmission

            // Set reset low before configuration changes
            // Clock polarity (0 == rising, 1 == falling)
            // 16-bit character
            // Enable loop-back
            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 = 1; //Enable SPIINTENA to generate INT_FLAG bit on completion of SPI transmission

    }

    void spi_xmit(Uint16 a)
    {
        SpiaRegs.SPITXBUF=a;
    }

    void spi_fifo_init()                                        
    {

        SpiaRegs.SPIFFTX.bit.SPIFFENA = 0;
    }  

    Slave:

     for(;;)
       {

            while(!SpiaRegs.SPISTS.bit.INT_FLAG);
           rdata = SpiaRegs.SPIRXBUF;
       }

    void spi_init()
    {

            SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;
            SpiaRegs.SPICTL.bit.TALK = 0; //Receiver mode enabled
            SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
            SpiaRegs.SPICTL.bit.SPIINTENA = 1;

            // Set reset low before configuration changes
            // Clock polarity (0 == rising, 1 == falling)
            // 16-bit character
            // Enable loop-back
            SpiaRegs.SPICCR.bit.SPISWRESET = 0;
            SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
            SpiaRegs.SPICCR.bit.SPICHAR = (16-1);
            SpiaRegs.SPICCR.bit.SPILBK = 0;

            SpiaRegs.SPIBRR.all =0x007F;
            SpiaRegs.SPIPRI.bit.FREE = 1;    // Set so breakpoints don't disturb

    }

    //
    // spi_fifo_init - Initialize SPI FIFO registers
    //
    void spi_fifo_init()
    {
    //    SpiaRegs.SPIFFTX.all = 0xE040;
    //    SpiaRegs.SPIFFRX.all = 0x2044;
    //    SpiaRegs.SPIFFCT.all = 0x0;
        SpiaRegs.SPIFFRX.bit.RXFFIL = 0x00;                      // 4:0    Interrupt level
        SpiaRegs.SPIFFRX.bit.RXFFIENA =0;                        // 5      Interrupt enable0
        SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 0;                     // 6      Clear INT flag
        SpiaRegs.SPIFFRX.bit.RXFFINT = 0;                        // 7      INT flag
        SpiaRegs.SPIFFRX.bit.RXFFST = 0;                         // 12:8   FIFO status
        SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0;                    // 13     FIFO reset
        SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 0;                     // 14     Clear overflow
        SpiaRegs.SPIFFRX.bit.RXFFOVF = 0;                        // 15     FIFO overflow

        SpiaRegs.SPIFFCT.all=0x0;

    }

    **********************************************

    It seems to me that the program get stuck on "while(!SpiaRegs.SPISTS.bit.INT_FLAG)".

    Would you please tell me where is the problem?

    Best regards,

    Mori

  • Mori,

    It looks like you have forgotten to set  SpiaRegs.SPICCR.bit.SPISWRESET = 1. Unless you set SPISWRESET =1, SPI neither transmit (or) receive. This problem is there in both transmitter and receiver side.

    I would encourage to probe oscilloscope signals to see whether SPI is transmitting.

    Regards,

    Manoj

  • Thank you Monaj. It works now!!!