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.

SPI chip select timing on TMS570LS20216-EP

Other Parts Discussed in Thread: TMS570LS20216-EP

Hello All,

I'm using the SPI5 on a TMS570LS20216-EP to send three bytes to an SPI DAC.

I set the bytes with an 'spiSetData' then initiate the transfer with 'spiTransfer'.

What I see on the chip select line and clock is a transfer of three bytes, but inbetween each byte the chip select briefly returns high. I was expecting to see the chip select low for the three byte transfer.

I've attached a scope capture that shows the chip select line and clock.

The initialisation code for SPI5 is also shown below.

Am I doing anything wrong in my initialisation?

/** bring SPI out of reset */
spiREG5->GCR0 = 1U;

/** enable SPI5 multibuffered mode and enable buffer RAM */
spiREG5->MIBSPIE = (spiREG5->MIBSPIE & 0xFFFFFFFEU) | 1U;

/** SPI5 master mode and clock configuration */
spiREG5->GCR1 = (spiREG5->GCR1 & 0xFFFFFFFCU) | ((1U << 1U) /* CLOKMOD */
| 1U); /* MASTER */

/** SPI5 enable pin configuration */
spiREG5->INT0 = (spiREG5->INT0 & 0xFEFFFFFFU) |(0U << 24U); /* ENABLE HIGHZ */

/** - Delays */
spiREG5->DELAY = (1U << 24U) /* C2TDELAY */
| (1U << 16U) /* T2CDELAY */
| (0U << 8U) /* T2EDELAY */
| 0U; /* C2EDELAY */

/** - Data Format 0 */
spiREG5->FMT0 = (0U << 24U) /* wdelay */
| (0U << 23U) /* parity Polarity */
| (0U << 22U) /* parity enable */
| (0U << 21U) /* wait on enable */
| (0U << 20U) /* shift direction */
| (0U << 17U) /* clock polarity */
| (0U << 16U) /* clock phase */
| (79U << 8U) /* baudrate prescale */
| 16U; /* data word length */

/** - Data Format 1 */
spiREG5->FMT1 = (0U << 24U) /* wdelay */
| (0U << 23U) /* parity Polarity */
| (0U << 22U) /* parity enable */
| (0U << 21U) /* wait on enable */
| (0U << 20U) /* shift direction */
| (0U << 17U) /* clock polarity */
| (0U << 16U) /* clock phase */
| (79U << 8U) /* baudrate prescale */
| 16U; /* data word length */

/** - Data Format 2 */
spiREG5->FMT2 = (0U << 24U) /* wdelay */
| (0U << 23U) /* parity Polarity */
| (0U << 22U) /* parity enable */
| (0U << 21U) /* wait on enable */
| (0U << 20U) /* shift direction */
| (0U << 17U) /* clock polarity */
| (0U << 16U) /* clock phase */
| (79U << 8U) /* baudrate prescale */
| 16U; /* data word length */

/** - Data Format 3 */
spiREG5->FMT3 = (0U << 24U) /* wdelay */
| (0U << 23U) /* parity Polarity */
| (0U << 22U) /* parity enable */
| (0U << 21U) /* wait on enable */
| (0U << 20U) /* shift direction */
| (0U << 17U) /* clock polarity */
| (0U << 16U) /* clock phase */
| (79U << 8U) /* baudrate prescale */
| 16U; /* data word length */

/** - wait for buffer initialization complete before accessing MibSPI registers */
while ((spiREG5->FLG & 0x01000000U) != 0U)
{
} /* Wait */

/** - initialize transfer groups */
spiREG5->TGCTRL[0U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| (0U << 8U); /* start buffer */

spiREG5->TGCTRL[1U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| (3U << 8U); /* start buffer */

spiREG5->TGCTRL[2U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| ((3U+0U) << 8U); /* start buffer */

spiREG5->TGCTRL[3U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| ((3U+0U+0U) << 8U); /* start buffer */

spiREG5->TGCTRL[4U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| ((3U+0U+0U+0U) << 8U); /* start buffer */

spiREG5->TGCTRL[5U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| ((3U+0U+0U+0U+0U) << 8U); /* start buffer */

spiREG5->TGCTRL[6U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| ((3U+0U+0U+0U+0U+0U) << 8U); /* start buffer */

spiREG5->TGCTRL[7U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| ((3U+0U+0U+0U+0U+0U+0U) << 8U); /* start buffer */


spiREG5->TGCTRL[8U] = (3U+0U+0U+0U+0U+0U+0U+0U) << 8U;

spiREG5->LTGPEND = (spiREG5->LTGPEND & 0xFFFF00FFU) | (((8U+0U+0U+0U+0U+0U+0U+0U)-1U) << 8U);

/** - initialize buffer ram */
{ i = 0U;

if (8U > 0U)
{
while (i < (8U-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_0; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_0; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_1; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_1; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_2; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_2; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U+0U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_3; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_3; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U+0U+0U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_4; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_4; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U+0U+0U+0U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_5; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_5; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U+0U+0U+0U+0U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_6; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_6; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U+0U+0U+0U+0U+0U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_7; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_7; /* chip select */
}
}

/** - set interrupt levels */
spiREG5->LVL = (0U << 9U) /* TXINT */
| (0U << 8U) /* RXINT */
| (0U << 6U) /* OVRNINT */
| (0U << 4U) /* BITERR */
| (0U << 3U) /* DESYNC */
| (0U << 2U) /* PARERR */
| (0U << 1U) /* TIMEOUT */
| (0U); /* DLENERR */

/** - clear any pending interrupts */
spiREG5->FLG |= 0xFFFFU;

/** - enable interrupts */
spiREG5->INT0 = (spiREG5->INT0 & 0xFFFF0000U)
| (0U << 9U) /* TXINT */
| (0U << 8U) /* RXINT */
| (0U << 6U) /* OVRNINT */
| (0U << 4U) /* BITERR */
| (0U << 3U) /* DESYNC */
| (0U << 2U) /* PARERR */
| (0U << 1U) /* TIMEOUT */
| (0U); /* DLENERR */

/** @b initialize @b SPI5 @b Port */

/** - SPI5 Port output values */
spiREG5->PCDOUT = 0U /* SCS[0] */
| (0U << 1U) /* SCS[1] */
| (0U << 2U) /* SCS[2] */
| (0U << 3U) /* SCS[3] */
| (0U << 8U) /* ENA */
| (0U << 9U) /* CLK */
| (0U << 10U) /* SIMO */
| (0U << 11U); /* SOMI */

/** - SPI5 Port direction */
spiREG5->PCDIR = 1U /* SCS[0] */
| (1U << 1U) /* SCS[1] */
| (1U << 2U) /* SCS[2] */
| (1U << 3U) /* SCS[3] */
| (0U << 8U) /* ENA */
| (1U << 9U) /* CLK */
| (1U << 10U) /* SIMO */
| (0U << 11U); /* SOMI */

/** - SPI5 Port open drain enable */
spiREG5->PCPDR = 0U /* SCS[0] */
| (0U << 1U) /* SCS[1] */
| (0U << 2U) /* SCS[2] */
| (0U << 3U) /* SCS[3] */
| (0U << 8U) /* ENA */
| (0U << 9U) /* CLK */
| (0U << 10U) /* SIMO */
| (0U << 11U); /* SOMI */

/** - SPI5 Port pullup / pulldown selection */
spiREG5->PCPSL = 1U /* SCS[0] */
| (1U << 1U) /* SCS[1] */
| (1U << 2U) /* SCS[2] */
| (1U << 3U) /* SCS[3] */
| (1U << 8U) /* ENA */
| (1U << 9U) /* CLK */
| (1U << 10U) /* SIMO */
| (1U << 11U); /* SOMI */

/** - SPI5 Port pullup / pulldown enable*/
spiREG5->PCDIS = 0U /* SCS[0] */
| (0U << 1U) /* SCS[1] */
| (0U << 2U) /* SCS[2] */
| (0U << 3U) /* SCS[3] */
| (0U << 8U) /* ENA */
| (0U << 9U) /* CLK */
| (0U << 10U) /* SIMO */
| (0U << 11U); /* SOMI */

/* SPI5 set all pins to functional */
spiREG5->PCFUN = 1U /* SCS[0] */
| (1U << 1U) /* SCS[1] */
| (1U << 2U) /* SCS[2] */
| (1U << 3U) /* SCS[3] */
| (1U << 8U) /* ENA */
| (1U << 9U) /* CLK */
| (1U << 10U) /* SIMO */
| (1U << 11U); /* SOMI */



/** - Finally start SPI5 */
spiREG5->GCR1 = (spiREG5->GCR1 & 0xFEFFFFFFU) | (1U << 24U);

/** bring SPI out of reset */
spiREG5->GCR0 = 1U;

/** enable SPI5 multibuffered mode and enable buffer RAM */
spiREG5->MIBSPIE = (spiREG5->MIBSPIE & 0xFFFFFFFEU) | 1U;

/** SPI5 master mode and clock configuration */
spiREG5->GCR1 = (spiREG5->GCR1 & 0xFFFFFFFCU) | ((1U << 1U) /* CLOKMOD */
| 1U); /* MASTER */

/** SPI5 enable pin configuration */
spiREG5->INT0 = (spiREG5->INT0 & 0xFEFFFFFFU) |(0U << 24U); /* ENABLE HIGHZ */

/** - Delays */
spiREG5->DELAY = (1U << 24U) /* C2TDELAY */
| (1U << 16U) /* T2CDELAY */
| (0U << 8U) /* T2EDELAY */
| 0U; /* C2EDELAY */

/** - Data Format 0 */
spiREG5->FMT0 = (0U << 24U) /* wdelay */
| (0U << 23U) /* parity Polarity */
| (0U << 22U) /* parity enable */
| (0U << 21U) /* wait on enable */
| (0U << 20U) /* shift direction */
| (0U << 17U) /* clock polarity */
| (0U << 16U) /* clock phase */
| (79U << 8U) /* baudrate prescale */
| 16U; /* data word length */

/** - Data Format 1 */
spiREG5->FMT1 = (0U << 24U) /* wdelay */
| (0U << 23U) /* parity Polarity */
| (0U << 22U) /* parity enable */
| (0U << 21U) /* wait on enable */
| (0U << 20U) /* shift direction */
| (0U << 17U) /* clock polarity */
| (0U << 16U) /* clock phase */
| (79U << 8U) /* baudrate prescale */
| 16U; /* data word length */

/** - Data Format 2 */
spiREG5->FMT2 = (0U << 24U) /* wdelay */
| (0U << 23U) /* parity Polarity */
| (0U << 22U) /* parity enable */
| (0U << 21U) /* wait on enable */
| (0U << 20U) /* shift direction */
| (0U << 17U) /* clock polarity */
| (0U << 16U) /* clock phase */
| (79U << 8U) /* baudrate prescale */
| 16U; /* data word length */

/** - Data Format 3 */
spiREG5->FMT3 = (0U << 24U) /* wdelay */
| (0U << 23U) /* parity Polarity */
| (0U << 22U) /* parity enable */
| (0U << 21U) /* wait on enable */
| (0U << 20U) /* shift direction */
| (0U << 17U) /* clock polarity */
| (0U << 16U) /* clock phase */
| (79U << 8U) /* baudrate prescale */
| 16U; /* data word length */

/** - wait for buffer initialization complete before accessing MibSPI registers */
while ((spiREG5->FLG & 0x01000000U) != 0U)
{
} /* Wait */

/** - initialize transfer groups */
spiREG5->TGCTRL[0U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| (0U << 8U); /* start buffer */

spiREG5->TGCTRL[1U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| (3U << 8U); /* start buffer */

spiREG5->TGCTRL[2U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| ((3U+0U) << 8U); /* start buffer */

spiREG5->TGCTRL[3U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| ((3U+0U+0U) << 8U); /* start buffer */

spiREG5->TGCTRL[4U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| ((3U+0U+0U+0U) << 8U); /* start buffer */

spiREG5->TGCTRL[5U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| ((3U+0U+0U+0U+0U) << 8U); /* start buffer */

spiREG5->TGCTRL[6U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| ((3U+0U+0U+0U+0U+0U) << 8U); /* start buffer */

spiREG5->TGCTRL[7U] = (1U << 30U) /* oneshot */
| (0U << 29U) /* pcurrent reset */
| (TRG_ALWAYS << 20U) /* trigger event */
| (TRG_DISABLED << 16U) /* trigger source */
| ((3U+0U+0U+0U+0U+0U+0U) << 8U); /* start buffer */


spiREG5->TGCTRL[8U] = (3U+0U+0U+0U+0U+0U+0U+0U) << 8U;

spiREG5->LTGPEND = (spiREG5->LTGPEND & 0xFFFF00FFU) | (((8U+0U+0U+0U+0U+0U+0U+0U)-1U) << 8U);

/** - initialize buffer ram */
{ i = 0U;

if (8U > 0U)
{
while (i < (8U-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_0; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_0; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_1; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_1; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_2; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_2; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U+0U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_3; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_3; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U+0U+0U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_4; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_4; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U+0U+0U+0U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_5; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_5; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U+0U+0U+0U+0U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_6; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_6; /* chip select */
}
if (0U > 0U)
{
while (i < ((8U+0U+0U+0U+0U+0U+0U+0U)-1U))
{
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (1 << 12) /* hold chip select */
| (0U << 11U) /* lock transmission */
| (0U << 8U) /* data format */
| CS_7; /* chip select */
}
spiRAM5->tx[i++].control = (4U << 13U) /* buffer mode */
| (0U << 12U) /* chip select hold */
| (0U << 10U) /* enable WDELAY */
| (0U << 8U) /* data format */
| CS_7; /* chip select */
}
}

/** - set interrupt levels */
spiREG5->LVL = (0U << 9U) /* TXINT */
| (0U << 8U) /* RXINT */
| (0U << 6U) /* OVRNINT */
| (0U << 4U) /* BITERR */
| (0U << 3U) /* DESYNC */
| (0U << 2U) /* PARERR */
| (0U << 1U) /* TIMEOUT */
| (0U); /* DLENERR */

/** - clear any pending interrupts */
spiREG5->FLG |= 0xFFFFU;

/** - enable interrupts */
spiREG5->INT0 = (spiREG5->INT0 & 0xFFFF0000U)
| (0U << 9U) /* TXINT */
| (0U << 8U) /* RXINT */
| (0U << 6U) /* OVRNINT */
| (0U << 4U) /* BITERR */
| (0U << 3U) /* DESYNC */
| (0U << 2U) /* PARERR */
| (0U << 1U) /* TIMEOUT */
| (0U); /* DLENERR */

/** @b initialize @b SPI5 @b Port */

/** - SPI5 Port output values */
spiREG5->PCDOUT = 0U /* SCS[0] */
| (0U << 1U) /* SCS[1] */
| (0U << 2U) /* SCS[2] */
| (0U << 3U) /* SCS[3] */
| (0U << 8U) /* ENA */
| (0U << 9U) /* CLK */
| (0U << 10U) /* SIMO */
| (0U << 11U); /* SOMI */

/** - SPI5 Port direction */
spiREG5->PCDIR = 1U /* SCS[0] */
| (1U << 1U) /* SCS[1] */
| (1U << 2U) /* SCS[2] */
| (1U << 3U) /* SCS[3] */
| (0U << 8U) /* ENA */
| (1U << 9U) /* CLK */
| (1U << 10U) /* SIMO */
| (0U << 11U); /* SOMI */

/** - SPI5 Port open drain enable */
spiREG5->PCPDR = 0U /* SCS[0] */
| (0U << 1U) /* SCS[1] */
| (0U << 2U) /* SCS[2] */
| (0U << 3U) /* SCS[3] */
| (0U << 8U) /* ENA */
| (0U << 9U) /* CLK */
| (0U << 10U) /* SIMO */
| (0U << 11U); /* SOMI */

/** - SPI5 Port pullup / pulldown selection */
spiREG5->PCPSL = 1U /* SCS[0] */
| (1U << 1U) /* SCS[1] */
| (1U << 2U) /* SCS[2] */
| (1U << 3U) /* SCS[3] */
| (1U << 8U) /* ENA */
| (1U << 9U) /* CLK */
| (1U << 10U) /* SIMO */
| (1U << 11U); /* SOMI */

/** - SPI5 Port pullup / pulldown enable*/
spiREG5->PCDIS = 0U /* SCS[0] */
| (0U << 1U) /* SCS[1] */
| (0U << 2U) /* SCS[2] */
| (0U << 3U) /* SCS[3] */
| (0U << 8U) /* ENA */
| (0U << 9U) /* CLK */
| (0U << 10U) /* SIMO */
| (0U << 11U); /* SOMI */

/* SPI5 set all pins to functional */
spiREG5->PCFUN = 1U /* SCS[0] */
| (1U << 1U) /* SCS[1] */
| (1U << 2U) /* SCS[2] */
| (1U << 3U) /* SCS[3] */
| (1U << 8U) /* ENA */
| (1U << 9U) /* CLK */
| (1U << 10U) /* SIMO */
| (1U << 11U); /* SOMI */



/** - Finally start SPI5 */
spiREG5->GCR1 = (spiREG5->GCR1 & 0xFEFFFFFFU) | (1U << 24U);

  • Hello Ian,

    There is a CSHOLD bit that you can set to keep the CS active throughout the transfers. Please refer to the TRM for details. Give it a try and see if it makes a difference.
  • Thanks for the pointer.
    I read the CSHOLD section in the TRM, confusing at first. It mentions holding the chip select at the the 'end of transfer', I first thought this was the end of the transfer group.
    Then realised that it was the end of each word transferred.
    So in a 3 word transfer, I set CSHOLD on word 1 and 2, but cleared on word 3.
    This now works the way I was trying to get it to originally.
    Thanks.