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.

Piccolo 28069 SPI driver (16-bits data transfer)



Hi,

We work with SPI driver that has the following configuration:

 SPI_TX_READY,SpiaRegs.SPICCR.bit.SPISWRESET = 0
SpiaRegs.SPICCR.bit.CLKPOLARITY=1
SpiaRegs.SPICCR.bit.SPICHAR=16
SpiaRegs.SPICCR.bit.SPILBK=0
SpiaRegs.SPICTL.bit.OVERRUNINTENA =0
SpiaRegs.SPICTL.bit.CLK_PHASE=0
SpiaRegs.SPICTL.bit.MASTER_SLAVE=1
SpiaRegs.SPICTL.bit.TALK=1,
SpiaRegs.SPICTL.bit.SPIINTENA=0,
SpiaRegs.SPIBRR=19
     SPI_INTERRUPT_DISABLE,
 SpiaRegs.SPIPRI.bit.FREE = 1; 
 SpiaRegs.SPIPRI.bit.SOFT =0

and transfer via spi each time 32bits:
write: 8bits-commandWrite+8-bits address+16bits data
read:8bits-commandRead+ 8-bits address+16bits dummy data and here we read 16bit-data

Read doesn't work stable. sometimes chipSelect is down after 16 bits and not after 32 bits.
In the Write command it ChipSelect work property: down after 32 bits always.


what could be the reason of this problem?

void CSPIInterface::spi_fifo_init()
{
  SpiaRegs.SPIFFCT.all=0xFF;
 SpiaRegs.SPIFFTX.bit.SPIRST = 1; 
 SpiaRegs.SPIFFTX.bit.TXFIFO = 1;
 SpiaRegs.SPIFFTX.bit.TXFFINTCLR  = 0
 SpiaRegs.SPIFFTX.bit.TXFFIENA  = 1; 
SpiaRegs.SPIFFTX.bit.TXFFIL  = 4;
  SpiaRegs.SPIFFRX.bit.RXFIFORESET  = 1
 SpiaRegs.SPIFFRX.bit.RXFFINTCLR  = 0
 SpiaRegs.SPIFFRX.bit.RXFFIENA = 1;
SpiaRegs.SPIFFTX.bit.RXFFIENA  = 1; 
SpiaRegs.SPIFFTX.bit.RXFFIL  = 4;
}

void spi_transmit_and_wait(Uint16 data)
{
  SpiaRegs.SPICTL.bit.TALK = 1; // Enable Transmit path
 SpiaRegs.SPITXBUF = data; // Master transmits data
 while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG !=0) {} // Waits until data rx’d
 }

Uint16 spi_receive_and_wait(void)
{
 Uint16 rdata = 0; Uint16 dummy = 0; Uint16 i = 0;
 SpiaRegs.SPITXBUF = dummy; // Send dummy to start tx
 for (i =0; i< 100; i++)
 {
   if(SpiaRegs.SPIFFRX.bit.RXFFST > 0)
   {
     break;
   }
 }
 rdata = SpiaRegs.SPIRXBUF;
 return rdata;
}

Uint16 TransmitSpiMessage2Words(Uint16 *Buff)
{
  spi_transmit_and_wait(Buff[0]);
  spi_transmit_and_wait(Buff[1]);
   return NO_ERROR;
}


Uint16 ReceiveSpiMessage1Words(Uint16 *Buff)
{
 spi_transmit_and_wait(Buff[0]);
 Buff[1] = spi_receive_and_wait();
 return NO_ERROR;
}

Could you please help usto solve this problem?

thanks,Sabina