<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>MPC5xxx中的主题 Re: SPI RX DMA Empty Bytes between MPC5674F and MCP2518FD SPI Communication</title>
    <link>https://community.nxp.com/t5/MPC5xxx/SPI-RX-DMA-Empty-Bytes-between-MPC5674F-and-MCP2518FD-SPI/m-p/2274555#M28280</link>
    <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/52961"&gt;@PetrS&lt;/a&gt;&amp;nbsp;,&lt;BR /&gt;&lt;BR /&gt;Thanks for the inputs,&lt;BR /&gt;&lt;BR /&gt;Reception is working fine after removing linking between CH 12 Tx and CH 13 Rx .&lt;BR /&gt;&lt;BR /&gt;since this is test code we are using .B instances for clearing registers.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;BR /&gt;Narendra . C&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
    <pubDate>Mon, 05 Jan 2026 10:35:30 GMT</pubDate>
    <dc:creator>CNarendra</dc:creator>
    <dc:date>2026-01-05T10:35:30Z</dc:date>
    <item>
      <title>SPI RX DMA Empty Bytes between MPC5674F and MCP2518FD SPI Communication</title>
      <link>https://community.nxp.com/t5/MPC5xxx/SPI-RX-DMA-Empty-Bytes-between-MPC5674F-and-MCP2518FD-SPI/m-p/2268336#M28266</link>
      <description>&lt;P&gt;Hi ,&lt;BR /&gt;&lt;BR /&gt;We are using the &lt;STRONG&gt;MPC5674F&lt;/STRONG&gt; with RX DMA for an SPI-based external CAN controller (&lt;STRONG&gt;MCP2518FD&lt;/STRONG&gt;).We are able to &lt;STRONG&gt;transmit successfully&lt;/STRONG&gt; using eDMA &lt;STRONG&gt;channel 12&lt;/STRONG&gt; for &lt;STRONG&gt;DSPI_B&lt;/STRONG&gt; without issues.&lt;/P&gt;&lt;P&gt;For reception via DMA, we configured &lt;STRONG&gt;two channels&lt;/STRONG&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Channel 12 (TX):&lt;/STRONG&gt; Transmits dummy messages&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;&lt;STRONG&gt;Channel 13 (RX):&lt;/STRONG&gt; Receives data from the SPI slave&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;The configuration is:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;Channel 12 transmits a dummy message and then &lt;STRONG&gt;links to channel 13&lt;/STRONG&gt; for receiving.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;Once reception is complete, channel 13 &lt;STRONG&gt;links back to channel 12&lt;/STRONG&gt;, continuing the loop until 16 bytes are received.&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;The RX channel generates an &lt;STRONG&gt;interrupt at the end of reception&lt;/STRONG&gt; of all 16 bytes.&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;We successfully receive messages from the slave, but &lt;STRONG&gt;some bytes in the RX DMA buffer are empty&lt;/STRONG&gt;.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Example (Expected continuous data):&lt;/STRONG&gt;&lt;BR /&gt;FF FF FF 1F 18 00 00 00 01 02 03 04 05 06 07 08&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Observed (Bytes are empty in RX DMA buffer):&lt;/STRONG&gt;&lt;BR /&gt;FF FF FF 1F 18 00 00 00 01 02 &lt;FONT color="#000000"&gt;&lt;U&gt;&lt;EM&gt;&lt;STRONG&gt;00&lt;/STRONG&gt;&lt;/EM&gt;&lt;/U&gt;&lt;/FONT&gt;&amp;nbsp;&lt;FONT color="#993300"&gt;03&lt;/FONT&gt;&amp;nbsp;04 05 06 07 &lt;FONT color="#000000"&gt;&lt;U&gt;&lt;EM&gt;&lt;STRONG&gt;00&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Debug window of CAN_RX_data" style="width: 957px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/371083iF1D5BD6EAA7DD52A/image-size/large?v=v2&amp;amp;px=999" role="button" title="image (1).png" alt="Debug window of CAN_RX_data" /&gt;&lt;span class="lia-inline-image-caption" onclick="event.preventDefault();"&gt;Debug window of CAN_RX_data&lt;/span&gt;&lt;/span&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/U&gt;&lt;U&gt;&lt;EM&gt;&lt;STRONG&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Observations:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;A &lt;STRONG&gt;middle byte&lt;/STRONG&gt;&amp;nbsp;in rx buffer is consistently zero&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;The &lt;STRONG&gt;last byte&lt;/STRONG&gt;&amp;nbsp;also appear as zero&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;This issue does &lt;STRONG&gt;not occur in polling mode&lt;/STRONG&gt;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;FIFO is flushed before reception&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;STRONG&gt;Questions:&lt;/STRONG&gt;&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;P&gt;Is there a recommended &lt;STRONG&gt;DMA configuration&lt;/STRONG&gt; or &lt;STRONG&gt;workaround&lt;/STRONG&gt; to prevent RX DMA from skipping bytes when using MPC5674F with SPI and the MCP2518FD?&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;&lt;P&gt;What is the best approach to reliably receive data via DMA without losing any bytes?&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;LI-CODE lang="c"&gt;#define FRAME_SIZE_BYTES   4
#define NUM_ITERATIONS     16  // total number of 4-byte transfers

// Dummy data to send
uint32_t dummy_data = 0xFF;
vuint16_t can_rx_data[NUM_ITERATIONS + 1];

// ---------------- TX Channel 12 ----------------
void eDMA_TCD_tx4BYTE_init()
{
    EDMA_A.TCD[12].SADDR      = (vuint32_t)&amp;amp;dummy_data;
    EDMA_A.TCD[12].SSIZE      = 2;           // 32-bit source
    EDMA_A.TCD[12].SOFF       = 0;
    EDMA_A.TCD[12].SLAST      = 0;
    EDMA_A.TCD[12].SMOD       = 0;

    EDMA_A.TCD[12].DADDR      = (vuint32_t)&amp;amp;DSPI_B.PUSHR.R;
    EDMA_A.TCD[12].DSIZE      = 2;           // 32-bit dest
    EDMA_A.TCD[12].DOFF       = 0;
    EDMA_A.TCD[12].DLAST_SGA  = 0;
    EDMA_A.TCD[12].DMOD       = 0;

    EDMA_A.TCD[12].NBYTES     = FRAME_SIZE_BYTES; 
    EDMA_A.TCD[12].BITER      = NUM_ITERATIONS ; 
    EDMA_A.TCD[12].CITER      = NUM_ITERATIONS ; 

    EDMA_A.TCD[12].CITERE_LINK = 0;
    EDMA_A.TCD[12].BITERE_LINK = 0;

    // Minor-loop linking to RX channel
    EDMA_A.TCD[12].MAJORE_LINK    = 1;
    EDMA_A.TCD[12].MAJORLINKCH    = 13;

    EDMA_A.TCD[12].D_REQ      = 1;
    EDMA_A.TCD[12].INT_HALF   = 0;
    EDMA_A.TCD[12].INT_MAJ    = 0; // only RX channel triggers ISR
    EDMA_A.TCD[12].E_SG       = 0;
    EDMA_A.TCD[12].BWC        = 0;

    EDMA_A.TCD[12].DONE       = 0;
    EDMA_A.TCD[12].ACTIVE     = 0;

    EDMA_A.CR.B.CLM = 1;

}

// ---------------- RX Channel 13 ----------------
void eDMA_TCD_rx4BYTE_init()
{
    EDMA_A.TCD[13].SADDR      = (vuint32_t)&amp;amp;DSPI_B.POPR.R + 2;
    EDMA_A.TCD[13].SSIZE      = 1;   // 2 bytes
    EDMA_A.TCD[13].SOFF       = 0;
    EDMA_A.TCD[13].SLAST      = 0;
    EDMA_A.TCD[13].SMOD       = 0;

    EDMA_A.TCD[13].DADDR      = (vuint32_t)&amp;amp;can_rx_data[0];
    EDMA_A.TCD[13].DSIZE      = 1;   // 2 bytes
    EDMA_A.TCD[13].DOFF       = 2;    // 2 bytes
    EDMA_A.TCD[13].DLAST_SGA  = -(2 * NUM_ITERATIONS); 
    EDMA_A.TCD[13].DMOD       = 0;

    EDMA_A.TCD[13].NBYTES     = 2;    // 2 bytes
    EDMA_A.TCD[13].BITER      = NUM_ITERATIONS;
    EDMA_A.TCD[13].CITER      = NUM_ITERATIONS;

    EDMA_A.TCD[13].CITERE_LINK = 0;
    EDMA_A.TCD[13].BITERE_LINK = 0;

    // Minor-loop linking back to TX channel
    EDMA_A.TCD[13].MAJORE_LINK    = 1;
    EDMA_A.TCD[13].MAJORLINKCH    = 12;

    EDMA_A.TCD[13].D_REQ      = 1;
    EDMA_A.TCD[13].INT_HALF   = 0;
    EDMA_A.TCD[13].INT_MAJ    = 1; // ISR triggers at end of full frame
    EDMA_A.TCD[13].E_SG       = 0;
    EDMA_A.TCD[13].BWC        = 0;

    EDMA_A.TCD[13].DONE       = 0;
    EDMA_A.TCD[13].ACTIVE     = 0;

}


// this will be called at event of RX gpio interrupt from slave
void bsp_ext_can_initiate_rx_dma()
{
     // command + FIFO Address
     uint16_t cmd_pckt = 0x3468; 
     uint8_t  dummy = 0;

    DSPI_B.RSER.B.RFDFDIRS = 1;
    DSPI_B.RSER.B.TFFFDIRS = 1;
      
    //enable chipselect
    SIU.GPDO[105].B.PDO = 0;

    //send command Rd command.
    bsp_dspi_write_via_polling(&amp;amp;DSPI_B, (uint8_t *)&amp;amp;cmd_pckt, 2);


    // Flush RX FIFO if there's any leftover data
    while ((DSPI_B.SR.R &amp;amp; 0x00020000U) == 0x00020000U)
    {
        // Clear any residual data in the rx fifo
        dummy =DSPI_B.POPR.R;

        // Clear RFDF Receive FIFO Drain Flag
        DSPI_B.SR.R |= 0x00020000U;
    }

    DSPI_B.RSER.R |= 1u &amp;lt;&amp;lt; (31u - 6u);    //TFFFRE
    DSPI_B.RSER.R |= (1u &amp;lt;&amp;lt; (31u - 14u)); //RFDFRE

    
	//invoke CH12,13 for DMA
    EDMA_A.SERQR.R = 13;   // RX first (safe)
    EDMA_A.SERQR.R = 12;   // TX starts clock

}

void DMA_RX_end_ISR(void)
{

	EDMA_A.CDSBR.R = 13;                    // Clear DONE status register
	EDMA_A.CIRQR.B.CINT = 13;               // Clear interrupt    
	
    DSPI_B.RSER.R &amp;amp;= ~(1u &amp;lt;&amp;lt; (31u - 6u));   // Disable TFFRE
    DSPI_B.RSER.R &amp;amp;= ~(1u &amp;lt;&amp;lt; (31u - 14u));   // Disable RFDFRE
	DSPI_B.SR.B.RFDF = 1;   // Clear RX FIFO drain flag
	
    /* Clear flags */
    DSPI_B.SR.B.TCF  = 1;
    DSPI_B.SR.B.EOQF = 1;

    /* Flush TX FIFO */
    DSPI_B.MCR.B.CLR_TXF = 1;
    DSPI_B.MCR.B.CLR_RXF = 1;


    // disable cs 
    SIU.GPDO[105].B.PDO = 1;
}&lt;/LI-CODE&gt;&lt;P class="lia-align-left"&gt;&lt;BR /&gt;let me know any additional details or&amp;nbsp; information required for this problem&lt;BR /&gt;&lt;BR /&gt;Thanks&amp;nbsp;&lt;BR /&gt;Narendra.C&lt;/P&gt;&lt;P&gt;&lt;LI-PRODUCT title="MPC5674F" id="MPC5674F"&gt;&lt;/LI-PRODUCT&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 23 Dec 2025 16:49:26 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MPC5xxx/SPI-RX-DMA-Empty-Bytes-between-MPC5674F-and-MCP2518FD-SPI/m-p/2268336#M28266</guid>
      <dc:creator>CNarendra</dc:creator>
      <dc:date>2025-12-23T16:49:26Z</dc:date>
    </item>
    <item>
      <title>Re: SPI RX DMA Empty Bytes between MPC5674F and MCP2518FD SPI Communication</title>
      <link>https://community.nxp.com/t5/MPC5xxx/SPI-RX-DMA-Empty-Bytes-between-MPC5674F-and-MCP2518FD-SPI/m-p/2274236#M28279</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;do not use linking between TX/RX channels. Simply leave basic DMA configuration you have without linking enabled. You can also refer to below one&lt;BR /&gt;&lt;A href="https://community.nxp.com/t5/MPC5xxx-Knowledge-Base/Example-MPC5676R-DSPI-MasterSlave-DMA-CW210/ta-p/1126547" target="_blank"&gt;https://community.nxp.com/t5/MPC5xxx-Knowledge-Base/Example-MPC5676R-DSPI-MasterSlave-DMA-CW210/ta-p/1126547&lt;/A&gt;&lt;BR /&gt;Also I can suggest to omit sending command in polling way. Simply prepare command into first 2 words of extended array and start DMAs to TX and RX 2+16 bytes.&amp;nbsp;&lt;BR /&gt;Finally when clearing flags do not use bit access, use rather full register access to clear desired flags.&lt;/P&gt;
&lt;P&gt;BR, Petr&lt;/P&gt;</description>
      <pubDate>Mon, 05 Jan 2026 10:09:17 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MPC5xxx/SPI-RX-DMA-Empty-Bytes-between-MPC5674F-and-MCP2518FD-SPI/m-p/2274236#M28279</guid>
      <dc:creator>PetrS</dc:creator>
      <dc:date>2026-01-05T10:09:17Z</dc:date>
    </item>
    <item>
      <title>Re: SPI RX DMA Empty Bytes between MPC5674F and MCP2518FD SPI Communication</title>
      <link>https://community.nxp.com/t5/MPC5xxx/SPI-RX-DMA-Empty-Bytes-between-MPC5674F-and-MCP2518FD-SPI/m-p/2274555#M28280</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/52961"&gt;@PetrS&lt;/a&gt;&amp;nbsp;,&lt;BR /&gt;&lt;BR /&gt;Thanks for the inputs,&lt;BR /&gt;&lt;BR /&gt;Reception is working fine after removing linking between CH 12 Tx and CH 13 Rx .&lt;BR /&gt;&lt;BR /&gt;since this is test code we are using .B instances for clearing registers.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;Thanks&lt;BR /&gt;Narendra . C&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 05 Jan 2026 10:35:30 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MPC5xxx/SPI-RX-DMA-Empty-Bytes-between-MPC5674F-and-MCP2518FD-SPI/m-p/2274555#M28280</guid>
      <dc:creator>CNarendra</dc:creator>
      <dc:date>2026-01-05T10:35:30Z</dc:date>
    </item>
  </channel>
</rss>

