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.

TMS320F28027: Problem with Configuring SPI

Part Number: TMS320F28027


Hey, I am trying to configure SPI in non FIFO mode for Picolo f28027 but it seems that interrupt is never raised, I configured in slave mode and my master is an arduino mega with continuously sending data in a loop. I tried to configure interrupt as well.

Here's the code

#include "DSP28x_Project.h"

interrupt void spi_rcs_isr();

void main()
{
    InitSysCtrl();

    /*Interrupt config*/

    DINT;
    InitPieCtrl();

    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

    EALLOW;

    PieVectTable.SPIRXINTA = &spi_rcs_isr;

    PieCtrlRegs.PIECTRL.bit.ENPIE =1;
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // for spircs
    PieCtrlRegs.PIECTRL.bit.PIEVECT= 0x0D90;
    IER |=  M_INT6; // cpu interrupt 6 for spirx
    EINT;
    ERTM;

    /* GPIO pull up enable*/

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

    /*Qualification Select*/

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

    /*Setting up GPIO pins in SPI mode*/

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

    /* SPI config */
    SpiaRegs.SPICCR.bit.SPISWRESET = 0; //  reset
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0; //  slave mode
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; // data out on rising and in on falling
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0; // no delay
    //SpiaRegs.SPIBRR = 127; // lowest baud rate
    SpiaRegs.SPICCR.bit.SPICHAR = 7; // 8 bit word
    SpiaRegs.SPISTS.bit.OVERRUN_FLAG = 0;
    SpiaRegs.SPISTS.bit.INT_FLAG = 0;
    SpiaRegs.SPIPRI.bit.TRIWIRE = 0;
    SpiaRegs.SPIFFRX.bit.RXFFIENA = 0;
    SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1; //enable reciever overrun
    SpiaRegs.SPICTL.bit.SPIINTENA = 1; // tx and rx interrupt enable
    SpiaRegs.SPICCR.bit.SPISWRESET = 1; //release from reset

    /* data transmission */
    uint16_t data_rx =0;

   // SpiaRegs.SPICTL.bit.TALK = 0; // transmission off
    while(SpiaRegs.SPISTS.bit.INT_FLAG !=1); // Waits until data rx’d
    data_rx = SpiaRegs.SPIRXBUF;
    while(1);

}

interrupt void spi_rcs_isr()
{
	int data_rx;
	data_rx = SpiaRegs.SPIRXBUF;
}

  • Hi,

    Is the data transfer happening as expected. Were you able to receive the data using polling mode?

    Regards,
    Veena
  • Hey Veena,

    I changed data coming from arduino to a 16 bit number as int c = 0x00ff. And changed SPICHAR to 0. Now interrupt flag is set. Still program not entering into Interrupt Service Routine.  

    We are receiving data using polling mode  but while sending 0x00ff for every 2sec we are recieving sequence of numbers 31,4095,65535.. . which are also not consistent .

    Could  you throw some light on SPICHAR usage ? Also about ISR issue.

    Thank you for your time and support

    F28027 code:
    #include "DSP28x_Project.h"
    
    interrupt void spi_rcs_isr();
    
    void main()
    {
        InitSysCtrl();
    
        /*Interrupt config*/
    
        DINT;
        InitPieCtrl();
    
        IER = 0x0000;
        IFR = 0x0000;
    
        InitPieVectTable();
    
        EALLOW;
    
        PieVectTable.SPIRXINTA = &spi_rcs_isr;
    
        PieCtrlRegs.PIECTRL.bit.ENPIE =1;
        PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // for spircs
        PieCtrlRegs.PIECTRL.bit.PIEVECT= 0x0D90;
        IER |=  M_INT6; // cpu interrupt 6 for spirx
        EINT;
        ERTM;
    
        /* GPIO pull up enable*/
    
        GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;
        GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;
        GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;
        GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;
    
        /*Qualification Select*/
    
        GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3;
        GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;
        GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;
        GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;
    
        /*Setting up GPIO pins in SPI mode*/
    
        GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1;
        GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;
        GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;
        GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;
    
        /* SPI config */
        SpiaRegs.SPICCR.bit.SPISWRESET = 0; //  reset
        SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0; //  slave mode
        SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; // data out on rising and in on falling
        SpiaRegs.SPICTL.bit.CLK_PHASE = 0; // no delay
        //SpiaRegs.SPIBRR = 127; // lowest baud rate
        SpiaRegs.SPICCR.bit.SPICHAR = 0; // 1 bit word
        SpiaRegs.SPISTS.bit.OVERRUN_FLAG = 0;
        SpiaRegs.SPISTS.bit.INT_FLAG = 0;
        SpiaRegs.SPIPRI.bit.TRIWIRE = 0;
        SpiaRegs.SPIFFRX.bit.RXFFIENA = 0;
        SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1; //enable reciever overrun
        SpiaRegs.SPICTL.bit.SPIINTENA = 1; // tx and rx interrupt enable
        SpiaRegs.SPICCR.bit.SPISWRESET = 1; //release from reset
    
        /* data transmission */
        uint16_t data_rx =0;
        SpiaRegs.SPICTL.bit.TALK = 0; // transmission off
    
        while(1){
        	if(SpiaRegs.SPISTS.bit.INT_FLAG ==1){ // Waits until data rx’d
        	data_rx = (SpiaRegs.SPIRXBUF & 0x00ff);
        	}
        }
    
    }
    
    interrupt void spi_rcs_isr()
    {
    	int data_rx;
    	data_rx = SpiaRegs.SPIRXBUF;
    }
    

    Arduino code:

    #include <SPI.h>
    
    void setup (void) {
       Serial.begin(115200); //set baud rate to 115200 for usart
       digitalWrite(SS, HIGH); // disable Slave Select
       SPI.begin ();
       SPI.setClockDivider(SPI_CLOCK_DIV128);//divide the clock by 8
    }
    
    void loop (void) {
       int c=0x00ff;
       digitalWrite(SS, LOW); // enable Slave Select
       SPI.transfer(c);
       Serial.print(c);
       digitalWrite(SS, HIGH);
       delay(2000);
    }

  • Hi,

    If you are able to receive the date using polling method and the issue is only regarding getting the interrupts, make sure the PIE interrupt is configured properly, make sure the pending flags (if any) in PIE and in SPI module are cleared before configuring the interrupt.

    You can update the SPICHAR as per your application need, But you should make sure that teh data length is configured the same on both the master and slave devices.

    Regards,
    Veena
  • Hi,

    Were you able to resolve the issue?

    Regards,

    Veena

  • Since I haven't heard from you for the last few weeks, I assume you were able to resolve the issue and I am closing the ticket.

    Regards,
    Veena