Other Parts Discussed in Thread: C2000WARE
Tool/software:
I am trying to perform a two way communication between 28379D, one as a master and the other as a slave.
I have been successful to perform one way communication (master -> transmission and slave -> receiver)
But when I try to perform two way communication, i am running into a problem.
Both the master and slave receives correct value sometimes and wrong value sometimes. The wrong values are either the value i am trying to send or some random values.
Code for Master
#include "F28x_Project.h"
void delay_loop(void);
void spi_xmit(Uint16 a);
void spi_fifo_init(void);
void spi_init(void);
void error(void);
volatile Uint16 datasend=40;
void main(void)
{
Uint16 sdata;
Uint16 rdata;
InitSysCtrl();
InitSpiaGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
spi_fifo_init();
InitSpi();
sdata = 1;
for(;;)
{
// Transmit data
spi_xmit(datasend);
DELAY_US(100);
if(SpiaRegs.SPIFFRX.bit.RXFFST != 0) {
rdata = SpiaRegs.SPIRXBUF; // Read received data
}
}
}
void delay_loop()
{
long i;
for (i = 0; i < 10000; i++) {}
}
void error(void)
{
asm(" ESTOP0");
for (;;);
}
void spi_xmit(Uint16 a)
{
SpiaRegs.SPITXBUF = a;
}
void spi_fifo_init()
{
SpiaRegs.SPIFFRX.bit.RXFFIL = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFIENA = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFINT = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFST = 0x00;
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFOVF = 0x00;
SpiaRegs.SPIFFCT.all=0x0;
}
#include "F2837xD_device.h"
#include "F2837xD_Examples.h"
//
// Calculate BRR: 7-bit baud rate register value
// SPI CLK freq = 500 kHz
// LSPCLK freq = CPU freq / 4 (by default)
// BRR = (LSPCLK freq / SPI CLK freq) - 1
//
#if CPU_FRQ_200MHZ
#define SPI_BRR ((200E6 / 4) / 500E3) - 1
#endif
#if CPU_FRQ_150MHZ
#define SPI_BRR ((150E6 / 4) / 500E3) - 1
#endif
#if CPU_FRQ_120MHZ
#define SPI_BRR ((120E6 / 4) / 500E3) - 1
#endif
//
// InitSPI - This function initializes the SPI to a known state
//
void InitSpi(void)
{
// Initialize SPI-A
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 1;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;
SpiaRegs.SPICCR.bit.SPICHAR = (16-1);
SpiaRegs.SPIFFTX.bit.SPIFFENA = 0;
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICTL.bit.SPIINTENA = 1; //Enable SPIINTENA to generate INT_FLAG bit on completion of SPI transmission
SpiaRegs.SPICCR.bit.SPILBK = 0;
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}
//
void InitSpiGpio()
{
InitSpiaGpio();
}
//
// InitSpiaGpio - Initialize SPIA GPIOs
//
void InitSpiaGpio()
{
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO19 (SPISTEA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO19 (SPISTEA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO19 (SPISTEA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO19 (SPISTEA)
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; // Configure GPIO19 as SPISTEA
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3; // Configure GPIO19 as SPISTEA
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3; // Configure GPIO19 as SPISTEA
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3; // Configure GPIO19 as SPISTEA
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA
EDIS;
}
//
// End of file
//
Code for Slave
#include "F28x_Project.h"
void delay_loop(void);
void spi_xmit(Uint16 a);
void spi_fifo_init(void);
void spi_init(void);
void error(void);
volatile Uint16 datasend = 450; // send data
Uint16 rdata; // received data
void main(void)
{
InitSysCtrl();
InitSpiaGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
spi_fifo_init(); // Initialize the SPI FIFO
InitSpi();
for(;;)
{
spi_xmit(datasend); // Send data
DELAY_US(100);
if(SpiaRegs.SPIFFRX.bit.RXFFST != 0) {
rdata = SpiaRegs.SPIRXBUF; // Read received data to clear RX FIFO
}
}
}
void error(void)
{
asm(" ESTOP0"); // Test failed!! Stop!
for (;;);
}
void spi_xmit(Uint16 a)
{
// while (SpiaRegs.SPIFFTX.bit.TXFFST >= 16) {} // Wait if TX FIFO is full
SpiaRegs.SPITXBUF = a;
}
void spi_fifo_init()
{
SpiaRegs.SPIFFRX.bit.RXFFIL = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFIENA = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFINT = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFST = 0x00;
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFOVF = 0x00;
SpiaRegs.SPIFFCT.all=0x0;
}
#include "F2837xD_device.h"
#include "F2837xD_Examples.h"
//
// Calculate BRR: 7-bit baud rate register value
// SPI CLK freq = 500 kHz
// LSPCLK freq = CPU freq / 4 (by default)
// BRR = (LSPCLK freq / SPI CLK freq) - 1
//
#if CPU_FRQ_200MHZ
#define SPI_BRR ((200E6 / 4) / 500E3) - 1
#endif
#if CPU_FRQ_150MHZ
#define SPI_BRR ((150E6 / 4) / 500E3) - 1
#endif
#if CPU_FRQ_120MHZ
#define SPI_BRR ((120E6 / 4) / 500E3) - 1
#endif
//
// InitSPI - This function initializes the SPI to a known state
//
void InitSpi(void)
{
// Initialize SPI-A
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;
SpiaRegs.SPICTL.bit.CLK_PHASE = 1;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;
SpiaRegs.SPICCR.bit.SPICHAR = (16-1);
SpiaRegs.SPIFFTX.bit.SPIFFENA = 0;
SpiaRegs.SPICTL.bit.TALK = 1; //Receiver mode enabled
SpiaRegs.SPICTL.bit.SPIINTENA = 1;
SpiaRegs.SPICCR.bit.SPILBK = 0;
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}
void InitSpiGpio()
{
InitSpiaGpio();
}
//
// InitSpiaGpio - Initialize SPIA GPIOs
//
void InitSpiaGpio()
{
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; // Enable pull-up on GPIO58 (SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; // Enable pull-up on GPIO59 (SPISOMIA)
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0; // Enable pull-up on GPIO60 (SPICLKA)
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0; // Enable pull-up on GPIO61 (SPISTEA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO58 (SPISIMOA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO59 (SPISOMIA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO60 (SPICLKA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO61 (SPISTEA)
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; // Configure GPIO58 as SPISIMOA
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; // Configure GPIO59 as SPISOMIA
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; // Configure GPIO60 as SPICLKA
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3; // Configure GPIO61 as SPISTEA
GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3; // Configure GPIO58 as SPISIMOA
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3; // Configure GPIO59 as SPISOMIA
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3; // Configure GPIO60 as SPICLKA
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3; // Configure GPIO61 as SPISTEA
EDIS;
}
//
// End of file
//
Oscilloscope Data
Yellow : MOSI
Pink: Clock Select
Blue: MISO
The data seems to be mostly correct for MOSI but in MISO, there are more errors.
Could someone help me with this issue?
I tried using FIFO but in that case the slave seems to get stuck.



