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.

TMS320F28335: SPI Communication

Part Number: TMS320F28335
Other Parts Discussed in Thread: CONTROLSUITE

Hello to all,

I am working on SPI Communication with TMS320F28335, C2000 family. I wanted to do Controller to Controller Communication (Master and Slave configuration) on SPI Protocol.

It will be helpful if I get sample program for Controller to Controller SPI Communication (Master & Slave configuration).

  • Hi Prakash,

    You can refer the spi_loopback/interrupt example, disable the loopback functionality and use the same.
    C:\ti\controlSUITE\device_support\f2833x\v142\DSP2833x_examples_ccsv5

    Regards,
    Gautam
  • Hi Prakash,

    I agree with Gautam.

    You can download Control Suite if you have not already done so from: http://www.ti.com/tool/CONTROLSUITE?keyMatch=controlSUITE&tisearch=Search-EN-Everything

    Thanks,

    Marlyn

  • Hi Gautam,
    Thanks For suggestion.
    I have tried with that sample program by changing the LoopBack concept to master and slave.
    Actually, i want to communicate the master to a slave by chip select configuration. while configuring communication with master and slave, the slave is not reading the data.

    Without Chip select, i am giving continuous varying data to slave through the master. the slave is giving random data.

    this is my master code

    void main(void)
    {

    Uint16 i;
    InitSysCtrl();
    InitSpiaGpio();
    DINT;
    IER = 0x0000;
    IFR = 0x0000;
    InitPieCtrl();
    InitPieVectTable();

    EALLOW; // This is needed to write to EALLOW protected registers
    PieVectTable.SPIRXINTA = &spiRxFifoIsr;
    PieVectTable.SPITXINTA = &spiTxFifoIsr;
    EDIS; // This is needed to disable write to EALLOW protected

    spi_fifo_init(); // Initialize the SPI only
    // Initialize the send data buffer
    for(i=0; i<8; i++)
    {
    sdata[i] = i;
    }
    rdata_point = 0;

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
    PieCtrlRegs.PIEIER6.bit.INTx1=1; // Enable PIE Group 6, INT 1
    PieCtrlRegs.PIEIER6.bit.INTx2=1; // Enable PIE Group 6, INT 2
    IER=0x0021; // Enable CPU INT6
    EINT; // Enable Global Interrupts


    void spi_fifo_init()
    {
    // Initialize SPI FIFO registers
    SpiaRegs.SPICCR.bit.SPISWRESET=0; // Reset SPI
    SpiaRegs.SPICCR.all=0x000F; //16-bit character, Loopback mode
    SpiaRegs.SPICCR.bit.CLKPOLARITY=1; // 1=Data Transfer on the
    SpiaRegs.SPICTL.all=0x0017; //Interrupt enabled, Master/Slave
    SpiaRegs.SPISTS.all=0x0000;
    SpiaRegs.SPIBRR=0x0063; // Baud rate
    SpiaRegs.SPIFFTX.all=0xC020; // Enable FIFO's, set TX FIFO level
    SpiaRegs.SPIFFRX.all=0x0028; // Set RX FIFO level to 8
    SpiaRegs.SPIFFCT.all=0x0000;
    // SpiaRegs.SPIFFCT.bit.TXDLY=6;
    SpiaRegs.SPIPRI.all=0x0010;
    SpiaRegs.SPICCR.bit.SPISWRESET=1; // Enable SPI
    SpiaRegs.SPIFFTX.bit.TXFIFO=1;
    SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
    }

    __interrupt void spiTxFifoIsr(void)
    {
    Uint16 i;
    for(i=0;i<8;i++)
    {
    SpiaRegs.SPITXBUF=sdata[i]; // Send data
    }

    for(i=0;i<8;i++) // Increment data for next cycle
    {
    sdata[i] = sdata[i]+ 1;
    }
    SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1; // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x20; // Issue PIE ACK
    }

    __interrupt void spiRxFifoIsr(void)
    {
    Uint16 i;

    for(i=0;i<8;i++)
    {
    rdata[i]=SpiaRegs.SPIRXBUF; // Read data
    }
    for(i=0;i<8;i++) // Check received data
    {
    if(rdata[i] != rdata_point+i);// error();
    }
    rdata_point++;
    SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; // Clear Overflow flag
    SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x20; // Issue PIE ack
    }

    and this my slave code

    void main(void)
    {


    InitSysCtrl();
    InitSpiaGpio();
    DINT;
    IER = 0x0000;
    IFR = 0x0000;

    InitPieCtrl();
    InitPieVectTable();

    EALLOW; // This is needed to write to EALLOW protected registers
    PieVectTable.SPIRXINTA = &spiRxFifoIsr;
    PieVectTable.SPITXINTA = &spiTxFifoIsr;
    EDIS; // This is needed to disable write to EALLOW protected
    spi_fifo_init(); // Initialize the SPI only
    rdata_point = 0;

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
    PieCtrlRegs.PIEIER6.bit.INTx1=1; // Enable PIE Group 6, INT 1
    PieCtrlRegs.PIEIER6.bit.INTx2=1; // Enable PIE Group 6, INT 2
    IER=0x0020; // Enable CPU INT6
    EINT; // Enable Global Interrupts

    void spi_fifo_init()
    {
    // Initialize SPI FIFO registers
    SpiaRegs.SPICCR.bit.SPISWRESET=0; // Reset SPI
    SpiaRegs.SPICCR.all=0x004F; //16-bit character
    SpiaRegs.SPICTL.all=0x0012; //Interrupt enabled, Master/Slave
    SpiaRegs.SPISTS.all=0x0000;
    SpiaRegs.SPIBRR=0x0063; // Baud rate
    SpiaRegs.SPIFFTX.all=0xC028; // Enable FIFO's, set TX FIFO level
    SpiaRegs.SPIFFRX.all=0x0028; // Set RX FIFO level to 8
    SpiaRegs.SPIFFCT.all=0x0000;
    SpiaRegs.SPIPRI.all=0x0010;
    SpiaRegs.SPICCR.bit.SPISWRESET=1; // Enable SPI
    SpiaRegs.SPIFFTX.bit.TXFIFO=1;
    SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
    }

    __interrupt void spiTxFifoIsr(void)
    {
    Uint16 i;

    for(i=0;i<8;i++)
    {
    SpiaRegs.SPITXBUF=sdata[i]; // Send data
    }

    for(i=0;i<8;i++) // Increment data for next cycle
    {
    sdata[i] = sdata[i]+ 1;
    }
    SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1; // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x20; // Issue PIE ACK
    }

    __interrupt void spiRxFifoIsr(void)
    {
    Uint16 i;

    for(i=0;i<8;i++)
    {
    rdata[i]=SpiaRegs.SPIRXBUF; // Read data
    }
    for(i=0;i<8;i++) // Check received data
    {
    if(rdata[i] != rdata_point+i);// error();
    }
    rdata_point++;
    SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; // Clear Overflow flag
    SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x20; // Issue PIE ack
    }


    Kindly suggest me where i have to correction.

    Thanks ans Regards