<?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>LPC MicrocontrollersのトピックRe: Problem with DMA on SPI Slave</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/Problem-with-DMA-on-SPI-Slave/m-p/648011#M25723</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If someone looks for the same problem, there is the solution/explaination.&lt;/P&gt;&lt;P&gt;DMA system required 32 bits buffer, even if 8-bits data are received by SPI slave driver. So, it is necessary to ask for X*sizeof(uint32_t) in sSpiSlaveXfer.dataSize.In DMA callback, you will have to extract useful data from uint32_t buffer of DMA.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mickael&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 13 Dec 2016 09:32:15 GMT</pubDate>
    <dc:creator>mlefores</dc:creator>
    <dc:date>2016-12-13T09:32:15Z</dc:date>
    <item>
      <title>Problem with DMA on SPI Slave</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Problem-with-DMA-on-SPI-Slave/m-p/648010#M25722</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am facing problem when using DMA on the lpc54114. I try to receive data from SPI Slave driver through DMA.&lt;/P&gt;&lt;P&gt;What I remark is : I received a size of bytes that corresponds to nothing and I don't understand where I made an error.&lt;/P&gt;&lt;P&gt;There is my code :&lt;/P&gt;&lt;P&gt;#define TRANSFERT_DMA DMA0 // Only 1 dma on the µC&lt;BR /&gt; #define DMA_IRQ DMA0_IRQn&lt;/P&gt;&lt;P&gt;#define TRANSFERT_HSDC_DMA_CHANNEL 14&lt;/P&gt;&lt;P&gt;#define SPI_FLEXCOMM_CLK kFRO12M_to_FLEXCOMM7&lt;BR /&gt; #define SPI_FLEXCOMM_RST kFC7_RST_SHIFT_RSTn&lt;BR /&gt; #define HSDC_SPI_INSTANCE SPI7&lt;/P&gt;&lt;P&gt;#define SPI_DMA_TRANSFER_NB 8&lt;BR /&gt; #define SPI_DMA_WORDS_PER_TRANSFER 7&lt;BR /&gt; #define SPI_TRANSFER_SIZE_WORDS (SPI_DMA_WORDS_PER_TRANSFER*SPI_DMA_TRANSFER_NB)&lt;/P&gt;&lt;P&gt;static uint8_t spiSlaveRxData[2][SPI_TRANSFER_SIZE_WORDS]={0};&lt;/P&gt;&lt;P&gt;static dma_handle_t sWaveFormDmaHandle,sUselessDmaHandle;&lt;/P&gt;&lt;P&gt;static spi_slave_config_t sSpiSlaveConfig;&lt;BR /&gt; static spi_transfer_t sSpiSlaveXfer;&lt;BR /&gt; static spi_dma_handle_t sSpiSlaveDmaHandle;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;CLOCK_AttachClk(SPI_FLEXCOMM_CLK);&lt;BR /&gt; RESET_PeripheralReset(SPI_FLEXCOMM_RST);&lt;BR /&gt; &amp;nbsp;// Configure SPI Slave device&lt;BR /&gt; &amp;nbsp;SPI_SlaveGetDefaultConfig(&amp;amp;sSpiSlaveConfig);&lt;BR /&gt; &amp;nbsp;sSpiSlaveConfig.enableSlave = false; // Avoid auto start SPI before end of configuration&lt;BR /&gt; SPI_SlaveInit(HSDC_SPI_INSTANCE, &amp;amp;sSpiSlaveConfig);&lt;BR /&gt; &amp;nbsp;// Configure DMA&lt;BR /&gt; &amp;nbsp;DMA_Init(TRANSFERT_DMA);&lt;BR /&gt; // Enable channels (SPI-RX/TX - otherwise no events occurred)&lt;BR /&gt; DMA_EnableChannel(TRANSFERT_DMA, TRANSFERT_HSDC_DMA_CHANNEL);&lt;BR /&gt; DMA_EnableChannel(TRANSFERT_DMA,TRANSFERT_HSDC_DMA_CHANNEL+1); // For SPI TX&lt;BR /&gt; // Set priorities&lt;BR /&gt; DMA_SetChannelPriority(TRANSFERT_DMA, TRANSFERT_HSDC_DMA_CHANNEL+1, kDMA_ChannelPriority7); // For SPI TX&lt;BR /&gt; DMA_SetChannelPriority(TRANSFERT_DMA, TRANSFERT_HSDC_DMA_CHANNEL, kDMA_ChannelPriority0);&lt;BR /&gt; // Creates DMA handles&lt;BR /&gt; DMA_CreateHandle(&amp;amp;sWaveFormDmaHandle, TRANSFERT_DMA, TRANSFERT_HSDC_DMA_CHANNEL);&lt;BR /&gt; DMA_CreateHandle(&amp;amp;sUselessDmaHandle,TRANSFERT_DMA, TRANSFERT_HSDC_DMA_CHANNEL+1); // For SPI TX&lt;BR /&gt; // Creates SPI-Handles&lt;BR /&gt; SPI_SlaveTransferCreateHandleDMA(HSDC_SPI_INSTANCE, &amp;amp;sSpiSlaveDmaHandle, spi_rxSlaveCallback,NULL,&amp;amp;sUselessDmaHandle , &amp;amp;sWaveFormDmaHandle);&lt;BR /&gt; &lt;BR /&gt; // Configure Buffers for DMA&lt;BR /&gt; sSpiSlaveXfer.txData = (uint8_t *)&amp;amp;spiSlaveTxData;&lt;BR /&gt; //sSpiSlaveXfer.rxData = spiSlaveRxData;&lt;BR /&gt; sSpiSlaveXfer.rxData = (uint8_t*)spiSlaveRxData[sBufferId];&lt;BR /&gt; sSpiSlaveXfer.dataSize = SPI_TRANSFER_SIZE_BYTES;&lt;BR /&gt; &lt;BR /&gt; // Configure DMA Transfer&lt;BR /&gt; SPI_SlaveTransferDMA(HSDC_SPI_INSTANCE, &amp;amp;sSpiSlaveDmaHandle, &amp;amp;sSpiSlaveXfer);&lt;BR /&gt; // Start Really DMA/SPI&lt;BR /&gt; SPI_Enable(HSDC_SPI_INSTANCE, true);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static void spi_rxSlaveCallback(SPI_Type *base, spi_dma_handle_t *handle, status_t status, void *userData)&lt;BR /&gt; {&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; if(status == kStatus_Success)&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GPIO_WritePinOutput(GPIO, 0, 26, val);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; val = !val;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SPI_SlaveTransferDMA(HSDC_SPI_INSTANCE, &amp;amp;sSpiSlaveDmaHandle, &amp;amp;sSpiSlaveXfer);&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt;Please find attach scope of the gpio that toggles when DMA system seems to have read 224 bytes ...&lt;/P&gt;&lt;P&gt;Yellow line is CSS driven by SPI master. There is 28 bytes per Frame of 125 µs.&lt;/P&gt;&lt;P&gt;Blue is GPIO that is toggling at each DMA interrupt. You can see that the IRQ switch too early (56 bytes).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks in advance for your help.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mickael&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 05 Dec 2016 09:02:41 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Problem-with-DMA-on-SPI-Slave/m-p/648010#M25722</guid>
      <dc:creator>mlefores</dc:creator>
      <dc:date>2016-12-05T09:02:41Z</dc:date>
    </item>
    <item>
      <title>Re: Problem with DMA on SPI Slave</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Problem-with-DMA-on-SPI-Slave/m-p/648011#M25723</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If someone looks for the same problem, there is the solution/explaination.&lt;/P&gt;&lt;P&gt;DMA system required 32 bits buffer, even if 8-bits data are received by SPI slave driver. So, it is necessary to ask for X*sizeof(uint32_t) in sSpiSlaveXfer.dataSize.In DMA callback, you will have to extract useful data from uint32_t buffer of DMA.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mickael&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 13 Dec 2016 09:32:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Problem-with-DMA-on-SPI-Slave/m-p/648011#M25723</guid>
      <dc:creator>mlefores</dc:creator>
      <dc:date>2016-12-13T09:32:15Z</dc:date>
    </item>
  </channel>
</rss>

