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.
Tool/software: Code Composer Studio
Dear all,
Hello
I am a beginner in the CCS area and I need help with a project I am doing. The problem is that I am trying to send a particular value (Let's say ADC value) from one F28379d launchpad to the second one. My intention is to send value from the master to the slave.
I have gone through many examples (spi_loopback, spi_ex3_externalloopbak, etc) and different discussions in forums. But it only made me more confused.
Thus, I have started with "spi_loopback" example. I want to send value 1 (just as a constant example) from master to the slave.
For the master, I have the following code:
sdata = 1;
for(;;)
{
// Transmit data
spi_xmit(sdata);
}
*****************************
void spi_init()
{
SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits
SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
SpiaRegs.SPIBRR.all =0x007F;
SpiaRegs.SPICCR.all =0x009F; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}
void spi_xmit(Uint16 a)
{
SpiaRegs.SPITXBUF=a;
}
void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x2044;
SpiaRegs.SPIFFCT.all=0x0;
}
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0; // Enable pull-up on GPIO18 (SPICLKA)
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0; // Enable pull-up on GPIO19 (SPISTEA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO16 (SPISIMOA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO17 (SPISOMIA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO18 (SPICLKA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO19 (SPISTEA)
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA
GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA
And for the slave, I have the following code:
rdata = 0;
for(;;)
{
GPIO_WritePin(19, 1);
rdata = SpiaRegs.SPIRXBUF;
GPIO_WritePin(19, 0);
}
**********
void spi_init()
{
SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits
SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
SpiaRegs.SPIBRR.all =0x007F;
SpiaRegs.SPICCR.all =0x009F; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb
// xmission
}
void spi_fifo_init()
{
SpiaRegs.SPIFFRX.bit.RXFFIL = 0x00; // 4:0 Interrupt level
SpiaRegs.SPIFFRX.bit.RXFFIENA =0; // 5 Interrupt enable0
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1; // 6 Clear INT flag
SpiaRegs.SPIFFRX.bit.RXFFINT = 0; // 7 INT flag
SpiaRegs.SPIFFRX.bit.RXFFST = 0; // 12:8 FIFO status
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1; // 13 FIFO reset
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 0; // 14 Clear overflow
SpiaRegs.SPIFFRX.bit.RXFFOVF = 0; // 15 FIFO overflow
SpiaRegs.SPIFFCT.all=0x0;
}
// Set reset low before configuration changes
// Clock polarity (0 == rising, 1 == falling)
// 16-bit character
// Enable loop-back
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPICHAR = (16-1);
SpiaRegs.SPICCR.bit.SPILBK = 1;
// Enable master (0 == slave, 1 == master)
// Enable transmission (Talk)
// Clock phase (0 == normal, 1 == delayed)
// SPI interrupts are disabled
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
SpiaRegs.SPICTL.bit.SPIINTENA = 0;
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;
SpiaRegs.SPIPRI.bit.FREE = 1;
// Release the SPI from reset
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0; // Enable pull-up on GPIO18 (SPICLKA)
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0; // Enable pull-up on GPIO19 (SPISTEA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO16 (SPISIMOA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO17 (SPISOMIA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO18 (SPICLKA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO19 (SPISTEA)
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA
GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3; // Configure GPIO16 as SPISIMOA
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3; // Configure GPIO17 as SPISOMIA
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3; // Configure GPIO18 as SPICLKA
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA
***********************
The problem is that, once I change the SPICTL.bit.MASTER_SLAVE from 0 to 1 (to work as a master), I can see that the evrything is fine (both micros as a master, seprately of course).
But, once the second micro operates in slave mode, it gets stuck on GPIO_WritePin(19, 1).
I would really appreciate it if you help me out.
Best regards,
Mori
Mori,
There some incorrect configuration on both SPI master and SPI slave code.I have summarized them which would be useful for making corrections in your code.
Key changes to master mode code:
- Disable Loop back mode. This mode is for testing purposes only which is useful for testing SPI in standalone mode (without another SPI slave).
SpiaRegs.SPICCR.all =0x008F;
- It looks like you don't seem to be using SPI FIFO. So, make sure to disable FIFO
SpiaRegs.SPIFFTX.bit.SPIFFENA = 0;
- Enable SPIINTENA to generate INT_FLAG bit on completion of SPI transmission
SpiaRegs.SPICTL.bit.SPIINTENA = 1;
- From your code, you have configured SPI as master transmitter mode correctly
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; //Master mode
SpiaRegs.SPICTL.bit.TALK = 1; //Trasnmit mode enabled
- Change you infinite loop look as shown below
for(;;)
{
// Transmit data
spi_xmit(sdata);
while(!SpiaRegs.SPISTS.INT_FLAG); //Wait till SPI complete transmission
}
Key changes to slave mode code:
- Disable Loop back mode. This mode is for testing purposes only which is useful for testing SPI in standalone mode (without another SPI slave).
SpiaRegs.SPICCR.all =0x008F;
- Make sure to configure slave as slave receiver as shown below
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0; //Slave mode
SpiaRegs.SPICTL.bit.TALK = 0; //Receiver mode enabled
- It looks like you don't seem to be using SPI FIFO. So, make sure to disable FIFO
SpiaRegs.SPIFFTX.bit.SPIFFENA = 0; //Disable SPI FIFO
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0; //Hold SPI RX FIFO in reset
- Enable SPIINTENA to generate INT_FLAG bit on completion of SPI transmission
SpiaRegs.SPICTL.bit.SPIINTENA = 1;
- I don't understand the role of GPIO19 from your SPI slave example code.
- Wait for INT_FLAG to indicate SPI has received information
while(!SpiaRegs.SPISTS.INT_FLAG);
rdata = SpiaRegs.SPIRXBUF;
Regards,
Manoj
Dear Manoj,
Thank you so much for your help. I have gone through your comments.
It seems that still there is a problem in my code. Unfortunately, I cannot understand whether it is from the master side or the slave side.
************************************************************
Master:
sdata = 1;
for(;;)
{
// Transmit data
spi_xmit(sdata);
while(!SpiaRegs.SPISTS.bit.INT_FLAG); //Wait till SPI complete transmission
}
void error(void)
{
asm(" ESTOP0"); // Test failed!! Stop!
for (;;);
}
void spi_init()
{
SpiaRegs.SPIBRR.all =0x007F;
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
// Set reset low before configuration changes
// Clock polarity (0 == rising, 1 == falling)
// 16-bit character
// Enable loop-back
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPICHAR = (16-1);
SpiaRegs.SPICCR.bit.SPILBK = 0;
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
SpiaRegs.SPICTL.bit.SPIINTENA = 1; //Enable SPIINTENA to generate INT_FLAG bit on completion of SPI transmission
}
void spi_xmit(Uint16 a)
{
SpiaRegs.SPITXBUF=a;
}
void spi_fifo_init()
{
SpiaRegs.SPIFFTX.bit.SPIFFENA = 0;
}
Slave:
for(;;)
{
while(!SpiaRegs.SPISTS.bit.INT_FLAG);
rdata = SpiaRegs.SPIRXBUF;
}
void spi_init()
{
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;
SpiaRegs.SPICTL.bit.TALK = 0; //Receiver mode enabled
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
SpiaRegs.SPICTL.bit.SPIINTENA = 1;
// Set reset low before configuration changes
// Clock polarity (0 == rising, 1 == falling)
// 16-bit character
// Enable loop-back
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPICHAR = (16-1);
SpiaRegs.SPICCR.bit.SPILBK = 0;
SpiaRegs.SPIBRR.all =0x007F;
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb
}
//
// spi_fifo_init - Initialize SPI FIFO registers
//
void spi_fifo_init()
{
// SpiaRegs.SPIFFTX.all = 0xE040;
// SpiaRegs.SPIFFRX.all = 0x2044;
// SpiaRegs.SPIFFCT.all = 0x0;
SpiaRegs.SPIFFRX.bit.RXFFIL = 0x00; // 4:0 Interrupt level
SpiaRegs.SPIFFRX.bit.RXFFIENA =0; // 5 Interrupt enable0
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 0; // 6 Clear INT flag
SpiaRegs.SPIFFRX.bit.RXFFINT = 0; // 7 INT flag
SpiaRegs.SPIFFRX.bit.RXFFST = 0; // 12:8 FIFO status
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0; // 13 FIFO reset
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 0; // 14 Clear overflow
SpiaRegs.SPIFFRX.bit.RXFFOVF = 0; // 15 FIFO overflow
SpiaRegs.SPIFFCT.all=0x0;
}
**********************************************
It seems to me that the program get stuck on "while(!SpiaRegs.SPISTS.bit.INT_FLAG)".
Would you please tell me where is the problem?
Best regards,
Mori
Mori,
It looks like you have forgotten to set SpiaRegs.SPICCR.bit.SPISWRESET = 1. Unless you set SPISWRESET =1, SPI neither transmit (or) receive. This problem is there in both transmitter and receiver side.
I would encourage to probe oscilloscope signals to see whether SPI is transmitting.
Regards,
Manoj