Part Number: LAUNCHXL-F28379D
Other Parts Discussed in Thread: C2000WARE
Tool/software: Code Composer Studio
Hi all,
I write a code that transmit Data from SPI_A to SPI_B. I configure SPI_A in master mode and SPI_B in slave mode. When SPI_A transmission is complete the INT_FLAG in SPI_A set and interrupt occurred but in SPI_B data doesn't receive and INT_FLAG not set to 1, so the interrupt doesn't occurred. I configure SPI_A and SPI_B in non-FIFO mode.
How to fix this problem ?
Thank you for helping.
/**
* main.c
*/
#include "F28x_Project.h"
void spia_config_transmitter (void);
void spia_config_gpio (void);
void spib_config_receiver (void);
void spib_config_gpio (void);
__interrupt void isr_spia_transmitter(void);
__interrupt void isr_spib_receiver(void);
int rdata[1000];
int data;
int main(void)
{
int k=0;
InitSysCtrl();
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
EALLOW;
PieVectTable.SPIA_RX_INT = &isr_spia_transmitter;
PieVectTable.SPIB_RX_INT = &isr_spib_receiver;
EDIS;
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
PieCtrlRegs.PIEIER6.bit.INTx1 = 1;
PieCtrlRegs.PIEIER6.bit.INTx3 = 1;
IER = M_INT6;
EINT;
spib_config_receiver();
spia_config_transmitter();
SpiaRegs.SPITXBUF = 0xaa;
for(;;);
}
void spia_config_transmitter (void)
{
SpiaRegs.SPICCR.bit.SPISWRESET = 0; // reset SPI for change configuration
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; // setup SPI in master mode
SpiaRegs.SPICTL.bit.CLK_PHASE = 0; // transmits data in rising edge and receive data in falling edge of SPICLK
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0; // for SPIBRR = 0,1,2 ---> Baud Rate = LSPCLK/4
// for SPIBRR = 3 to 127 ---> Baud Rate = LSPCLK/(SPIBRR+1)
SpiaRegs.SPICCR.bit.SPICHAR = 15;// SPICHAR = Word length - 1
SpiaRegs.SPIFFTX.bit.SPIFFENA = 0; // disable FIFO
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICTL.bit.SPIINTENA = 1;
SpiaRegs.SPICCR.bit.SPISWRESET = 1; // saving changing of configuration
spia_config_gpio();
}
void spia_config_gpio (void)
{
EALLOW;
//GpioDataRegs.GPACLEAR.bit.GPIO19 = 1;
GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 0;
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 0;
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 0;
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 0;
//GpioCtrlRegs.GPAGMUX2.bit.GPIO16 = 0;
//GpioCtrlRegs.GPAGMUX2.bit.GPIO17 = 0;
//GpioCtrlRegs.GPAGMUX2.bit.GPIO18 = 0;
//GpioCtrlRegs.GPAGMUX2.bit.GPIO19 = 0;
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 1;
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 1;
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 1;
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 1;
//GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1;
//GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;
//GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;
//GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;
//GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;
//GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3;
//GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;
//GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;
//GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;
//GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;
//GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;
//GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;
//GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;
//GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;
EDIS;
}
void spib_config_receiver (void)
{
SpibRegs.SPICCR.bit.SPISWRESET = 0; // reset SPI for change configuration
SpibRegs.SPICTL.bit.MASTER_SLAVE = 0; // setup SPI in slave mode
SpibRegs.SPICTL.bit.CLK_PHASE = 0; // transmits data in rising edge and receive data in falling edge of SPICLK
SpibRegs.SPICCR.bit.CLKPOLARITY = 0;
SpibRegs.SPIBRR.bit.SPI_BIT_RATE = 0; // for SPIBRR = 0,1,2 ---> Baud Rate = LSPCLK/4
// for SPIBRR = 3 to 127 ---> Baud Rate = LSPCLK/(SPIBRR+1)
SpibRegs.SPICCR.bit.SPICHAR = 15;// SPICHAR = Word length - 1
SpibRegs.SPIFFTX.bit.SPIFFENA = 0; // disable FIFO
SpibRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPIPRI.bit.STEINV = 0;
SpibRegs.SPICTL.bit.SPIINTENA = 1;
SpibRegs.SPICTL.bit.OVERRUNINTENA = 1;
SpibRegs.SPICCR.bit.SPISWRESET = 1; // saving changing of configuration
spib_config_gpio();
}
void spib_config_gpio (void)
{
EALLOW;
GpioCtrlRegs.GPAGMUX2.bit.GPIO24 = 0;
GpioCtrlRegs.GPAGMUX2.bit.GPIO25 = 0;
GpioCtrlRegs.GPAGMUX2.bit.GPIO26 = 0;
GpioCtrlRegs.GPAGMUX2.bit.GPIO27 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1;
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 1;
GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 1;
//GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0;
GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3;
GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3;
GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3;
GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3;
GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0;
EDIS;
}
__interrupt void isr_spia_transmitter(void)
{
static int i=0;
int dummy_data = 0;
//asm(" ESTOP0");
SpiaRegs.SPITXBUF = i++;
dummy_data = SpiaRegs.SPIRXBUF;
if (i == 1000)
{
asm(" ESTOP0");
}
PieCtrlRegs.PIEACK.all = PIEACK_GROUP6;
}
__interrupt void isr_spib_receiver(void)
{
asm(" ESTOP0");
static int j;
rdata[j++] = SpibRegs.SPIRXBUF;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP6;
}