MPC5748G SPI DMA transmit data issue

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

MPC5748G SPI DMA transmit data issue

380 Views
liuyang201666
Contributor II
hello ! my spi as master, and I want use spi dma to commincation . But I get a issue, the spi is stop after send a byte data, , i must to write EDMA.SSRT.R = 16 to make it run again. can you help me , what should i do? Thanks Very much! The code as below: int main(void) { unsigned int i = 0; unsigned int SSRTCnt = 0; unsigned int CSRStart = 0; unsigned int CSRActive = 0; unsigned int j = 0; unsigned int lastCTCNT = 0; xcptn_xmpl (); /* Configure and Enable Interrupts */ peri_clock_gating(); /* Configures gating/enabling peripheral(SPI, DSPI, DMAMUX) clocks for modes */ /* Configuration occurs after mode transition */ system160mhz(); /* sysclk=160MHz, dividers configured, mode trans */ bridges_config(); /* Configures PBridge(s) access rights and priorities */ crossbar_config_DMA_highest(); /* PBridges, flash port 2: DMA highest priority */ init_dma_mux(); /* DMA MUX for SPI_0 Slave */ init_edma_tcd_0(); /* DMA Channel for SPI_0 Slave */ init_edma_tcd_16(); /* DMA Channel for DSPI_3 Master */ init_edma_channel_arbitration(); /* DMA Channel priorities */ init_spi_0(); /* Initialize SPI_0 as Slave SPI and initialize CTAR0 */ init_dspi_3(); /* Initialize DSPI_3 as master SPI and initialize CTAR0 */ init_spi_ports(); /* DSPI_3 Master, SPI_0 Slave */ initLINFlexD_2(80, 115200 );/* Initialize LINFlex2: UART Mode 80MHz, 57600 Baud */ testLINFlexD_2(); DSPI_3.MCR.B.HALT = 0x0; /* Exit HALT mode: go from STOPPED */ /* to RUNNING state to start transfers */ EDMA.SERQ.R = 0; /* Enable EDMA channel 16 SPI_0 RX */ EDMA.SERQ.R = 16; /* Enable EDMA channel 17 DSPI_3 TX*/ while( DSPI_3.SR.B.EOQF != 1 ){} /* Wait until the End Of DSPI Queue: */ while( 1 ) { if(recMask) { recMask = 0; memset(&ReceiveBuffer[0], 0, NUMBER_OF_BYTES); for(j = 0; j < 0x1000000; j++) { ; } // EDMA.SSRT.R = 0; /* Set channel 0 START bit again for next minor loop */ init_edma_tcd_0_reInit(); init_edma_tcd_16_reInit(); } } void init_edma_tcd_0() /* This is for SPI_0 Receive */ { /* SADDR Note: 1 byte is transferred in this TCD on each DMA request (minor loop). */ /* The byte is 4th one in the 32-bit POPR register. */ /* Therefore a +3 byte offset is added to POPR address for the source address SADDR */ EDMA.TCD[0].SADDR.R = ((unsigned int)&SPI_0.POPR.R) + 3; /* Load address of source data */ EDMA.TCD[0].ATTR.B.SSIZE = 0; /* Read 2**0 = 1 byte per transfer */ EDMA.TCD[0].ATTR.B.SMOD = 0; /* Source modulo feature not used */ EDMA.TCD[0].SOFF.R = 0; /* After transfer, add 0 to src addr */ EDMA.TCD[0].SLAST.R = 0; /* No addr adjustment after major loops */ EDMA.TCD[0].DADDR.R = (unsigned int)&ReceiveBuffer; /* Destination address */ EDMA.TCD[0].ATTR.B.DSIZE = 0; /* Write 2**0 = 1 byte per transfer */ EDMA.TCD[0].ATTR.B.DMOD = 0; /* Destination modulo feature not used */ EDMA.TCD[0].DOFF.R = 1; /* Increment destination addr by 1 */ /* If repeating major loop, subtract NUMBER_OF_BYTES from dest. addr. */ EDMA.TCD[0].DLASTSGA.R = 0; /* No addr adjustment after major loop */ /* If repeating major loop, set this to 0 to keep the channel enabled */ EDMA.TCD[0].CSR.B.DREQ = 1; /* Disable channel when major loop is done*/ EDMA.TCD[0].NBYTES.MLNO.R = 1; /* NBYTES - Transfer 1 byte per minor loop */ EDMA.TCD[0].CITER.ELINKNO.B.ELINK = 0; /* No Enabling channel LINKing */ EDMA.TCD[0].CITER.ELINKNO.B.CITER = NUMBER_OF_BYTES; /* Init. current interaction count */ EDMA.TCD[0].BITER.ELINKNO.B.ELINK = 0; /* No Enabling channel LINKing */ EDMA.TCD[0].BITER.ELINKNO.B.BITER = NUMBER_OF_BYTES; /* Minor loop iterations */ EDMA.TCD[0].CSR.B.MAJORELINK = 0; /* Dynamic program is not used */ EDMA.TCD[0].CSR.B.ESG = 0; /* Scatter Gather not Enabled */ EDMA.TCD[0].CSR.B.BWC = 0; /* Default bandwidth control- no stalls */ EDMA.TCD[0].CSR.B.INTHALF = 0; /* No interrupt when major count half complete */ EDMA.TCD[0].CSR.B.INTMAJOR = 1; /* No interrupt when major count completes */ EDMA.TCD[0].CSR.B.MAJORLINKCH = 0; /* No link channel # used */ EDMA.TCD[0].CSR.B.START = 0; /* Initialize status flags START, DONE, ACTIVE */ EDMA.TCD[0].CSR.B.DONE = 0; EDMA.TCD[0].CSR.B.ACTIVE = 0; INTC.PSR[53].B.PRC_SELN = 0x8; /* IRQ sent to Core 0 */ INTC.PSR[53].B.PRIN =10; /* IRQ priority = 10 (15 = highest) */ } void init_edma_tcd_0_reInit(void) /* This is for SPI_0 Receive */ { /* SADDR Note: 1 byte is transferred in this TCD on each DMA request (minor loop). */ /* The byte is 4th one in the 32-bit POPR register. */ /* Therefore a +3 byte offset is added to POPR address for the source address SADDR */ EDMA.TCD[0].SADDR.R = ((unsigned int)&SPI_0.POPR.R) + 3; /* Load address of source data */ EDMA.TCD[0].ATTR.B.SSIZE = 0; /* Read 2**0 = 1 byte per transfer */ EDMA.TCD[0].ATTR.B.SMOD = 0; /* Source modulo feature not used */ EDMA.TCD[0].SOFF.R = 0; /* After transfer, add 0 to src addr */ EDMA.TCD[0].SLAST.R = 0; /* No addr adjustment after major loops */ EDMA.TCD[0].DADDR.R = (unsigned int)&ReceiveBuffer; /* Destination address */ EDMA.TCD[0].ATTR.B.DSIZE = 0; /* Write 2**0 = 1 byte per transfer */ EDMA.TCD[0].ATTR.B.DMOD = 0; /* Destination modulo feature not used */ EDMA.TCD[0].DOFF.R = 1; /* Increment destination addr by 1 */ /* If repeating major loop, subtract NUMBER_OF_BYTES from dest. addr. */ EDMA.TCD[0].DLASTSGA.R = 0; /* No addr adjustment after major loop */ /* If repeating major loop, set this to 0 to keep the channel enabled */ EDMA.TCD[0].CSR.B.DREQ = 1; /* Disable channel when major loop is done*/ EDMA.TCD[0].NBYTES.MLNO.R = 1; /* NBYTES - Transfer 1 byte per minor loop */ EDMA.TCD[0].CITER.ELINKNO.B.ELINK = 0; /* No Enabling channel LINKing */ EDMA.TCD[0].CITER.ELINKNO.B.CITER = NUMBER_OF_BYTES; /* Init. current interaction count */ EDMA.TCD[0].BITER.ELINKNO.B.ELINK = 0; /* No Enabling channel LINKing */ EDMA.TCD[0].BITER.ELINKNO.B.BITER = NUMBER_OF_BYTES; /* Minor loop iterations */ EDMA.TCD[0].CSR.B.MAJORELINK = 0; /* Dynamic program is not used */ EDMA.TCD[0].CSR.B.ESG = 0; /* Scatter Gather not Enabled */ EDMA.TCD[0].CSR.B.BWC = 0; /* Default bandwidth control- no stalls */ EDMA.TCD[0].CSR.B.INTHALF = 0; /* No interrupt when major count half complete */ EDMA.TCD[0].CSR.B.INTMAJOR = 1; /* No interrupt when major count completes */ EDMA.TCD[0].CSR.B.MAJORLINKCH = 0; /* No link channel # used */ EDMA.TCD[0].CSR.B.START = 0; /* Initialize status flags START, DONE, ACTIVE */ EDMA.TCD[0].CSR.B.DONE = 0; EDMA.TCD[0].CSR.B.ACTIVE = 0; EDMA.SERQ.R = 0; } /*****************************************************************************/ void init_edma_tcd_16() /* This is for DSPI_3 Transmit */ { EDMA.TCD[16].SADDR.R = (unsigned int)&TransmitBuffer; /* Source address */ EDMA.TCD[16].ATTR.B.SSIZE = 2; /* Read 2**2 = 4 bytes per transfer */ EDMA.TCD[16].ATTR.B.SMOD = 0; /* Source modulo feature not used */ EDMA.TCD[16].SOFF.R = 4; /* After transfer, add 0 to src addr */ EDMA.TCD[16].SLAST.R = 0; /* No addr adjustment after major loop */ EDMA.TCD[16].DADDR.R = (unsigned int)&DSPI_3.PUSHR.PUSHR.R; /* Destination address */ EDMA.TCD[16].ATTR.B.DSIZE = 2; /* Write 2**0 = 1 byte per transfer */ EDMA.TCD[16].ATTR.B.DMOD = 0; /* Destination modulo feature not used */ EDMA.TCD[16].DOFF.R = 0; /* No addr adjustment after major loop */ /* If repeating major loop, subtract NUMBER_OF_BYTES from dest. addr. */ EDMA.TCD[16].DLASTSGA.R = 0; /* After major loop, adjust the destination address */ /* If repeating major loop, set this to 0 to keep the channel enabled */ EDMA.TCD[16].CSR.B.DREQ = 1; /* Disable channel when major loop is done*/ EDMA.TCD[16].NBYTES.MLNO.R = 4; /* NBYTES - Transfer 1 byte per minor loop */ EDMA.TCD[16].CITER.ELINKNO.B.ELINK = 0; /* No Enabling channel LINKing */ EDMA.TCD[16].CITER.ELINKNO.B.CITER = NUMBER_OF_BYTES; /* Init. current interaction count */ EDMA.TCD[16].BITER.ELINKNO.B.ELINK = 0; /* No Enabling channel LINKing */ EDMA.TCD[16].BITER.ELINKNO.B.BITER = NUMBER_OF_BYTES; /* Minor loop iterations */ EDMA.TCD[16].CSR.B.MAJORELINK = 0; /* Dynamic program is not used */ EDMA.TCD[16].CSR.B.ESG = 0; /* Scatter Gather not Enabled */ EDMA.TCD[16].CSR.B.BWC = 0; /* Default bandwidth control- no stalls */ EDMA.TCD[16].CSR.B.INTHALF = 0; /* No interrupt when major count half complete */ EDMA.TCD[16].CSR.B.INTMAJOR = 1; /* No interrupt when major count completes */ EDMA.TCD[16].CSR.B.MAJORLINKCH = 0; /* No link channel # used */ EDMA.TCD[16].CSR.B.START = 0; /* Initialize status flags START, DONE, ACTIVE */ EDMA.TCD[16].CSR.B.DONE = 0; EDMA.TCD[16].CSR.B.ACTIVE = 0; INTC.PSR[69].B.PRC_SELN = 0x8; /* IRQ sent to Core 0 */ INTC.PSR[69].B.PRIN =15; /* IRQ priority = 10 (15 = highest) */ } void init_edma_tcd_16_reInit(void) /* This is for DSPI_3 Transmit */ { EDMA.TCD[16].SADDR.R = (unsigned int)&TransmitBuffer; /* Source address */ EDMA.TCD[16].ATTR.B.SSIZE = 2; /* Read 2**2 = 4 bytes per transfer */ EDMA.TCD[16].ATTR.B.SMOD = 0; /* Source modulo feature not used */ EDMA.TCD[16].SOFF.R = 4; /* After transfer, add 0 to src addr */ EDMA.TCD[16].SLAST.R = 0; /* No addr adjustment after major loop */ EDMA.TCD[16].DADDR.R = (unsigned int)&DSPI_3.PUSHR.PUSHR.R; /* Destination address */ EDMA.TCD[16].ATTR.B.DSIZE = 2; /* Write 2**0 = 1 byte per transfer */ EDMA.TCD[16].ATTR.B.DMOD = 0; /* Destination modulo feature not used */ EDMA.TCD[16].DOFF.R = 0; /* No addr adjustment after major loop */ /* If repeating major loop, subtract NUMBER_OF_BYTES from dest. addr. */ EDMA.TCD[16].DLASTSGA.R = 0; /* After major loop, adjust the destination address */ /* If repeating major loop, set this to 0 to keep the channel enabled */ EDMA.TCD[16].CSR.B.DREQ = 1; /* Disable channel when major loop is done*/ EDMA.TCD[16].NBYTES.MLNO.R = 4; /* NBYTES - Transfer 1 byte per minor loop */ EDMA.TCD[16].CITER.ELINKNO.B.ELINK = 0; /* No Enabling channel LINKing */ EDMA.TCD[16].CITER.ELINKNO.B.CITER = NUMBER_OF_BYTES; /* Init. current interaction count */ EDMA.TCD[16].BITER.ELINKNO.B.ELINK = 0; /* No Enabling channel LINKing */ EDMA.TCD[16].BITER.ELINKNO.B.BITER = NUMBER_OF_BYTES; /* Minor loop iterations */ EDMA.TCD[16].CSR.B.MAJORELINK = 0; /* Dynamic program is not used */ EDMA.TCD[16].CSR.B.ESG = 0; /* Scatter Gather not Enabled */ EDMA.TCD[16].CSR.B.BWC = 0; /* Default bandwidth control- no stalls */ EDMA.TCD[16].CSR.B.INTHALF = 0; /* No interrupt when major count half complete */ EDMA.TCD[16].CSR.B.INTMAJOR = 1; /* No interrupt when major count completes */ EDMA.TCD[16].CSR.B.MAJORLINKCH = 0; /* No link channel # used */ EDMA.TCD[16].CSR.B.START = 0; /* Initialize status flags START, DONE, ACTIVE */ EDMA.TCD[16].CSR.B.DONE = 0; EDMA.TCD[16].CSR.B.ACTIVE = 0; // DSPI_3.MCR.B.HALT = 0x0; EDMA.SERQ.R = 16; /* Enable EDMA channel 17 DSPI_3 TX*/ // DSPI_3.PUSHR.PUSHR.B.CTCNT = 0; }
Tags (1)
0 Kudos
0 Replies