<?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>topic Re: LPC55xx SPI DMA pacing in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55xx-SPI-DMA-pacing/m-p/1530465#M50307</link>
    <description>&lt;P&gt;Hi Xiangjun,&lt;/P&gt;&lt;P&gt;Sorry for the late reply; I am not developing in C so it would take me a while to produce some code.&lt;/P&gt;&lt;P&gt;I think the problem is that I am mixing DMA and direct FIFO access for SPI. I am implementing a SD card driver, so I use the FIFO to write out the command and wait for the responses, and only use DMA when reading out the data blocks as a second step.&lt;/P&gt;&lt;P&gt;Because I don't set EOT = 1 except at the end of an SD card operation, the SPI is stalled (STAT.STALLED = 1) when I submit my DMA operations. This seems to cause the RX DMA to immediately read from FIFORD even though the read FIFO is empty.&lt;/P&gt;&lt;P&gt;I can see this because when I am in this state (SPI.STAT =&amp;nbsp;0x00000070, SPI.FIFOSTAT =&amp;nbsp;0x00000030), I can set up a RX DMA transfer with XFERCFG =&amp;nbsp;0x01ff4013 and it immediately becomes&amp;nbsp;0x01fe4013, so one byte was read from FIFORD &lt;U&gt;&lt;STRONG&gt;without any writes to FIFOWR&lt;/STRONG&gt;&lt;/U&gt;.&lt;/P&gt;&lt;P&gt;Writing to FIFOWR and allowing the transmitter to begin sending &lt;STRONG&gt;before&lt;/STRONG&gt; submitting the DMA transfer appears to clear this issue.&lt;/P&gt;&lt;P&gt;Is it allowed to submit a DMA RX transfer when the SPI master transmitter is stalled? (or if STALLED = 0 but MSTIDLE = 0 also)&lt;/P&gt;</description>
    <pubDate>Thu, 29 Sep 2022 14:02:36 GMT</pubDate>
    <dc:creator>Bacterius</dc:creator>
    <dc:date>2022-09-29T14:02:36Z</dc:date>
    <item>
      <title>LPC55xx SPI DMA pacing</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55xx-SPI-DMA-pacing/m-p/1512720#M49970</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I am trying to use DMA with SPI (Flexcomm0) on LPC550x. I have this current setup:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;set up peripheral -&amp;gt; memory DMA transfer to read 10 bytes from FIFORD&lt;/LI&gt;&lt;LI&gt;trigger the transfer&lt;/LI&gt;&lt;LI&gt;set up memory -&amp;gt; peripheral DMA transfer to write 10 bytes to FIFOWR&lt;/LI&gt;&lt;LI&gt;trigger the transfer&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;My DMA requests all have PERIPHREQEN enabled and the Flexcomm has DMA enabled for both FIFOs. They use normal 8-bit transfer descriptors without linked descriptors, so just one-off transfers.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;When I do this, I get a 0xFF byte at the beginning of my output buffer (read from SPI).&lt;/STRONG&gt; I do not see this byte on the wire, so it looks like the DMA channel has tried to read from an empty FIFORD.&lt;/P&gt;&lt;P&gt;However, when I change the order to this, where I trigger the TX DMA first:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;set up memory -&amp;gt; peripheral DMA transfer to write 10 bytes to FIFOWR&lt;/LI&gt;&lt;LI&gt;trigger the transfer&lt;/LI&gt;&lt;LI&gt;set up peripheral -&amp;gt; memory DMA transfer to read 10 bytes from FIFORD&lt;/LI&gt;&lt;LI&gt;trigger the transfer&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;Then everything works properly and I read 10 correct bytes.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;My question&lt;/STRONG&gt;: does the DMA controller look at the DMA request line from the peripheral on the &lt;EM&gt;first&lt;/EM&gt; transfer, immediately after triggering the channel, or does it ignore it? Because according to the tests above it looks like the controller will always read FIFORD immediately on triggering the RX channel, even if the FIFO is empty.&lt;/P&gt;&lt;P&gt;I think this is the case because the issue occurring seems to depend on &lt;STRONG&gt;the ratio between the SPI clock and the DMA clock&lt;/STRONG&gt; (AHB clock), so it seems that the RX DMA channel is racing the SPI peripheral on the first transfer without looking at the request line.&lt;/P&gt;&lt;P&gt;Thanks!&lt;/P&gt;</description>
      <pubDate>Sun, 28 Aug 2022 05:38:40 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55xx-SPI-DMA-pacing/m-p/1512720#M49970</guid>
      <dc:creator>Bacterius</dc:creator>
      <dc:date>2022-08-28T05:38:40Z</dc:date>
    </item>
    <item>
      <title>Re: LPC55xx SPI DMA pacing</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55xx-SPI-DMA-pacing/m-p/1513052#M49982</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;As you know that the spi module in master mode is synchronized for transmitter and receiver, in other words, after the spi module in master mode transfers data to slave spi can the master spi receives data from slave spi, so the transmitter channel DMA has to transfer data to slave, then the receiver channel DMA can read data.&lt;/P&gt;
&lt;P&gt;Can you post the code so that we can understand your software scheme?&lt;/P&gt;
&lt;P&gt;BR&lt;/P&gt;
&lt;P&gt;XiangJun Rong&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 29 Aug 2022 09:29:33 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55xx-SPI-DMA-pacing/m-p/1513052#M49982</guid>
      <dc:creator>xiangjun_rong</dc:creator>
      <dc:date>2022-08-29T09:29:33Z</dc:date>
    </item>
    <item>
      <title>Re: LPC55xx SPI DMA pacing</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55xx-SPI-DMA-pacing/m-p/1530465#M50307</link>
      <description>&lt;P&gt;Hi Xiangjun,&lt;/P&gt;&lt;P&gt;Sorry for the late reply; I am not developing in C so it would take me a while to produce some code.&lt;/P&gt;&lt;P&gt;I think the problem is that I am mixing DMA and direct FIFO access for SPI. I am implementing a SD card driver, so I use the FIFO to write out the command and wait for the responses, and only use DMA when reading out the data blocks as a second step.&lt;/P&gt;&lt;P&gt;Because I don't set EOT = 1 except at the end of an SD card operation, the SPI is stalled (STAT.STALLED = 1) when I submit my DMA operations. This seems to cause the RX DMA to immediately read from FIFORD even though the read FIFO is empty.&lt;/P&gt;&lt;P&gt;I can see this because when I am in this state (SPI.STAT =&amp;nbsp;0x00000070, SPI.FIFOSTAT =&amp;nbsp;0x00000030), I can set up a RX DMA transfer with XFERCFG =&amp;nbsp;0x01ff4013 and it immediately becomes&amp;nbsp;0x01fe4013, so one byte was read from FIFORD &lt;U&gt;&lt;STRONG&gt;without any writes to FIFOWR&lt;/STRONG&gt;&lt;/U&gt;.&lt;/P&gt;&lt;P&gt;Writing to FIFOWR and allowing the transmitter to begin sending &lt;STRONG&gt;before&lt;/STRONG&gt; submitting the DMA transfer appears to clear this issue.&lt;/P&gt;&lt;P&gt;Is it allowed to submit a DMA RX transfer when the SPI master transmitter is stalled? (or if STALLED = 0 but MSTIDLE = 0 also)&lt;/P&gt;</description>
      <pubDate>Thu, 29 Sep 2022 14:02:36 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55xx-SPI-DMA-pacing/m-p/1530465#M50307</guid>
      <dc:creator>Bacterius</dc:creator>
      <dc:date>2022-09-29T14:02:36Z</dc:date>
    </item>
    <item>
      <title>Re: LPC55xx SPI DMA pacing</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55xx-SPI-DMA-pacing/m-p/1530878#M50311</link>
      <description>&lt;P&gt;As a follow-up to my other reply (below):&lt;/P&gt;&lt;P&gt;It seems that if I try a DMA RX transfer immediately after the SPI is initialized, without ever sending anything, it behaves properly (and does not transfer anything since there is no transmitter activity yet).&lt;/P&gt;&lt;P&gt;But if I write anything to the FIFOWR, and then clear the FIFORD afterwards (after it becomes not empty), no matter what I do after, the DMA RX transfer will always transfer 1 byte even though no further SPI transmissions have taken place after both FIFOs are empty.&lt;/P&gt;&lt;P&gt;In other words, this is what I see if I use DMA RX straight after init:&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.FIFOCFG &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;00000000&lt;/SPAN&gt;&lt;SPAN&gt; // disable all FIFOs&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.CFG &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;00000004&lt;/SPAN&gt;&lt;SPAN&gt; // select master mode&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.DIV &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;0000012c&lt;/SPAN&gt;&lt;SPAN&gt; // set bit rate&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.FIFOCFG &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;00033003&lt;/SPAN&gt;&lt;SPAN&gt; // enable TX/RX and empty them&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.CFG &lt;/SPAN&gt;&lt;SPAN&gt;|=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;00000001&lt;/SPAN&gt;&lt;SPAN&gt; // enable SPI peripheral&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;fifostat &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.FIFOSTAT&lt;/SPAN&gt;&lt;SPAN&gt; // fifostat = 0x00000030 = all empty&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;stat &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.STAT&lt;/SPAN&gt;&lt;SPAN&gt; // stat = 0x00000100&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;DMA0&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;CHANNEL4&lt;/SPAN&gt;&lt;SPAN&gt;.CFG &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;00000001&lt;/SPAN&gt;&lt;SPAN&gt; // enable PERIPHREQEN&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;DMA0&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;CHANNEL4&lt;/SPAN&gt;&lt;SPAN&gt;.XFERCFG &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;01ff4013&lt;/SPAN&gt;&lt;SPAN&gt; // set up 512-byte RX transfer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;DMA0&lt;/SPAN&gt;&lt;SPAN&gt;.SETTRIG &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;00000010&lt;/SPAN&gt;&lt;SPAN&gt; // trigger channel 4&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;while&lt;/SPAN&gt;&lt;SPAN&gt; (&lt;/SPAN&gt;&lt;SPAN&gt;1&lt;/SPAN&gt;&lt;SPAN&gt;) {}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;// stop with debugger later&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;// DMA0.CHANNEL4.XFERCFG = 0x01ff4013&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;But if I transmit and receive at least one byte on the FIFOs before:&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.FIFOCFG &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;00000000&lt;/SPAN&gt;&lt;SPAN&gt; // disable all FIFOs&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.CFG &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;00000004&lt;/SPAN&gt;&lt;SPAN&gt; // select master mode&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.DIV &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;0000012c&lt;/SPAN&gt;&lt;SPAN&gt; // set bit rate&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.FIFOCFG &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;00033003&lt;/SPAN&gt;&lt;SPAN&gt; // enable TX/RX and empty them&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.CFG &lt;/SPAN&gt;&lt;SPAN&gt;|=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;00000001&lt;/SPAN&gt;&lt;SPAN&gt; // enable SPI peripheral&lt;BR /&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while&lt;/SPAN&gt;&lt;SPAN&gt; (&lt;/SPAN&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.FIFOSTAT &lt;/SPAN&gt;&lt;SPAN&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN&gt; TXNOTFULL &lt;/SPAN&gt;&lt;SPAN&gt;==&lt;/SPAN&gt; &lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;) {}&lt;/SPAN&gt;&lt;SPAN&gt; // wait for transmit space&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.FIFOWR &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;FF&lt;/SPAN&gt; &lt;SPAN&gt;|&lt;/SPAN&gt;&lt;SPAN&gt; DATA_LEN_8_BITS &lt;/SPAN&gt;&lt;SPAN&gt;|&lt;/SPAN&gt;&lt;SPAN&gt; EOT&lt;/SPAN&gt;&lt;SPAN&gt; // transmit one byte with EOT&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;while&lt;/SPAN&gt;&lt;SPAN&gt; (&lt;/SPAN&gt;&lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.FIFOSTAT &lt;/SPAN&gt;&lt;SPAN&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN&gt; RXNOTEMPTY &lt;/SPAN&gt;&lt;SPAN&gt;==&lt;/SPAN&gt; &lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;) {}&lt;/SPAN&gt;&lt;SPAN&gt; // wait for received data&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;tmp &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.FIFORD&lt;/SPAN&gt;&lt;SPAN&gt; // read received byte&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;fifostat &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.FIFOSTAT&lt;/SPAN&gt;&lt;SPAN&gt; // fifostat = 0x00000030 = all empty&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;stat &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;SPI0&lt;/SPAN&gt;&lt;SPAN&gt;.STAT&lt;/SPAN&gt;&lt;SPAN&gt; // stat = 0x00000130&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;DMA0&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;CHANNEL4&lt;/SPAN&gt;&lt;SPAN&gt;.CFG &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;00000001&lt;/SPAN&gt;&lt;SPAN&gt; // enable PERIPHREQEN&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;DMA0&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;CHANNEL4&lt;/SPAN&gt;&lt;SPAN&gt;.XFERCFG &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;01ff4013&lt;/SPAN&gt;&lt;SPAN&gt; // set up 512-byte RX transfer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;DMA0&lt;/SPAN&gt;&lt;SPAN&gt;.SETTRIG &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;0x&lt;/SPAN&gt;&lt;SPAN&gt;00000010&lt;/SPAN&gt;&lt;SPAN&gt; // trigger channel 4&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;while&lt;/SPAN&gt;&lt;SPAN&gt; (&lt;/SPAN&gt;&lt;SPAN&gt;1&lt;/SPAN&gt;&lt;SPAN&gt;) {}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;// stop with debugger later&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;// DMA0.CHANNEL4.XFERCFG = 0x01fe4013&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;Can you please explain this behaviour? It seems the only difference is SSD/SSA asserted in STAT, but these don't affect SPI/DMA operation?&lt;/P&gt;</description>
      <pubDate>Fri, 30 Sep 2022 07:02:35 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC55xx-SPI-DMA-pacing/m-p/1530878#M50311</guid>
      <dc:creator>Bacterius</dc:creator>
      <dc:date>2022-09-30T07:02:35Z</dc:date>
    </item>
  </channel>
</rss>

