<?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: Data corruption with imx6ull qspi peripheral in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/Data-corruption-with-imx6ull-qspi-peripheral/m-p/859580#M131241</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Kevin&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data corruption can be caused by timings and signal noise, one can check them&lt;/P&gt;&lt;P&gt;with oscilloscope, use that qspi datasheet timings and sect.4.12.10 QUAD SPI (QSPI) Timing&lt;/P&gt;&lt;P&gt;Parameters i.MX6ULL Datasheet &lt;BR /&gt;&lt;A href="https://www.nxp.com/docs/en/data-sheet/IMX6ULLCEC.pdf" target="test_blank"&gt;https://www.nxp.com/docs/en/data-sheet/IMX6ULLCEC.pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards&lt;BR /&gt;igor&lt;BR /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;Note: If this post answers your question, please click the Correct Answer button. Thank you!&lt;BR /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 01 Mar 2019 23:27:03 GMT</pubDate>
    <dc:creator>igorpadykov</dc:creator>
    <dc:date>2019-03-01T23:27:03Z</dc:date>
    <item>
      <title>Data corruption with imx6ull qspi peripheral</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Data-corruption-with-imx6ull-qspi-peripheral/m-p/859579#M131240</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I am seeing data corruption when using the imx6ull qspi peripheral. I have put prints in after filling the TX FIFO and the prints show the data going into the FIFO is correct but it comes out of the chip onto the qspi bus wrong. Here is an example, the bold data is incorrect (this is a baremetal project):&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;FC 4F 02 00 FD 4F 02 00 FE 4F 02 00 FF 4F 02 00&lt;/P&gt;&lt;P&gt;00 50 02 00 01 50 02 00 02 50 02 00 03 50 02 00&lt;/P&gt;&lt;P&gt;04 50 02 00 05 50 02 00 06 50 02 00 07 50 02 00&lt;/P&gt;&lt;P&gt;08 50 02 00 09 50 02 00 0A 50 02 00 0B 50 02 00&lt;/P&gt;&lt;P&gt;0C 50 02 00 0D 50 02 00 0E 50 02 00 0F 50 02 00&lt;/P&gt;&lt;P&gt;10 50 02 00 11 50 02 00 12 50 02 00 13 50 02 00&lt;/P&gt;&lt;P&gt;14 50 02 00 15 50 02 00 16 50 02 00 17 50 02 00&lt;/P&gt;&lt;P&gt;18 50 02 00 19 50 02 00 1A 50 02 00 1B 50 02 00&lt;/P&gt;&lt;P&gt;1C 50 02 00 1D 50 02 00 1E 50 02 00 1F 50 02 00&lt;/P&gt;&lt;P&gt;20 50 02 00 21 50 02 00 22 50 02 00 23 50 02 00&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;FF FF FF FF FF FF FF FF FF FF FF FF FF FF&amp;nbsp;FF&amp;nbsp;FF&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF&amp;nbsp;FF&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF&amp;nbsp;FF&amp;nbsp; &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF&amp;nbsp;FF&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;40 50 02 00 41 50 02 00 42 50 02 00 43 50 02 00&lt;/P&gt;&lt;P&gt;44 50 02 00 45 50 02 00 46 50 02 00 47 50 02 00&lt;/P&gt;&lt;P&gt;48 50 02 00 49 50 02 00 4A 50 02 00 4B 50 02 00&lt;/P&gt;&lt;P&gt;4C 50 02 00 4D 50 02 00 4E 50 02 00 4F 50 02 00&lt;/P&gt;&lt;P&gt;50 50 02 00 51 50 02 00 52 50 02 00 53 50 02 00&lt;/P&gt;&lt;P&gt;54 50 02 00 55 50 02 00 56 50 02 00 57 50 02 00&lt;/P&gt;&lt;P&gt;58 50 02 00 59 50 02 00 5A 50 02 00 5B 50 02 00&lt;/P&gt;&lt;P&gt;5C 50 02 00 5D 50 02 00 5E 50 02 00 5F 50 02 00&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It should have been this:&lt;/P&gt;&lt;P&gt;24 50 02 00 25 50 02 00 26 50 02 00 27 50 02 00&lt;/P&gt;&lt;P&gt;28 50 02 00 29 50 02 00 2A 50 02 00 2B 50 02 00&lt;/P&gt;&lt;P&gt;2C 50 02 00 2D 50 02 00 2E 50 02 00 2F 50 02 00&lt;/P&gt;&lt;P&gt;30 50 02 00 31 50 02 00 32 50 02 00 33 50 02 00&lt;/P&gt;&lt;P&gt;34 50 02 00 35 50 02 00 36 50 02 00 37 50 02 00&lt;/P&gt;&lt;P&gt;38 50 02 00 39 50 02 00 3A 50 02 00 3B 50 02 00&lt;/P&gt;&lt;P&gt;3C 50 02 00 3D 50 02 00 3E 50 02 00 3F 50 02 00&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here is my code to write to the qspi peripheral:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;void QSPI_Write(QuadSPI_Type *base, uint32_t *buffer, size_t size)&lt;/STRONG&gt;&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; &amp;nbsp; uint32_t i = 0;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; for (i = 0; i &amp;lt; size / 4U; i++)&lt;BR /&gt;&amp;nbsp; &amp;nbsp; {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; /* Check if the buffer is full */&lt;BR /&gt;&amp;nbsp; &amp;nbsp; while (QuadSPI-&amp;gt;SR &amp;amp; QuadSPI_SR_TXFULL_MASK)&lt;BR /&gt;&amp;nbsp; &amp;nbsp; {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; base-&amp;gt;TBDR = *buffer;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; buffer++;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; }&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;void programQspiFlash(uint32_t addr, uint32_t *src_addr)&lt;/STRONG&gt;&lt;BR /&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; while (QuadSPI-&amp;gt;SR &amp;amp; QuadSPI_SR_BUSY_MASK)&lt;BR /&gt;&amp;nbsp; &amp;nbsp; {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; }&lt;BR /&gt;&amp;nbsp; &amp;nbsp; // clear FIFO&lt;BR /&gt;&amp;nbsp; &amp;nbsp; QuadSPI-&amp;gt;MCR |= QuadSPI_MCR_CLR_TXF_MASK;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; // Set IP Command Address&lt;BR /&gt;&amp;nbsp; &amp;nbsp; QuadSPI-&amp;gt;SFAR = addr;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; // cmd write enable&lt;BR /&gt;&amp;nbsp; &amp;nbsp;while (QuadSPI-&amp;gt;SR &amp;amp; QuadSPI_SR_BUSY_MASK &amp;amp; QuadSPI_SR_BUSY_MASK)&lt;BR /&gt;&amp;nbsp; &amp;nbsp;{&lt;BR /&gt;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp; &amp;nbsp;while (QuadSPI-&amp;gt;SR &amp;amp; QuadSPI_SR_BUSY_MASK &amp;amp; (QuadSPI_SR_BUSY_MASK |&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;QuadSPI_SR_IP_ACC_MASK))&lt;BR /&gt;&amp;nbsp; &amp;nbsp; {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; }&lt;BR /&gt;&amp;nbsp; &amp;nbsp; QuadSPI-&amp;gt;SPTRCLR = QuadSPI_SPTRCLR_IPPTRC_MASK;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp; &amp;nbsp;// Write the seqid bit&lt;BR /&gt;&amp;nbsp; &amp;nbsp;QuadSPI-&amp;gt;IPCR = ((QuadSPI-&amp;gt;IPCR &amp;amp; (~QuadSPI_IPCR_SEQID_MASK)) | QuadSPI_IPCR_SEQID(1));&lt;BR /&gt;&amp;nbsp; &amp;nbsp;// end cmd write enable&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; while (QuadSPI-&amp;gt;SR &amp;amp; QuadSPI_SR_BUSY_MASK)&lt;BR /&gt;&amp;nbsp; &amp;nbsp; {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; QuadSPI-&amp;gt;SPTRCLR = QuadSPI_SPTRCLR_IPPTRC_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; // First write some data into TXFIFO to prevent from under run&lt;BR /&gt;&amp;nbsp; &amp;nbsp;QSPI_Write(QuadSPI, src_addr, 128);&lt;BR /&gt;&amp;nbsp; &amp;nbsp; src_addr += 32;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; // Start the program&lt;BR /&gt;&amp;nbsp; &amp;nbsp;QuadSPI-&amp;gt;IPCR = ((QuadSPI-&amp;gt;IPCR &amp;amp; (~QuadSPI_IPCR_IDATSZ_MASK)) |&amp;nbsp; &amp;nbsp; &amp;nbsp;QuadSPI_IPCR_IDATSZ(FLASH_PAGE_SIZE));&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;while (QuadSPI-&amp;gt;SR &amp;amp; (QuadSPI_SR_BUSY_MASK | QuadSPI_SR_IP_ACC_MASK))&lt;BR /&gt;&amp;nbsp; &amp;nbsp; {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; }&lt;BR /&gt;&amp;nbsp; &amp;nbsp; QuadSPI-&amp;gt;SPTRCLR = QuadSPI_SPTRCLR_IPPTRC_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; // Write the seqid bit&lt;BR /&gt;&amp;nbsp; &amp;nbsp; QuadSPI-&amp;gt;IPCR = ((QuadSPI-&amp;gt;IPCR &amp;amp; (~QuadSPI_IPCR_SEQID_MASK)) | QuadSPI_IPCR_SEQID(4U));&lt;BR /&gt; QSPI_Write(QuadSPI, src_addr, 128);&lt;BR /&gt; src_addr += 32;&lt;/P&gt;&lt;P&gt;// Wait until flash finished program&lt;BR /&gt; uint32_t val = 0;&lt;BR /&gt; do&lt;BR /&gt; {&lt;BR /&gt; while (QuadSPI-&amp;gt;SR &amp;amp; QuadSPI_SR_BUSY_MASK)&lt;BR /&gt; {&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt;// Clear FIFO&lt;BR /&gt; QuadSPI-&amp;gt;MCR |= QuadSPI_MCR_CLR_RXF_MASK;&lt;BR /&gt; // Clear command sequence.&lt;BR /&gt; QuadSPI-&amp;gt;SPTRCLR = QuadSPI_SPTRCLR_IPPTRC_MASK;&lt;BR /&gt; // Write the seqid bit&lt;BR /&gt; QuadSPI-&amp;gt;IPCR = ((QuadSPI-&amp;gt;IPCR &amp;amp; (~QuadSPI_IPCR_SEQID_MASK)) | QuadSPI_IPCR_SEQID(3U));&lt;BR /&gt; while (QuadSPI-&amp;gt;SR &amp;amp; QuadSPI_SR_BUSY_MASK)&lt;BR /&gt; {&lt;BR /&gt; }&lt;BR /&gt; val = *(volatile uint32_t *)(FSL_FEATURE_QSPI_ARDB_BASE);&lt;BR /&gt; // Clear ARDB area&lt;BR /&gt; QuadSPI-&amp;gt;FR = QuadSPI_FR_RBDF_MASK;&lt;BR /&gt; } while (val &amp;amp; 0x1);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt; while (QuadSPI-&amp;gt;SR &amp;amp; (QuadSPI_SR_BUSY_MASK | QuadSPI_SR_IP_ACC_MASK))&lt;BR /&gt; {&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt;// Do a software reset of the qspi peripheral&lt;BR /&gt; // Reset AHB domain and buffer domian&lt;BR /&gt; QuadSPI-&amp;gt;MCR |= (QuadSPI_MCR_SWRSTHD_MASK | QuadSPI_MCR_SWRSTSD_MASK);&lt;/P&gt;&lt;P&gt;// Wait for the reset to finish&lt;BR /&gt; int i = 0;&lt;BR /&gt; for (i = 0; i &amp;lt; 100; i++)&lt;BR /&gt; {&lt;BR /&gt; __ASM("nop");&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt;// Disable QSPI module&lt;BR /&gt; QuadSPI-&amp;gt;MCR |= QuadSPI_MCR_MDIS_MASK;&lt;/P&gt;&lt;P&gt;// Clear the reset flags&lt;BR /&gt; QuadSPI-&amp;gt;MCR &amp;amp;= ~(QuadSPI_MCR_SWRSTHD_MASK | QuadSPI_MCR_SWRSTSD_MASK);&lt;/P&gt;&lt;P&gt;// Enable QSPI module&lt;BR /&gt; QuadSPI-&amp;gt;MCR &amp;amp;= ~QuadSPI_MCR_MDIS_MASK;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am at a loss to explain the data corruption, has anyone seen this before or have any ideas to the issue?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 01 Mar 2019 20:16:51 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Data-corruption-with-imx6ull-qspi-peripheral/m-p/859579#M131240</guid>
      <dc:creator>kevincronn</dc:creator>
      <dc:date>2019-03-01T20:16:51Z</dc:date>
    </item>
    <item>
      <title>Re: Data corruption with imx6ull qspi peripheral</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Data-corruption-with-imx6ull-qspi-peripheral/m-p/859580#M131241</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Kevin&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data corruption can be caused by timings and signal noise, one can check them&lt;/P&gt;&lt;P&gt;with oscilloscope, use that qspi datasheet timings and sect.4.12.10 QUAD SPI (QSPI) Timing&lt;/P&gt;&lt;P&gt;Parameters i.MX6ULL Datasheet &lt;BR /&gt;&lt;A href="https://www.nxp.com/docs/en/data-sheet/IMX6ULLCEC.pdf" target="test_blank"&gt;https://www.nxp.com/docs/en/data-sheet/IMX6ULLCEC.pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards&lt;BR /&gt;igor&lt;BR /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;Note: If this post answers your question, please click the Correct Answer button. Thank you!&lt;BR /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 01 Mar 2019 23:27:03 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Data-corruption-with-imx6ull-qspi-peripheral/m-p/859580#M131241</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2019-03-01T23:27:03Z</dc:date>
    </item>
    <item>
      <title>Re: Data corruption with imx6ull qspi peripheral</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Data-corruption-with-imx6ull-qspi-peripheral/m-p/859581#M131242</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;If I disable all interrupts before programming the flash I never see any corruption. Is it recommended to disable interrupts before programming qspi with the imx6ull? I haven't found anything in the reference manual to that effect but somehow interrupts are causing corruption in my application.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 05 Mar 2019 15:08:37 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Data-corruption-with-imx6ull-qspi-peripheral/m-p/859581#M131242</guid>
      <dc:creator>kevincronn</dc:creator>
      <dc:date>2019-03-05T15:08:37Z</dc:date>
    </item>
    <item>
      <title>Re: Data corruption with imx6ull qspi peripheral</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Data-corruption-with-imx6ull-qspi-peripheral/m-p/859582#M131243</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;inrerrupts may affect timings, as processor spends some time processing them.&lt;/P&gt;&lt;P&gt;In general qspi with interrupts working fine in nxp linux bsps on&lt;/P&gt;&lt;P&gt;&lt;A class="link-titled" href="https://source.codeaurora.org/external/imx/linux-imx/tree/?h=imx_4.14.78_1.0.0_ga" title="https://source.codeaurora.org/external/imx/linux-imx/tree/?h=imx_4.14.78_1.0.0_ga"&gt;linux-imx - i.MX Linux kernel&lt;/A&gt;&amp;nbsp;&lt;BR /&gt;Linux&amp;nbsp; Documentation&lt;BR /&gt;&lt;A class="link-titled" href="https://www.nxp.com/support/developer-resources/software-development-tools/i.mx-developer-resources/i.mx-software-and-development-tool:IMX_SW" title="https://www.nxp.com/support/developer-resources/software-development-tools/i.mx-developer-resources/i.mx-software-and-development-tool:IMX_SW"&gt;i.MX Software | NXP&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards&lt;BR /&gt;igor&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 06 Mar 2019 01:44:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Data-corruption-with-imx6ull-qspi-peripheral/m-p/859582#M131243</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2019-03-06T01:44:18Z</dc:date>
    </item>
  </channel>
</rss>

