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.