I use SSI with uDMA.
When the primary channel is finished there is one interrupt, when the alternativly channel is finished there are 2 interrupts.
At this time no primary channel is started anymore.
Why is it like this?
My Hardware Config:
void init_SSI0_TO_GPIO_PA5() { // enable SSI1 Tx PA5 only MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); while(!MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_SSI0)); // port config MAP_GPIOPinConfigure(GPIO_PA5_SSI0TX); MAP_GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5); MAP_GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); // SSI config MAP_IntDisable(INT_SSI0); MAP_SSIIntDisable(SSI0_BASE, SSI_TXFF | SSI_RXFF | SSI_RXTO | SSI_RXOR); MAP_SSIDisable(SSI0_BASE); MAP_SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_1, SSI_MODE_MASTER, SSI_CLOCK, 8); // ------------------ // // Priority Levels // Priority 4 = 0xE0 ->lower // Priority 3 = 0x60 // Priority 2 = 0x20 // Priority 1 = 0x00 ->higher // ------------------ // MAP_IntPrioritySet(INT_SSI0, 0x00); // Priority 1 !!! MAP_IntEnable(INT_SSI0); MAP_SSIEnable(SSI0_BASE); } void init_uDMA() { MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); while(!MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_UDMA)); // general uDMA setup MAP_uDMAEnable(); MAP_SysCtlDelay(10); // declare controltable MAP_uDMAControlBaseSet(uDMAControlTable); MAP_SysCtlDelay(10); MAP_IntEnable(INT_UDMAERR); init_uDMA_CH11_SSI0(); init_uDMA_CH25_SSI1(); init_uDMA_CH13_SSI2(); init_uDMA_CH15_SSI3(); init_uDMA_CH6_CH7_UART5(); } void init_uDMA_CH11_SSI0() { // uDMA Channel 11 enc 0 MAP_SSIDMADisable(SSI0_BASE, SSI_DMA_RX | SSI_DMA_TX); MAP_uDMAChannelAssign(UDMA_CH11_SSI0TX); MAP_uDMAChannelAttributeDisable(11, UDMA_ATTR_ALTSELECT | UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK | UDMA_ATTR_USEBURST); MAP_uDMAChannelControlSet(11 | UDMA_PRI_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_4); MAP_uDMAChannelControlSet(11 | UDMA_ALT_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_4); MAP_uDMAChannelAttributeEnable(11, UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORITY); MAP_SSIDMAEnable(SSI0_BASE, SSI_DMA_TX); MAP_SSIEnable(SSI0_BASE); } void uDMASSI0IntHandler(void) { #ifdef DEBUG_GPIO DEBUG_PA7 = GPIO_PIN_7; // CH05 INTLED0 #endif MAP_SSIIntClear(SSI0_BASE, SSI_RXTO | SSI_RXOR); MAP_uDMAIntClear(11); if (MAP_uDMAChannelModeGet(11 | UDMA_PRI_SELECT) == UDMA_MODE_STOP) { uDMABufferStateSSI0_PRI = EMPTY; } if (MAP_uDMAChannelModeGet(11 | UDMA_ALT_SELECT) == UDMA_MODE_STOP) { uDMABufferStateSSI0_ALT = EMPTY; } #ifdef DEBUG_GPIO DEBUG_PA7 = 0; // CH05 INTLED0 #endif } void start_uDMA_SSI0() { MAP_uDMAChannelTransferSet(11 | UDMA_PRI_SELECT, UDMA_MODE_PINGPONG, &uDMABufferSSI0_PRI, (void *)(SSI0_BASE + SSI_O_DR), SSI_TRANSFERSIZE); MAP_uDMAChannelEnable(11 | UDMA_PRI_SELECT); uDMABufferStateSSI0_PRI = EMPTYING; uDMABufferModeSSI0 = PONG; MAP_uDMAChannelTransferSet(11 | UDMA_ALT_SELECT, UDMA_MODE_PINGPONG, &uDMABufferSSI0_ALT, (void *)(SSI0_BASE + SSI_O_DR), SSI_TRANSFERSIZE); MAP_uDMAChannelEnable(11 | UDMA_ALT_SELECT); uDMABufferStateSSI0_ALT = EMPTYING; uDMABufferModeSSI0 = PING; }