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.

TMS320F28386D: TMS320F28386 SPI Setup?

Part Number: TMS320F28386D

Tool/software:

Hi Team

I am working on a project using the TMS320F28386D.

I am working on a project to communicate with MLX90363 to determine the position of the magnet.

However, I am having a problem with the SPI communication process.

As you know, the TMS320F28386D has four independent SPI modules (SPIA, SPIB, SPIC, and SPID).

So I set up the code as below, and SPIA and SPIC work fine.

SPIB and SPID do not work and no clocks are generated.

What is the difference between SPIA, SPIC and SPIB, SPID?

P.S. Ignore the comments, they're not cleaned up.

I think the hardware is fine.

This is because when I measure the GPIO directly with an oscilloscope, I get no clock(SPIB, SPID).

#include "SPIS.h"
#include "f28x_project.h"
#include "TIMERS.h"

void InitSpi(void)
{

    SpiaRegs.SPIFFTX.all=SpibRegs.SPIFFTX.all=SpicRegs.SPIFFTX.all=SpidRegs.SPIFFTX.all=0xE040;
    SpiaRegs.SPIFFRX.all=SpibRegs.SPIFFRX.all=SpicRegs.SPIFFRX.all=SpidRegs.SPIFFRX.all=0x2041;
    SpiaRegs.SPIFFCT.all=SpibRegs.SPIFFCT.all=SpicRegs.SPIFFCT.all=SpidRegs.SPIFFCT.all=4;
    SpiaRegs.SPICCR.all =SpibRegs.SPICCR.all =SpicRegs.SPICCR.all =SpidRegs.SPICCR.all=0x0007;
    SpiaRegs.SPICTL.all =SpibRegs.SPICTL.all =SpicRegs.SPICTL.all =SpidRegs.SPICTL.all =0x0006;
    SpiaRegs.SPIBRR.all =SpibRegs.SPIBRR.all =SpicRegs.SPIBRR.all = SpidRegs.SPIBRR.all = (10-1);
    SpiaRegs.SPICCR.all =SpibRegs.SPICCR.all =SpicRegs.SPICCR.all =SpidRegs.SPICCR.all =0x0087;  
    SpiaRegs.SPIPRI.bit.FREE =SpibRegs.SPIPRI.bit.FREE=SpicRegs.SPIPRI.bit.FREE=SpidRegs.SPIPRI.bit.FREE= 1;  

}



void InitSpiGpio(void)
{
    EALLOW;

    //------SPIA GPIO SETUP ---------//

    GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;  // SPIA MOSI
    GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;  // SPIA MISO
    GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0;  // SPIA CLK
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;  // SPIA SS1
    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;  // SPIA SS2


    GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3; // Asynch input (SPIA MOSI)
    GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3; // Asynch input  (SPIA MISO)
    GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3; // Asynch input  (SPIA CLK)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO0 = 3; // Asynch input  (SPIA SS1)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 3; // Asynch input  (SPIA SS2)
   

    GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1; // Configure as SPIA MOSI
    GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1; // Configure as SPIA MISO
    GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1; // Configure as SPIA CLK

    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;    
    GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;  
    GpioDataRegs.GPASET.bit.GPIO0 = 1;

    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;    
    GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;  
    GpioDataRegs.GPASET.bit.GPIO1 = 1;

    //------SPIA GPIO SETUP END ---------//


    //------SPIB GPIO SETUP ---------//


    GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0;  // SPIB MOSI
    GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;  // SPIB MISO
    GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;  // SPIB CLK
    GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0;  // SPIB SS1
    GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;  // SPIB SS2


    GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3; // Asynch input (SPIB MOSI)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3; // Asynch input  (SPIB MISO)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3; // Asynch input  (SPIB CLK)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO2 = 3; // Asynch input  (SPIB SS1)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3; // Asynch input  (SPIB SS2)
   

    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 6; // Configure as SPIB MOSI
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 6; // Configure as SPIB MISO
    GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 6; // Configure as SPIB CLK


    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;    
    GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;  
    GpioDataRegs.GPASET.bit.GPIO2 = 1;

    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;    
    GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;  
    GpioDataRegs.GPASET.bit.GPIO3 = 1;

    //------SPIB GPIO SETUP END ---------//


    //------SPIC GPIO SETUP ---------//

    GpioCtrlRegs.GPDPUD.bit.GPIO100 = 0;  // SPIC MOSI
    GpioCtrlRegs.GPDPUD.bit.GPIO101 = 0;  // SPIC MISO
    GpioCtrlRegs.GPDPUD.bit.GPIO102 = 0;  // SPIC CLK
    GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0;  // SPIC SS1
    GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0;  // SPIC SS2


    GpioCtrlRegs.GPDQSEL1.bit.GPIO100 = 3; // Asynch input (SPIC MOSI)
    GpioCtrlRegs.GPDQSEL1.bit.GPIO101 = 3; // Asynch input  (SPIC MISO)
    GpioCtrlRegs.GPDQSEL1.bit.GPIO102 = 3; // Asynch input  (SPIC CLK)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO4 = 3; // Asynch input  (SPIC SS1)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 3; // Asynch input  (SPIC SS2)
   


    GpioCtrlRegs.GPDGMUX1.bit.GPIO100 = 1;
    GpioCtrlRegs.GPDGMUX1.bit.GPIO101 = 1;
    GpioCtrlRegs.GPDGMUX1.bit.GPIO102 = 1;

    GpioCtrlRegs.GPDMUX1.bit.GPIO100 = 6; // Configure as SPIC MOSI
    GpioCtrlRegs.GPDMUX1.bit.GPIO101 = 6; // Configure as SPIC MISO
    GpioCtrlRegs.GPDMUX1.bit.GPIO102 = 6; // Configure as SPIC CLK

    GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0;    
    GpioCtrlRegs.GPAGMUX1.bit.GPIO4 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO4 = 1;  
    GpioDataRegs.GPASET.bit.GPIO4 = 1;

    GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0;    
    GpioCtrlRegs.GPAGMUX1.bit.GPIO5 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO5 = 1;  
    GpioDataRegs.GPASET.bit.GPIO5 = 1;

    //------SPIC GPIO SETUP END ---------//



    //------SPID GPIO SETUP ---------//

    GpioCtrlRegs.GPCPUD.bit.GPIO91 = 0;  // SPIC MOSI
    GpioCtrlRegs.GPCPUD.bit.GPIO92 = 0;  // SPIC MISO
    GpioCtrlRegs.GPCPUD.bit.GPIO93 = 0;  // SPIC CLK
    GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0;  // SPIC SS1
    GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0;  // SPIC SS2


    GpioCtrlRegs.GPCQSEL2.bit.GPIO91 = 3; // Asynch input (SPIC MOSI)
    GpioCtrlRegs.GPCQSEL2.bit.GPIO92 = 3; // Asynch input  (SPIC MISO)
    GpioCtrlRegs.GPCQSEL2.bit.GPIO93 = 3; // Asynch input  (SPIC CLK)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO6 = 3; // Asynch input  (SPIC SS1)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 3; // Asynch input  (SPIC SS2)
   

    GpioCtrlRegs.GPCMUX2.bit.GPIO91 = 15; // Configure as SPIC MOSI
    GpioCtrlRegs.GPCMUX2.bit.GPIO92 = 15; // Configure as SPIC MISO
    GpioCtrlRegs.GPCMUX2.bit.GPIO93 = 15; // Configure as SPIC CLK

    GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;    
    GpioCtrlRegs.GPAGMUX1.bit.GPIO6 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;  
    GpioDataRegs.GPASET.bit.GPIO6 = 1;

    GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0;    
    GpioCtrlRegs.GPAGMUX1.bit.GPIO7 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO7 = 1;  
    GpioDataRegs.GPASET.bit.GPIO7 = 1;

    //------SPIC GPIO SETUP END ---------//

    EDIS;
}


char SPIA_TX_RX(char tx_data)
{
    Uint16 i, spi_tx_data;
    char rx_data;
    while(SpiaRegs.SPIFFTX.bit.TXFFST != 0) { }
    while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1) { }
    i = SpiaRegs.SPIFFRX.bit.RXFFST;
    while(i != 0)
    {
        rx_data = SpiaRegs.SPIRXBUF;
        i--;
    }
    SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;
    spi_tx_data = tx_data;
    spi_tx_data = spi_tx_data << 8;
    SpiaRegs.SPITXBUF=spi_tx_data;
    while(SpiaRegs.SPIFFRX.bit.RXFFINT !=1) { }
    rx_data = SpiaRegs.SPIRXBUF;
    return  rx_data;
}

char SPIB_TX_RX(char tx_data)
{
    Uint16 i, spi_tx_data;
    char rx_data;
    while(SpibRegs.SPIFFTX.bit.TXFFST != 0) { }
    while(SpibRegs.SPISTS.bit.BUFFULL_FLAG == 1) { }
    i = SpibRegs.SPIFFRX.bit.RXFFST;
    while(i != 0)
    {
        rx_data = SpibRegs.SPIRXBUF;
        i--;
    }
    SpibRegs.SPIFFRX.bit.RXFFINTCLR = 1;
    spi_tx_data = tx_data;
    spi_tx_data = spi_tx_data << 8;
    SpibRegs.SPITXBUF=spi_tx_data;
    while(SpibRegs.SPIFFRX.bit.RXFFINT !=1) { }
    rx_data = SpibRegs.SPIRXBUF;
    return  rx_data;
}


char SPIC_TX_RX(char tx_data)
{
    Uint16 i, spi_tx_data;
    char rx_data;
    while(SpicRegs.SPIFFTX.bit.TXFFST != 0) { }
    while(SpicRegs.SPISTS.bit.BUFFULL_FLAG == 1) { }
    i = SpicRegs.SPIFFRX.bit.RXFFST;
    while(i != 0)
    {
        rx_data = SpicRegs.SPIRXBUF;
        i--;
    }
    SpicRegs.SPIFFRX.bit.RXFFINTCLR = 1;
    spi_tx_data = tx_data;
    spi_tx_data = spi_tx_data << 8;
    SpicRegs.SPITXBUF=spi_tx_data;
    while(SpicRegs.SPIFFRX.bit.RXFFINT !=1) { }
    rx_data = SpicRegs.SPIRXBUF;
    return  rx_data;
}

char SPID_TX_RX(char tx_data)
{
    Uint16 i, spi_tx_data;
    char rx_data;
    while(SpidRegs.SPIFFTX.bit.TXFFST != 0) { }
    while(SpidRegs.SPISTS.bit.BUFFULL_FLAG == 1) { }
    i = SpidRegs.SPIFFRX.bit.RXFFST;
    while(i != 0)
    {
        rx_data = SpidRegs.SPIRXBUF;
        i--;
    }
    SpidRegs.SPIFFRX.bit.RXFFINTCLR = 1;
    spi_tx_data = tx_data;
    spi_tx_data = spi_tx_data << 8;
    SpidRegs.SPITXBUF=spi_tx_data;
    while(SpidRegs.SPIFFRX.bit.RXFFINT !=1) { }
    rx_data = SpidRegs.SPIRXBUF;
    return  rx_data;
}
  • Resolved

    The TMS320F2838X datasheet is missing the GPyGMUX settings.

    Therefore, we verified the normal behavior after setting GPyGMUX.

    GpioCtrlRegs.GPAGMUX2.bit.GPIO24=1;
    GpioCtrlRegs.GPAGMUX2.bit.GPIO26=1;
    GpioCtrlRegs.GPAGMUX2.bit.GPIO25=1;

    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 2; // Configure as SPIB MOSI
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 2; // Configure as SPIB MISO
    GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 2; // Configure as SPIB CLK