<?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>ColdFire/68K Microcontrollers and Processors中的主题 Re: QSPI - Sending more than one packet</title>
    <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/QSPI-Sending-more-than-one-packet/m-p/204723#M9622</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Wolf&lt;BR /&gt;&lt;BR /&gt;Can this have something to do with compiler optimisiation removing some accsses in the loops? Check that MCF_QSPI_QDR is declared as volatile.&lt;BR /&gt;&lt;BR /&gt;I have QSPI code which works when transmitting from loops - here's a snippet from an SPI FLASH driver:&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;        QAR = QSPI_COMMAND_RAM_0;                                        // set address to first control location        QDR = (QSPI_BITSE | QSPI_CS_3 | QSPI_CS_2 | QSPI_CS_1 | QSPI_CS_0); // no chip select since we control it via port - 8 bit access        QAR = QSPI_TRANSMIT_RAM_0;                                       // set address to first transmit location        if (ucCommand != CONTINUOUS_ARRAY_READ) {                        // write type            QDR = *ucData++;                                             // prepare data            while (--DataLength != 0) {                                  // for each byte in the QSPI transfer block                QDR = *ucData++;                                         // prepare data                if (++iDataCnt &amp;gt;= 15) {                                  // maximum QSPI transfer length reached                    DataLength--;                    break;                }            }            QWR = ((0&amp;lt;&amp;lt;QSPI_START_SHIFT) | (iDataCnt&amp;lt;&amp;lt;QSPI_END_SHIFT));  // starting at queue 0 send/receive programmed entries            QDLYR = QSPI_SPE;                                            // start transfer - programmed number of bytes will be sent and read in        }&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;&lt;BR /&gt;Regards&lt;BR /&gt;&lt;BR /&gt;Mark&lt;BR /&gt;&lt;BR /&gt;&lt;A href="http://www.uTasker.com" rel="nofollow noopener noreferrer" target="_blank"&gt;www.uTasker.com&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sat, 22 Mar 2008 22:08:44 GMT</pubDate>
    <dc:creator>mjbcswitzerland</dc:creator>
    <dc:date>2008-03-22T22:08:44Z</dc:date>
    <item>
      <title>QSPI - Sending more than one packet</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/QSPI-Sending-more-than-one-packet/m-p/204722#M9621</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;I'm using the M52233Demo board talking to an SPI Slave device.&amp;nbsp;When I try to send 9 packets over SPI using the queue. the data that comes out of the Coldfire part is not what I expect. My code is below;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;My Clock is good, my CS is help for the whole duration, but the data that comes out is skipping the 1st 3 btyes.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;If i change my "do" loop to "for" loops I get the same issue.&amp;nbsp; If I remove the loops and use the code&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;change 1st loop to&lt;/DIV&gt;&lt;DIV&gt;MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = MCF_QSPI_QDR_CONT |&amp;nbsp; MCF_QSPI_QDR_BITSE ;&lt;/DIV&gt;&lt;DIV&gt;MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = MCF_QSPI_QDR_CONT |&amp;nbsp; MCF_QSPI_QDR_BITSE ;&lt;/DIV&gt;&lt;DIV&gt;MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = MCF_QSPI_QDR_CONT |&amp;nbsp; MCF_QSPI_QDR_BITSE ;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;change 2nd loop to&lt;/DIV&gt;&lt;DIV&gt;MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = data[0];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; =&amp;nbsp;data[1];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = data[2];&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;It works fine.&amp;nbsp; ANy suggestions as to how i can do it in a loop? so i can use the saem function for different size transfers.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;int spi_flash_program_array(long addr, char* data, int bytecount){ int i, ii; char addr1, addr2, addr3;&amp;nbsp; char SPI_Command;&amp;nbsp; if (SPI_FLASH_MODEL == AT25F)&amp;nbsp; SPI_Command&amp;nbsp;&amp;nbsp; = AT25F_PROGRAM;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Status Command else if (SPI_FLASH_MODEL == AT26DF)&amp;nbsp; SPI_Command&amp;nbsp;&amp;nbsp; = AT26DF_PROGRAM;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Status Command&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addr1 = (addr &amp;amp; 0xFF0000)&amp;gt;&amp;gt;16;&amp;nbsp;&amp;nbsp;&amp;nbsp; addr2 = (addr &amp;amp; 0xFF00)&amp;gt;&amp;gt;8;&amp;nbsp;&amp;nbsp;&amp;nbsp; addr3 = addr &amp;amp; 0xFF;&amp;nbsp;&amp;nbsp; MCF_QSPI_QMR&amp;nbsp;&amp;nbsp; = (MCF_QSPI_QMR_MSTR | MCF_QSPI_QMR_BITS(8)&amp;nbsp; | MCF_QSPI_QMR_BAUD(2)); // Master, 16bits/transfer, 3.75Mhz MCF_QSPI_QDLYR = 0x0000;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // default delays MCF_QSPI_QIR = MCF_QSPI_QIR_SPIF;&amp;nbsp; MCF_QSPI_QAR&amp;nbsp;&amp;nbsp; = MCF_QSPI_QAR_CMD; MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = MCF_QSPI_QDR_CONT |&amp;nbsp; MCF_QSPI_QDR_BITSE ; MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = MCF_QSPI_QDR_CONT |&amp;nbsp; MCF_QSPI_QDR_BITSE ; MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = MCF_QSPI_QDR_CONT |&amp;nbsp; MCF_QSPI_QDR_BITSE ; MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = MCF_QSPI_QDR_CONT |&amp;nbsp; MCF_QSPI_QDR_BITSE ;&amp;nbsp; i=0; do {&amp;nbsp; MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = MCF_QSPI_QDR_CONT |&amp;nbsp; MCF_QSPI_QDR_BITSE ;&amp;nbsp;&amp;nbsp; printf("setting up commadn Register...\n",i, i );&amp;nbsp; i++; } while (i&amp;lt;bytecount); printf("Writting at Address=%#x...\n", addr ); MCF_QSPI_QAR&amp;nbsp;&amp;nbsp; = MCF_QSPI_QAR_TRANS;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // TX Address MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = SPI_Command;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Status Command MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = addr1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Status Command MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = addr2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Status Command MCF_QSPI_QDR&amp;nbsp;&amp;nbsp; = addr3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Status Command&amp;nbsp; i=0; do {&amp;nbsp; MCF_QSPI_QDR = data[i];&amp;nbsp;&amp;nbsp; printf("Writting %#x at Address=%#x...\n",data[i], addr+i );&amp;nbsp; i++; } while (i&amp;lt;bytecount);&amp;nbsp;&amp;nbsp;&amp;nbsp; MCF_QSPI_QWR&amp;nbsp;&amp;nbsp;&amp;nbsp; = MCF_QSPI_QWR_CSIV | MCF_QSPI_QWR_NEWQP(0) | MCF_QSPI_QWR_ENDQP(3+bytecount); // Active Low CS, Transfer 1st slot of Queue&amp;nbsp;&amp;nbsp; MCF_QSPI_QDLYR = MCF_QSPI_QDLYR_SPE;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Start Transfer&amp;nbsp; while( !(MCF_QSPI_QIR &amp;amp; MCF_QSPI_QIR_SPIF )) {&amp;nbsp; // Spin here waiting for completion&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; printf("Write Complete\n");&amp;nbsp;&amp;nbsp; return 0;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 20 Mar 2008 19:50:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/QSPI-Sending-more-than-one-packet/m-p/204722#M9621</guid>
      <dc:creator>WOLF</dc:creator>
      <dc:date>2008-03-20T19:50:29Z</dc:date>
    </item>
    <item>
      <title>Re: QSPI - Sending more than one packet</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/QSPI-Sending-more-than-one-packet/m-p/204723#M9622</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Wolf&lt;BR /&gt;&lt;BR /&gt;Can this have something to do with compiler optimisiation removing some accsses in the loops? Check that MCF_QSPI_QDR is declared as volatile.&lt;BR /&gt;&lt;BR /&gt;I have QSPI code which works when transmitting from loops - here's a snippet from an SPI FLASH driver:&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;        QAR = QSPI_COMMAND_RAM_0;                                        // set address to first control location        QDR = (QSPI_BITSE | QSPI_CS_3 | QSPI_CS_2 | QSPI_CS_1 | QSPI_CS_0); // no chip select since we control it via port - 8 bit access        QAR = QSPI_TRANSMIT_RAM_0;                                       // set address to first transmit location        if (ucCommand != CONTINUOUS_ARRAY_READ) {                        // write type            QDR = *ucData++;                                             // prepare data            while (--DataLength != 0) {                                  // for each byte in the QSPI transfer block                QDR = *ucData++;                                         // prepare data                if (++iDataCnt &amp;gt;= 15) {                                  // maximum QSPI transfer length reached                    DataLength--;                    break;                }            }            QWR = ((0&amp;lt;&amp;lt;QSPI_START_SHIFT) | (iDataCnt&amp;lt;&amp;lt;QSPI_END_SHIFT));  // starting at queue 0 send/receive programmed entries            QDLYR = QSPI_SPE;                                            // start transfer - programmed number of bytes will be sent and read in        }&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;&lt;BR /&gt;Regards&lt;BR /&gt;&lt;BR /&gt;Mark&lt;BR /&gt;&lt;BR /&gt;&lt;A href="http://www.uTasker.com" rel="nofollow noopener noreferrer" target="_blank"&gt;www.uTasker.com&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 22 Mar 2008 22:08:44 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/QSPI-Sending-more-than-one-packet/m-p/204723#M9622</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2008-03-22T22:08:44Z</dc:date>
    </item>
    <item>
      <title>Re: QSPI - Sending more than one packet</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/QSPI-Sending-more-than-one-packet/m-p/204724#M9623</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;Thanks for your help,&amp;nbsp;&amp;nbsp; Turned out it was the compilers optimization options.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I will try declaring MCF_QSPI_QDR&amp;nbsp;as volatile later and see if i can turn on optimizations again.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 24 Mar 2008 21:17:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/QSPI-Sending-more-than-one-packet/m-p/204724#M9623</guid>
      <dc:creator>WOLF</dc:creator>
      <dc:date>2008-03-24T21:17:52Z</dc:date>
    </item>
  </channel>
</rss>

