Part Number: TMS320F28335
Other Parts Discussed in Thread: C2000WARE
Hi,
I am trying to communicate between two TMS320F28335 Microcontrollers. One is configured as a master, the other one is configured as a slave.
When I send data from master to slave, I get back two bytes of data from slave as expected. Then I get two bytes of data not as expected. It seems like the data I sent from master to slave is just stored in SPIDAT and shifted out with the next transmission of data from master to slave.
Instead I want the slave to write the next data from TXBUF to SPIDAT and to transmit this data with next communication.
Attached i send a screenshot of the communication and the code of master and slave configuration. Channel 1 is master, channel 2 is slave.
Thanks in advance!
Master configuration:
int16 init_pins_as_spi_master(Uint16 baudrate){
EALLOW;
TMC_BASE_PIO->CTL[0].PUD &= ~((Uint32)0x1<<16); //Enable pull-up on GPIO16 (SPISIMOA)
TMC_BASE_PIO->CTL[0].QSEL2 |= (0x3); // Asynch input GPIO16 (SPISIMOA)
TMC_BASE_PIO->CTL[0].MUX2 |= (0x1); // Configure GPIO16 as SPISIMOA
TMC_BASE_PIO->CTL[0].PUD &= ~((Uint32)0x1<<17); //Enable pull-up on GPIO17 (SPISOMIA)
TMC_BASE_PIO->CTL[0].QSEL2 |= (0x3<<2); // Asynch input GPIO17 (SPISOMIA)
TMC_BASE_PIO->CTL[0].MUX2 |= (0x1<<2); // Configure GPIO17 as SPISOMIA
TMC_BASE_PIO->CTL[0].PUD &= ~((Uint32)0x1<<18); //Enable pull-up on GPIO18 (SPICLKA)
TMC_BASE_PIO->CTL[0].QSEL2 |= ((Uint32)0x3<<4); // Asynch input GPIO18 (SPICLKA)
TMC_BASE_PIO->CTL[0].MUX2 |= ((Uint32)0x1<<4); // Configure GPIO18 as SPICLKA
TMC_BASE_PIO->CTL[0].PUD &= ~((Uint32)0x1<<19); //Enable pull-up on GPIO19 (SPISTEA)
TMC_BASE_PIO->CTL[0].QSEL2 |= ((Uint32)0x3<<6); // Asynch input GPIO19 (SPISTEA)
TMC_BASE_PIO->CTL[0].MUX2 |= ((Uint32)0x1<<6); // Configure GPIO19 as SPISTEA
EDIS;
//Set in Reset
TMC_BASE_SPIA->CCR &= ~(0x1<<7);
// Enable master mode, normal phase, enable talk, and SPI int disabled.
TMC_BASE_SPIA->CTL |= 0x0006; //Enable master mode & transmission
TMC_BASE_SPIA->BRR |= baudrate;
TMC_BASE_SPIA->CCR |= 0x00F; // 16 Bit word
// Initialize SPI FIFO registers
TMC_BASE_SPIA->FFRX &= ~(0x1F); // Receive
TMC_BASE_SPIA->FFRX |= (0x1); // // Set RX FIFO level to 8
TMC_BASE_SPIA->FFRX |= (0x1<<5); // Enable interrupt
TMC_BASE_SPIA->FFRX |= (0x1<<6); // Clear Interrupt Flag
TMC_BASE_SPIA->FFRX |= (0x1<<13); // Re-enable receive FIFO operation
TMC_BASE_SPIA->FFTX |= (0x1); // Set TX FIFO level to 8
TMC_BASE_SPIA->FFTX |= (0x1<<5); // Enable Interrupt
TMC_BASE_SPIA->FFTX |= (0x1<<6); // Clear Interrupt Flag
TMC_BASE_SPIA->FFTX |= (0x1<<13); // Release FIFO from reset
TMC_BASE_SPIA->FFTX |= (0x1<<14); // FIFO enhancements enabled
TMC_BASE_SPIA->FFTX |= ((Uint32)0x1<<15); // SPI FIFO resume
//Out of Reset
TMC_BASE_SPIA->CCR |= (0x1<<7); // Relinquish SPI from Reset and set char length
return 0;
}
Uint16 data=0;
int main(void)
{
Uint32 i=0;
set_system_controls();
init_pins_as_spi_master(0x0063);
while (1){
SPI_Send(0x8888);
SPI_Read(&data);
}
return 0;
}
void SPI_Send(Uint16 data){
TMC_BASE_SPIA->TXBUF=data;
TMC_BASE_SPIA->FFTX |= (0x1<<6); // Clear Interrupt Flag
}
void SPI_Read(Uint16 *data) {
*data = TMC_BASE_SPIA->RXBUF;
TMC_BASE_SPIA->FFRX |= (0x1<<6); // Clear Interrupt Flag
}
___________________________________________________________________________
slave configration:
int16 init_pins_as_spi_slave(){
EALLOW;
TMC_BASE_PIO->CTL[0].PUD &= ~((Uint32)0x1<<16); //Enable pull-up on GPIO16 (SPISIMOA)
TMC_BASE_PIO->CTL[0].QSEL2 |= (0x3); // Asynch input GPIO16 (SPISIMOA)
TMC_BASE_PIO->CTL[0].MUX2 |= (0x1); // Configure GPIO16 as SPISIMOA
TMC_BASE_PIO->CTL[0].PUD &= ~((Uint32)0x1<<17); //Enable pull-up on GPIO17 (SPISOMIA)
TMC_BASE_PIO->CTL[0].QSEL2 |= (0x3<<2); // Asynch input GPIO17 (SPISOMIA)
TMC_BASE_PIO->CTL[0].MUX2 |= (0x1<<2); // Configure GPIO17 as SPISOMIA
TMC_BASE_PIO->CTL[0].PUD &= ~((Uint32)0x1<<18); //Enable pull-up on GPIO18 (SPICLKA)
TMC_BASE_PIO->CTL[0].QSEL2 |= ((Uint32)0x3<<4); // Asynch input GPIO18 (SPICLKA)
TMC_BASE_PIO->CTL[0].MUX2 |= ((Uint32)0x1<<4); // Configure GPIO18 as SPICLKA
TMC_BASE_PIO->CTL[0].PUD &= ~((Uint32)0x1<<19); //Enable pull-up on GPIO19 (SPISTEA)
TMC_BASE_PIO->CTL[0].QSEL2 |= ((Uint32)0x3<<6); // Asynch input GPIO19 (SPISTEA)
TMC_BASE_PIO->CTL[0].MUX2 |= ((Uint32)0x1<<6); // Configure GPIO19 as SPISTEA
EDIS;
//Set in Reset
TMC_BASE_SPIA->CCR &= ~(0x1<<7);
// Enable slave
TMC_BASE_SPIA->CTL &= ~(0x0004); //disable master mode
TMC_BASE_SPIA->CTL |= (0x2); //Enable transmission
TMC_BASE_SPIA->CTL |= (0x1); //Enable interrupts
TMC_BASE_SPIA->CCR |= 0x00F; // 16 Bit word
// Initialize SPI FIFO registers
TMC_BASE_SPIA->FFRX &= ~(0x1F); // Receive
TMC_BASE_SPIA->FFRX |= (0x1); // // Set RX FIFO level to 8
TMC_BASE_SPIA->FFRX |= (0x1<<5); // Enable interrupt
TMC_BASE_SPIA->FFRX |= (0x1<<6); // Clear Interrupt Flag
TMC_BASE_SPIA->FFRX |= (0x1<<13); // Re-enable receive FIFO operation
TMC_BASE_SPIA->FFTX |= (0x1); // Set TX FIFO level to 8
TMC_BASE_SPIA->FFTX |= (0x1<<5); // Enable Interrupt
TMC_BASE_SPIA->FFTX |= (0x1<<6); // Clear Interrupt Flag
TMC_BASE_SPIA->FFTX |= (0x1<<13); // Release FIFO from reset
TMC_BASE_SPIA->FFTX |= (0x1<<14); // FIFO enhancements enabled
TMC_BASE_SPIA->FFTX |= ((Uint32)0x1<<15); // SPI FIFO resume
//Out of Reset
TMC_BASE_SPIA->CCR |= 0x0080; // Relinquish SPI from Reset and set char length
return 0;
}
void SPI_set_Interrupt_TX(void * spiTxFIFOISR){
//configure interrupt
DINT;
EALLOW;
TMC_BASE_INT_REGS->SPITXINTA = (Uint32)spiTxFIFOISR;
EDIS;
TMC_BASE_PIE->CTRL |= 0x01; //Enable PIE block
TMC_BASE_PIE->GROUP[5].IER |= 0x2; // Enable I2cInt1A in the PIE: Group 6 interrupt 2
IER |= 0x0020;
EINT;
}
void SPI_set_Interrupt_RX(void * spiRxFIFOISR){
//configure interrupt
DINT;
EALLOW;
TMC_BASE_INT_REGS->SPIRXINTA = (Uint32)spiRxFIFOISR;
EDIS;
TMC_BASE_PIE->CTRL |= 0x01; //Enable PIE block
TMC_BASE_PIE->GROUP[5].IER |= 0x1; // Enable I2cInt1A in the PIE: Group 6 interrupt 1
IER |= 0x0020;
EINT;
}
void interrupt_ack_spi(){
// Acknowledge interrupt to get more from group all interrupt groups
TMC_BASE_PIE->ACK |= 0xFFFF;
}
__interrupt void spiRxFIFOISR(void);
__interrupt void spiTxFIFOISR(void);
Uint16 z=0;
Uint16 data=0x0000;
int main(void)
{
Uint32 i=0;
set_system_controls();
init_pins_as_spi_slave();
SPI_set_Interrupt_RX(&spiRxFIFOISR);
SPI_set_Interrupt_TX(&spiRxFIFOISR);
while (1){
}
return 0;
}
__interrupt void spiRxFIFOISR(void){
SPI_Read(&z);
interrupt_ack_spi();
}
__interrupt void spiTxFIFOISR(void){
SPI_Send(data);
interrupt_ack_spi();
}

