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: Data doesn't receive from SPI

Part Number: LAUNCHXL-F28379D
Other Parts Discussed in Thread: C2000WARE

Tool/software: Code Composer Studio

Hi all,

I write a code that transmit Data from SPI_A to SPI_B. I configure SPI_A in master mode and SPI_B in slave mode. When SPI_A transmission is complete the INT_FLAG in SPI_A set and interrupt occurred but in SPI_B data doesn't receive and INT_FLAG not set to 1, so the interrupt doesn't occurred. I configure SPI_A and SPI_B in non-FIFO mode.

How to fix this problem ?

Thank you for helping.

/**
 * main.c
 */

#include "F28x_Project.h"

void spia_config_transmitter (void);
void spia_config_gpio (void);
void spib_config_receiver (void);
void spib_config_gpio (void);

__interrupt void isr_spia_transmitter(void);
__interrupt void isr_spib_receiver(void);

int rdata[1000];
int data;

int main(void)
{
    int k=0;
    InitSysCtrl();
    DINT;
    IER = 0x0000;
    IFR = 0x0000;
    InitPieCtrl();
    InitPieVectTable();

    EALLOW;
    PieVectTable.SPIA_RX_INT = &isr_spia_transmitter;
    PieVectTable.SPIB_RX_INT = &isr_spib_receiver;
    EDIS;
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
    PieCtrlRegs.PIEIER6.bit.INTx1 = 1;
    PieCtrlRegs.PIEIER6.bit.INTx3 = 1;
    IER = M_INT6;
    EINT;


    spib_config_receiver();
    spia_config_transmitter();

    SpiaRegs.SPITXBUF = 0xaa;
    for(;;);

}


void spia_config_transmitter (void)
{
    SpiaRegs.SPICCR.bit.SPISWRESET = 0; // reset SPI for change configuration
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; // setup SPI in master mode
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0; // transmits data in rising edge and receive data in falling edge of SPICLK
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0; // for SPIBRR = 0,1,2 ---> Baud Rate = LSPCLK/4
                                          // for SPIBRR = 3 to 127 ---> Baud Rate = LSPCLK/(SPIBRR+1)
    SpiaRegs.SPICCR.bit.SPICHAR = 15;// SPICHAR = Word length - 1
    SpiaRegs.SPIFFTX.bit.SPIFFENA = 0; // disable FIFO
    SpiaRegs.SPICTL.bit.TALK = 1;
    SpiaRegs.SPICTL.bit.SPIINTENA = 1;
    SpiaRegs.SPICCR.bit.SPISWRESET = 1; // saving changing of configuration

    spia_config_gpio();
}

void spia_config_gpio (void)
{
    EALLOW;
    //GpioDataRegs.GPACLEAR.bit.GPIO19 = 1;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 0;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 0;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 0;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 0;

    //GpioCtrlRegs.GPAGMUX2.bit.GPIO16 = 0;
    //GpioCtrlRegs.GPAGMUX2.bit.GPIO17 = 0;
    //GpioCtrlRegs.GPAGMUX2.bit.GPIO18 = 0;
    //GpioCtrlRegs.GPAGMUX2.bit.GPIO19 = 0;

    GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 1;
    GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 1;
    GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 1;
    GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 1;

    //GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1;
    //GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;
    //GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;
    //GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;

    //GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;

    GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;

    //GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3;
    //GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;
    //GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;
    //GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;

    GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
    GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
    GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
    GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;

    //GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;
    //GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;
    //GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;
    //GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;

    //GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;
    EDIS;
}

void spib_config_receiver (void)
{
    SpibRegs.SPICCR.bit.SPISWRESET = 0; // reset SPI for change configuration
    SpibRegs.SPICTL.bit.MASTER_SLAVE = 0; // setup SPI in slave mode
    SpibRegs.SPICTL.bit.CLK_PHASE = 0; // transmits data in rising edge and receive data in falling edge of SPICLK
    SpibRegs.SPICCR.bit.CLKPOLARITY = 0;
    SpibRegs.SPIBRR.bit.SPI_BIT_RATE = 0; // for SPIBRR = 0,1,2 ---> Baud Rate = LSPCLK/4
                                          // for SPIBRR = 3 to 127 ---> Baud Rate = LSPCLK/(SPIBRR+1)
    SpibRegs.SPICCR.bit.SPICHAR = 15;// SPICHAR = Word length - 1
    SpibRegs.SPIFFTX.bit.SPIFFENA = 0; // disable FIFO
    SpibRegs.SPICTL.bit.TALK = 1;
    SpiaRegs.SPIPRI.bit.STEINV = 0;
    SpibRegs.SPICTL.bit.SPIINTENA = 1;
    SpibRegs.SPICTL.bit.OVERRUNINTENA = 1;
    SpibRegs.SPICCR.bit.SPISWRESET = 1; // saving changing of configuration

    spib_config_gpio();
}

void spib_config_gpio (void)
{
    EALLOW;
    GpioCtrlRegs.GPAGMUX2.bit.GPIO24 = 0;
    GpioCtrlRegs.GPAGMUX2.bit.GPIO25 = 0;
    GpioCtrlRegs.GPAGMUX2.bit.GPIO26 = 0;
    GpioCtrlRegs.GPAGMUX2.bit.GPIO27 = 0;

    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 1;
    //GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0;

    GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3;

    GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0;
    EDIS;
}

__interrupt void isr_spia_transmitter(void)
{
    static int i=0;
    int dummy_data = 0;
    //asm(" ESTOP0");
    SpiaRegs.SPITXBUF = i++;
    dummy_data = SpiaRegs.SPIRXBUF;
    if (i == 1000)
    {
        asm(" ESTOP0");
    }
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP6;

}
__interrupt void isr_spib_receiver(void)
{
    asm(" ESTOP0");
    static int j;
    rdata[j++] = SpibRegs.SPIRXBUF;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP6;

}

  • Hi,

    Can you let us know the hardware connections you have made? Are you observing the data coming out of the SPIA pins(the CLK, STE, SIMO/SOMI)?

    Also, taking a quick look at your code, the transmitter isr 'isr_spia_transmitter' is mapped to the SPIA_RX_INT PIEVECT interrupt. Is it a typo or is that what you had intended?

    Regards,
    Praveen

  • Thank you for answer,

    I connect the SPISIMOA(GPIO58) to SPISIMOB(GPIO24), SPISOMIA(GPIO59) to SPISOMIB(GPIO25), SPICLKA(GPIO60) to SPICLKB(GPIO26) and SPISTEA(GPIO61) to SPISTEB(GPIO27).

    when I enable loopback mode in SPIA the RX buffer is correct so the signal comes out from master (SPI_A).

    Because I use the SPI in non-FIFO mode the Rx and Tx interrupt vectors in PIE block connected together  .( I attached the Datasheet )

    Do you have any code that setup SPI in slave mode and non-FIFIO mode ?

    I have a question, How to mentions other user for helping to answer questions ?

    Thank you.

  • Hi,

    Have you observed that the SPIA STE, CLK,  and SIMO are toggling as expected using a scope at GPIO60, GPIO61 and GPIO58? The pinmux settings doesnt seem correct.

    For example, SPIA which is muxed at GPIO60 requires the GPBGMUX2.bit.GPIO60 and GPBMUX2.bit.GPIO60 to be programmed with 3 for selecting the mux option 15(0xF)

    There are c2000ware driverlib examples for SPI slave mode. The example "spi_ex3_external_loopback_fifo_interrupts" uses SPIA as slave and SPIB as master. You can use that test as reference for and pinmux slave settings.

    Regards,
    Praveen

  • Very thank you,

    I mistake in configure pinmux for SPI_A and SPI_B.

    Now I want use GPIO16,17,18,19 for SPI_A but GPIO17 not available  on pin header on the LAUNCHXL_F28379D.(may be I dont know ) . Do you know where is the GPIO17 for connecting to GPIO25(SPISOMIB) ?

    Best for you.

  • Hi,

    GPIO17 is not chosen for SPI functionality in the launchpad. Please use the pins coming out at J1/J2/J6 header.

    Regards,
    Praveen

    If this reply answers your query, please click on "This resolved my issue" below