Hi,
I'm porting the code from Cortex-M3 to TM4C129X evaluation board.
I'm trying to send data to the flash using uDMA.
the uDMA seems to be working (I can see the clock on the scope), but the interrupt is not triggering (does not go to the SSI3_Handler).
I copied a large section of the code from the example file C:\ti\TivaWare_C_Series-2.1.0.12573\utils\spi_flash.c.
It must be something very simple, but I'm not able to find it.
Please help.
I'm attaching sections of the code below.
void SSI_Init(void)
{
SSIConfigSetExpClk( SSI3_BASE,
gSysCtlClock,
SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER,
SSI_FLASH_BIT_RATE,
SSI_FLASH_WORD_SIZE);
//Enable the SSI
SSIEnable(SSI3_BASE);
// disable all interrupt
SSIIntDisable(SSI3_BASE,SSI_TXEOT | //transmit fifo is empty
SSI_DMATX | //DMA Transmit complete
SSI_DMARX | //DMA Receive complete
SSI_TXFF | //TX FIFO half full or less
SSI_RXFF | //RX FIFO half full or more
SSI_RXTO | //rx timeout
SSI_RXOR); //rx error
}
void SSIFlash_uDMA_Start(void){
// Configure the DMA channel
uDMAChannelAssign(UDMA_CH15_SSI3TX);
uDMAChannelAttributeDisable(UDMA_CH15_SSI3TX,
UDMA_ATTR_ALL);
// Disable the transmit uDMA channel
uDMAChannelDisable(UDMA_CH15_SSI3TX);
// Configure the DMA TX channel
uDMAChannelAttributeEnable( UDMA_CH15_SSI3TX,
UDMA_ATTR_USEBURST);
uDMAChannelControlSet( UDMA_CH15_SSI3TX,
UDMA_SIZE_8 |
UDMA_SRC_INC_8 |
UDMA_DST_INC_NONE |
UDMA_ARB_4);
}
void SSIFlash_uDMA_Write(void, uint32_t u32Address, uint32_t u32Length, uint8_t *pu8Src){
// Enable uDMA transmit complete
SSIIntClear (SSI3_BASE, SSI_DMATX);
SSIIntEnable(SSI3_BASE, SSI_DMATX);
SSIDMAEnable(SSI3_BASE, SSI_DMA_TX);
//start uDMA
uDMAChannelTransferSet( UDMA_CH15_SSI3TX,
UDMA_MODE_BASIC,
(void *) pu8Src,
(void *)(u32BaseAddress + SSI_O_DR),
u32Length);
uDMAChannelEnable(UDMA_CH15_SSI3TX);
}
void SSIFlash_uDMA_Stop(void){
//disable uDMA
SSIDMADisable(SSI3_BASE,SSI_DMA_TX |
SSI_DMA_RX);
//disable interrupt
SSIIntDisable(SSI3_BASE,SSI_TXEOT | //transmit fifo is empty
SSI_DMATX | //DMA Transmit complete
SSI_DMARX | //DMA Receive complete
SSI_TXFF | //TX FIFO half full or less
SSI_RXFF | //RX FIFO half full or more
SSI_RXTO | //rx timeout
SSI_RXOR); //rx error
}
void SSI3_Handler(void) {
uint32_t IntStatus;
uint32_t uDMAModeTx;
// Read and Clear the interrupt.
IntStatus = SSIIntStatus(SSI3_BASE, TRUE);
SSIIntClear(SSI3_BASE, IntStatus);
//check for Tx done
if(IntStatus & SSI_DMATX) {
uDMAModeTx = uDMAChannelModeGet(dmaChannelTx);
//clear the uDMA Transmit complete bit
SSIDMADisable(baseAddress, SSI_DMA_TX);
SSIIntClear(baseAddress, SSI_DMATX);
if(uDMAModeTx == UDMA_MODE_STOP) {
//signal to the upper layer that the transmfer has finished
}
}
}
thanks.
Khaled.






