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.

Path from SPI to FFT

I'm trying to build a code for SPI-FFT system.

I referred a example from TI for both.

However, I am not sure it is correctly built.

My system has a flow like this. RFreciever (SI4463-Silabs) -> FFT(TMS320F28377D-TI)

Please if someone who can evaluate my code is here, help me!

<code>

//*****************************************************************************
// includes
//*****************************************************************************
#include "fpu_rfft.h"
#include "math.h"
#include "examples_setup.h"
#include "F28x_Project.h"
#include <stdio.h>
#include <inttypes.h>
//*****************************************************************************
// defines
//*****************************************************************************
#define RFFT_STAGES     8
#define RFFT_SIZE       (1 << RFFT_STAGES)
#define EPSILON         0.01
#define WORDLENGTH 0x7  // 8 bit chars

void delay_loop(void);
void error(void);
//user
void spi_init_test(void);
void spi_init(void);
void spi_receive(void);
void spi_xmit(void);
volatile uint16_t sampleIndex = 0;      //brief Index into the FFT input buffer
//*****************************************************************************
// globals
//*****************************************************************************
#pragma DATA_SECTION(RFFTin1Buff,"RFFTdata1")
#pragma DATA_SECTION(RFFTmagBuff,"RFFTdata2")
#pragma DATA_SECTION(RFFToutBuff,"RFFTdata3")
#pragma DATA_SECTION(RFFTF32Coef,"RFFTdata4")
float RFFTin1Buff[RFFT_SIZE];
float RFFTmagBuff[RFFT_SIZE/2+1];
float RFFToutBuff[RFFT_SIZE];
float RFFTF32Coef[RFFT_SIZE];

RFFT_F32_STRUCT rfft;
RFFT_F32_STRUCT_Handle hnd_rfft = &rfft;

uint16_t pass = 0;
uint16_t fail = 0;
//uint16_t rdata;

//uint16_t sdata; // send data
uint16_t rdata; // received data
//*****************************************************************************
// SPI function
//*****************************************************************************

void spi_xmit()
{
 SpiaRegs.SPITXBUF=0x0044;
}


void spi_receive()
{
 SpiaRegs.SPIRXBUF=0x0044; //receiving value from the buffer?
}
void spi_fifo_init()
{                       // Initialize SPI FIFO registers
 SpiaRegs.SPIFFTX.all=0xE040;
 SpiaRegs.SPIFFRX.all=0x2044;
 SpiaRegs.SPIFFCT.all=0x0;
}
void spi_fifo_init_test()
{
 //SpiaRegs.SPIFFTX.bit.SPIRST = 0; //TX FIFO SPI Reset
 SpiaRegs.SPIFFTX.bit.SPIFFENA = 0; //TX FIFO enhancements (what is that?)
 SpiaRegs.SPIFFTX.bit.TXFFIENA = 0; //TX FIFO enable (0 = disable; 1 = enabled)
 SpiaRegs.SPIFFTX.bit.TXFFIL = 0; //Transmit FIFO Interrupt Level Bits
 SpiaRegs.SPIFFTX.bit.TXFFINT = 0; //TX FIFO Interrupt Bit (Read only)
 SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 0; //TX FIFO Interrupt Clear
 //SpiaRegs.SPIFFTX.bit.SPIRST = 1; //TX FIFO SPI Reset CLEAR
 //SpiaRegs.SPIFFTX.bit.TXFFST //TX FIFO status (tells you how many words there are (4 max) )
 //SpiaRegs.SPIFFTX.bit.TXFIFO //TX FIFO reset

 SpiaRegs.SPIFFRX.bit.RXFFIENA = 0; //RX FIFO Interrupt Enabler (0 = disable; 1 = enabled)
 //SpiaRegs.SPIFFRX.bit.RXFFIL = //RX FIFO Interrupt Level Bits
 SpiaRegs.SPIFFRX.bit.RXFFINT = 0; //RX FIFO Interrupt Flag
 SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 0; //RX FIFO Interrupt Flag Clear
 //SpiaRegs.SPIFFRX.bit.RXFFOVF = //RX FIFO overflow flag
 //SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = //RX FIFO overflow flag Clear
 //SpiaRegs.SPIFFRX.bit.RXFFST = //RX FIFO Receive status
 SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;  //RX FIFO Reset
 SpiaRegs.SPIFFCT.bit.TXDLY = 0;        //SPI FIFO Control Register
}
void spi_init()
{
 SpiaRegs.SPICCR.all =0x000F;   // Reset on, rising edge, 16-bit char bits
 SpiaRegs.SPICTL.all =0x0006;   // Enable master mode, normal phase,
 SpiaRegs.SPIBRR.all =0x007F;   // enable talk, and SPI int disabled.
 SpiaRegs.SPICCR.all =0x009F;   // Relinquish SPI from Reset
 SpiaRegs.SPIPRI.bit.FREE = 1;  // Set so breakpoints don't disturb xmission
}

void spi_init_test()            //Configure the SPI configuration register bits
{
SpiaRegs.SPICCR.bit.SPISWRESET = 0; //SPI reset initialization
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; // controls the shift clock polarity refer to page 1990 of the technical documentation for more info
SpiaRegs.SPICCR.bit.HS_MODE = 0; // high speed mode SPI protocol

//SpiaRegs.SPICCR.bit.SPICHAR = ?? // Character length control bits (currently set the SPI loopback to 0)
SpiaRegs.SPICCR.bit.SPILBK = 0;         //SPI Loopback Mode Select
SpiaRegs.SPICCR.bit.SPICHAR = 0x000F;   //The number of characters to be shifted in and out as a single character during one shift sequence
SpiaRegs.SPICCR.bit.SPISWRESET = 1;     //Relinquish SPI from Reset

//SPI Operation Control Register
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;      //help control the CLKPOLARITY sequence
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;   //Master mode = 1, Slave mode = 0
SpiaRegs.SPICTL.bit.OVERRUNINTENA = 0;  //Overrun Interrupt Enable
SpiaRegs.SPICTL.bit.SPIINTENA = 0;      //control whether SPI will run in ISR or not
SpiaRegs.SPICTL.bit.TALK = 1;           //Transmit Enable
//enables 4-pin option, ensure to enable the receiver's SPISTEn input pin --> technical documents notes page 1903

//SCLK speed (Baud rate)
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x00007F; //set the SPI baud rate
//7Fh (R/W) = SPI Baud Rate = LSPCLK/128
}

/*
void delay_loop()
{
 long i;
 for (i = 0; i < 1000000; i++) {}
}

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

*/

//*****************************************************************************
// Main (FFT Cal)
//*****************************************************************************
void main(void)
{
    // Locals
    uint16_t i;

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

    spi_fifo_init(); //Initialize the Spi FIFO
    spi_init_test(); //Initialize user SPI
    //sdata = 1001;
    Uint16 SPIbyte1;

    for(i=0; i < 100; i++)
       {
           //RFFTin1Buff[i]   = sin(Rad) + cos(Rad*2.3567); //Real input signal
           //Rad = Rad + RadStep
           //spi_receive(cos(2.3567));
           SPIbyte1 = SpiaRegs.SPIRXBUF;
           RFFTin1Buff[i]   = (float) SPIbyte1;
       }
    //spi_xmit(sdata);    //Wait until data is received

#ifdef FLASH
    EALLOW;
    Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0;
    memcpy((uint32_t *)&RamfuncsRunStart, (uint32_t *)&RamfuncsLoadStart,
            (uint32_t)&RamfuncsLoadSize );
    FPU_initFlash();
#endif //FLASH
    FPU_initSystemClocks();
    FPU_initEpie();
    for(i=0; i < RFFT_SIZE; i++){       // Clear input buffers:
        RFFTin1Buff[i] = 0.0f;
    }

    //Rad = 0.0f;                         // Generate sample waveforms:

    hnd_rfft->FFTSize   = RFFT_SIZE;
    hnd_rfft->FFTStages = RFFT_STAGES;
    hnd_rfft->InBuf     = &RFFTin1Buff[0];  //Input buffer
    hnd_rfft->OutBuf    = &RFFToutBuff[0];  //Output buffer
    hnd_rfft->MagBuf    = &RFFTmagBuff[0];  //Magnitude buffer
    hnd_rfft->CosSinBuf = &RFFTF32Coef[0];  //Twiddle factor buffer
    RFFT_f32_sincostable(hnd_rfft);         //Calculate twiddle factor

    for (i=0; i < RFFT_SIZE; i++){
          RFFToutBuff[i] = 0;               //Clean up output buffer
    }
    for (i=0; i <= RFFT_SIZE/2; i++){
         RFFTmagBuff[i] = 0;                //Clean up magnitude buffer
    }
    RFFT_f32(hnd_rfft);                     //Calculate real FFT
    RFFT_f32_mag(hnd_rfft);                 //Calculate magnitude
    hnd_rfft->PhaseBuf = &RFFTmagBuff[0];    //Use magnitude buffer
    done();
    //return 1;                // Execution never reaches this point
}

Thank you.