I'm using a TM4C1294NCPDT and trying to send more than 16 bits on SPI while the chip select is low. I have SSI0Fss acting as the chip select output, and while it briefly pulses high before the start of transmission, it remains low after all data has been sent. I know I can manually control chip select but prefer not to do this.
From what I understand, SSIAdvDataPutFrameEnd() should signify the end of a frame and pull SSI0Fss high. It doesn't. I see all transmitted data on my scope, however. I've tried various combinations of initialization with no change. SPI is conceptually simple but it seems to be such an exercise each time I set it up on a new chip!
Code is below.
g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 48000000); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); GPIOPinConfigure(GPIO_PA2_SSI0CLK); GPIOPinConfigure(GPIO_PA3_SSI0FSS); GPIOPinConfigure(GPIO_PA4_SSI0XDAT0); GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2); SSIConfigSetExpClk(SSI0_BASE, 48000000, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 2000000, 16); SSIAdvModeSet(SSI0_BASE, SSI_ADV_MODE_READ_WRITE); SSIAdvFrameHoldEnable(SSI0_BASE); SSIEnable(SSI0_BASE); SSIDataPutNonBlocking(SSI0_BASE, 0x1111); SSIDataPutNonBlocking(SSI0_BASE, 0x2222); SSIDataPutNonBlocking(SSI0_BASE, 0x3333); SSIDataPutNonBlocking(SSI0_BASE, 0x4444); SSIDataPutNonBlocking(SSI0_BASE, 0x5555); SSIDataPutNonBlocking(SSI0_BASE, 0x6666); SSIDataPutNonBlocking(SSI0_BASE, 0x7777); SSIDataPutNonBlocking(SSI0_BASE, 0x8888); SSIAdvDataPutFrameEnd(SSI0_BASE, 0x9999);