Part Number: TMS320F28377S
Other Parts Discussed in Thread: TEST2, C2000WARE
Tool/software:
Hi:
I used 28377s ,spib and dma5 to read 1024 words from flash and trigger a DMA interrupt. Then continue with the next reading.
My DMA initialization code is as follows:
void sInitDma(void)
{
// refer to dma.c for the descriptions of the following functions.
//Initialize DMA
DMAInitialize();
DMA4Addr = (volatile INT16U *)Test4;
DMA5Addr = (volatile INT16U *)Test2;
DMA6Addr = (volatile INT16U *)Test1;
// configure DMACH4 for spib TX
DMACH4AddrConfig(&SpibRegs.SPITXBUF, DMA4Addr); //
DMACH4BurstConfig(7, 1, 0); // Burst size, src step, dest step
DMACH4TransferConfig(127, 1, 0); // transfer size, src step, dest step
DMACH4ModeConfig(DMA_SPIBTX,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,\
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);
// configure DMACH5 for spib RX
DMACH5AddrConfig(DMA5Addr, &SpibRegs.SPIRXBUF); //
DMACH5BurstConfig(7, 0, 1); // size, src step, dest step
DMACH5TransferConfig(127, 0, 1); // transfer size, src step, dest step
DMACH5ModeConfig(DMA_SPIBRX,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,\
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);
// configure DMA CH6 for spia TX
DMACH6AddrConfig(&SpiaRegs.SPITXBUF, DMA6Addr);
DMACH6BurstConfig(7, 1, 0);
DMACH6TransferConfig(127, 1, 0);
DMACH6ModeConfig(DMA_SPIATX,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,\
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);
// Ensure DMA is connected to Peripheral Frame 2 bridge (EALLOW protected)
EALLOW;
CpuSysRegs.SECMSEL.bit.PF2SEL = 1;
EDIS;
EALLOW;
DmaRegs.CH4.CONTROL.bit.RUN = 0;
DmaRegs.CH5.CONTROL.bit.RUN = 0;
DmaRegs.CH6.CONTROL.bit.RUN = 0;
EDIS;
//Enable DMA interrupt
PieCtrlRegs.PIEIER7.bit.INTx4 = 0; // Disable INT7.4
PieCtrlRegs.PIEIER7.bit.INTx5 = 1; // Enable PIE Group 7, INT 5 (DMA CH5)
PieCtrlRegs.PIEIER7.bit.INTx6 = 1; // Enable PIE Group 7, INT 6 (DMA CH6)
IER |= M_INT7; // Enable CPU INT6
}
My SPI FIFO initialization code is as follows:
void SpiBFifo(void)
{
INT16U m;
// FIFO configuration
SpibRegs.SPIFFCT.all=0x0; // place SPI in reset
for(m=0;m<3;m++);
SpibRegs.SPIFFRX.all=0x2040; // RX FIFO enabled, clear FIFO int
SpibRegs.SPIFFRX.bit.RXFFIL = 8; // Set RX FIFO level
SpibRegs.SPIFFTX.all=0xE040; // FIFOs enabled, TX FIFO released,
SpibRegs.SPIFFTX.bit.TXFFIL = 8; // Set TX FIFO level
// SPI configuration
SpibRegs.SPICCR.all = 0x0007;//0x000F; //Reset off, rising edge, 16-bit char bits
SpibRegs.SPICTL.all = 0x000e; //Enable master mode, delayed phase, enable talk, and SPI int disabled.
SpibRegs.SPIBRR.all = 0x0006;
SpibRegs.SPISTS.all = 0x0000;
SpibRegs.SPIPRI.bit.FREE = 0x0001; //Transmission not affected by emulator
SpibRegs.SPICCR.bit.SPISWRESET=1;
}
DMA isr:
// INT7.5
void DMAIntCh5ISR(void) // DMA Ch5
{
EALLOW; // NEED TO EXECUTE EALLOW INSIDE ISR !!!
DmaRegs.CH5.CONTROL.bit.HALT=1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP7; // ACK to receive more interrupts from this PIE group
EDIS;
}
I restart by executing halt=1 within the DMA interrupt and then RUN=1 outside the interrupt.
In most cases, it runs fine, but in the latest test, DMA has been stuck
DmaRegs.CH5.CONTROL.bit.RUNSTS keep 1, but the reception is not complete and no interrupt is generated. and SPI RXFFOVF=1.
This issue can be 100% reproduced in specific situations and appears to be unrelated to hardware. The specific register data under the conditions of running OK and running NG are as follows.




Could you please advise on the possible reasons for this issue?