Can someone explain to me the errata SSI#07 of the TM4C123x. It's shown in document SPMZ849F (link).
I'm trying to get an interrupt when the SSI is done transmitting (SSI_TXEOT). Whatever I try, I either get no interrupt, or an infinite amount of them.
Code to setup SSI0:
void PinoutSet(void) { // Enable Peripheral Clocks. MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // PA[5:2] are used for SSI0. MAP_GPIOPinConfigure(GPIO_PA2_SSI0CLK); MAP_GPIOPinConfigure(GPIO_PA3_SSI0FSS); MAP_GPIOPinConfigure(GPIO_PA4_SSI0RX); MAP_GPIOPinConfigure(GPIO_PA5_SSI0TX); MAP_GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2); }
Code to initialize SSI0:
// Enable SSI0 MAP_SysCtlPeripheralDisable(SYSCTL_PERIPH_SSI0); MAP_SysCtlPeripheralReset(SYSCTL_PERIPH_SSI0); MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); while(!MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_SSI0)); // Configure SSI, 1MHz, 8-bit data, master mode. SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_TI, SSI_MODE_MASTER, 1000000, 8); // Enable the SSI0 module. SSIEnable(SSI0_BASE); // Enable interrupts SSIIntDisable(SSI0_BASE, SSI_TXFF | SSI_RXFF | SSI_RXTO | SSI_RXOR); SSIIntClear(SSI0_BASE, SSI_TXFF | SSI_RXFF | SSI_RXTO | SSI_RXOR); HWREG(SSI0_BASE + SSI_O_CR1) |= SSI_CR1_EOT; // TX interrupt becomes EOT interrupt SSIIntEnable(SSI0_BASE, SSI_TXFF); ROM_IntEnable(INT_SSI0); ROM_IntMasterEnable();
And the interrupt handler:
void SSI0IntHandler(void) { volatile unsigned long status = 0; status = SSIIntStatus(SSI0_BASE, true); SSIIntClear(SSI0_BASE, SSI_TXFF | SSI_RXFF | SSI_RXTO | SSI_RXOR); // HWREG(SSI0_BASE + SSI_O_IM) &= ~SSI_IM_TXIM; }
When I do get an infinite amount of interrupts; status is set to 8.
Any hints/tips on getting this to work? or am I misinterpreting the errata and is this impossible?