Other Parts Discussed in Thread: C2000WARE
hi everyone
I am a beginner in the CCS area and I need help. I am trying to communicate between two f28379D launchpads with SPI. I want to send data from master to slave. However, the problem is coming. Everything is great in the master. I observed the waveform in the master with an oscilloscope.
but I am unable to receive the data on the slave side.
////////////////////////// master code ///////
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "F28x_Project.h"
#include "F2837xD_device.h"
#include "F2837xD_Examples.h"
#include "device.h"
#include "driverlib.h"
void SPI_GPIO_Init();
void spi_init();
void spi_xmit(Uint16 a);
void spi_fifo_init();
uint16_t sdata =0;
void main(void)
{
Device_init();
Device_initGPIO();
DINT;
Interrupt_initModule();
//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
//
Interrupt_initVectorTable();
// Disable CPU __interrupts and clear all CPU __interrupt flags:
//
IER = 0x0000;
IFR = 0x0000;
SPI_GPIO_Init();
spi_fifo_init();
spi_init();
while(1)
{
spi_xmit(sdata);
DEVICE_DELAY_US(100000);
sdata++;
}
}
void spi_xmit(Uint16 a)
{
SpiaRegs.SPITXBUF = a;
}
void SPI_GPIO_Init()
{
EALLOW;
GPIO_setPinConfig(GPIO_58_SPISIMOA);
GPIO_setPinConfig(GPIO_59_SPISOMIA);
GPIO_setPinConfig(GPIO_60_SPICLKA);
GPIO_setPinConfig(GPIO_61_SPISTEA);
EDIS;
}
void spi_init()
{
SpiaRegs.SPICCR.bit.SPISWRESET = 0; // Reset on
SpiaRegs.SPICCR.bit.SPICHAR = 15; // 16-bit char bits
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; // rising edge
SpiaRegs.SPICCR.bit.SPILBK = 0; // Loopback disabled
SpiaRegs.SPIBRR.all =0x0063; // baud rate setting for master
SpiaRegs.SPICTL.bit.TALK = 1; // enable talk
SpiaRegs.SPICTL.bit.SPIINTENA = 0; // SPI int disabled
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; // Master mode
SpiaRegs.SPICTL.bit.CLK_PHASE = 1; // delay half cycle
SpiaRegs.SPICCR.bit.SPISWRESET = 1; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}
void spi_fifo_init()
{
// Initialize SPI TX FIFO registers for now
SpiaRegs.SPIFFTX.bit.TXFIFO = 1; // Enable Tx fifo
SpiaRegs.SPIFFTX.bit.SPIFFENA = 1; // Enable SPI fifo
SpiaRegs.SPIFFTX.bit.TXFIFO = 1; // Enable Tx fifo
SpiaRegs.SPIFFTX.bit.TXFFIL = 0; // Tx fifo level is zero
SpiaRegs.SPIFFTX.bit.TXFFIENA = 0; // Disable tx fifo interrupt
SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1; // clear tx interrupt flag
SpiaRegs.SPIFFTX.bit.SPIRST = 1; // release SPI fifo TX
SpiaRegs.SPIFFCT.all=0x0; // TX delay = 0
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////// slave code ///////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "F28x_Project.h"
#include "F2837xD_device.h"
#include "F2837xD_Examples.h"
#include "device.h"
#include "driverlib.h"
void SPI_GPIO_Init();
void spi_init();
void spi_fifo_init();
void spi_xmit(Uint16 a);
Uint16 sdata; // send data
Uint16 rdata; // received data
void main(void)
{
Device_init();
Device_initGPIO();
DINT;
Interrupt_initModule();
//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
//
Interrupt_initVectorTable();
// Disable CPU __interrupts and clear all CPU __interrupt flags:
//
IER = 0x0000;
IFR = 0x0000;
SPI_GPIO_Init();
spi_fifo_init();
spi_init();
//
while(1)
{
while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }
//
// Check against sent data
//
rdata = SpiaRegs.SPIRXBUF;
rdata++;
}
}
void SPI_GPIO_Init()
{
EALLOW;
GPIO_setPinConfig(GPIO_58_SPISIMOA);
GPIO_setPinConfig(GPIO_59_SPISOMIA);
GPIO_setPinConfig(GPIO_60_SPICLKA);
GPIO_setPinConfig(GPIO_61_SPISTEA);
EDIS;
}
void spi_init()
{
SpiaRegs.SPICCR.bit.SPISWRESET = 0; // Reset on
SpiaRegs.SPICCR.bit.SPICHAR = 15; // 16-bit char bits
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; // rising edge
SpiaRegs.SPICCR.bit.SPILBK = 0; // Loopback disabled
SpiaRegs.SPIBRR.all =0x0063; // baud rate setting for master
SpiaRegs.SPICTL.bit.TALK = 1; // enable talk
SpiaRegs.SPICTL.bit.SPIINTENA = 0; // SPI int disabled
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0; // Slave mode
SpiaRegs.SPICTL.bit.CLK_PHASE = 1; // delay half cycle
SpiaRegs.SPICCR.bit.SPISWRESET = 1; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}
void spi_fifo_init()
{
// Initialize SPI TX FIFO registers for now
EALLOW;
SpiaRegs.SPICCR.bit.SPISWRESET=0; // Reset SPI
SpiaRegs.SPICCR.all=0x00F; //16-bit character, disable Loopback
SpiaRegs.SPICTL.all=0x0013;
// SpiaRegs.SPICTL.bit.CLK_PHASE=1;
SpiaRegs.SPISTS.all=0x0000;
SpiaRegs.SPIFFTX.all=0xC008; //Enable FIFO's, set TX FIFO level to 8,disable tX FIFO
SpiaRegs.SPIFFRX.all=0x0028; //Set RX FIFO level to 8
SpiaRegs.SPIFFCT.all=0x00;
SpiaRegs.SPIPRI.all=0x0010;
// SpiaRegs.SPICCR.all=0x01F;
SpiaRegs.SPICCR.bit.SPISWRESET=1; // Enable SPI
SpiaRegs.SPIFFTX.bit.TXFIFO=1;
SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
EDIS;
}
void spi_xmit(Uint16 a)
{
SpiaRegs.SPITXBUF = a;
}
///////////////////////////////// output of the master
