<?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のトピックEEPROM Wait States</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/EEPROM-Wait-States/m-p/564933#M16981</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Randy Nuss on Sun Mar 24 12:37:11 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I could use more explanation of the EEPROM wait-state settings.&amp;nbsp; The user manual states: (waitstates+1)x Tclk &amp;gt;= duration.&amp;nbsp; But what duration is required?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am running the lpc4337 at 80MHz.&amp;nbsp; With the code below, a write changes an address from 0xffffffff to 0x00000000, but does not store the data.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#define EEPROM_BASE (uint32_t)0x20040000&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;volatile uint32_t *eeprom_ptr = (uint32_t *)EEPROM_BASE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/*********************************************************************//**&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @briefeeprom initialization&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @param[in]None&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @return None&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; **********************************************************************/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;void eeprom_init (void)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;uint32_t ee_clk;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;ee_clk = CGU_GetPCLKFrequency(CGU_PERIPHERAL_EEPROM);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;EECLKDIV = (ee_clk / 1500000) - 1; // 31 ;/CGU_GetPCLKFrequency(CGU_PERIPHERAL_EEPROM)/EEPROM clock=1500 KHz&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;EEPWRDWN = 0x0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//LPC_EEPROM-&amp;gt;INT_CLR_STATUS = (1 &amp;lt;&amp;lt; 2);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//LPC_EEPROM-&amp;gt;EERWSTATE = ((ee_clk / 28571429) &amp;lt;&amp;lt; 8) | (ee_clk / 14285714); //(0x3 | 0x5&amp;lt;&amp;lt;8);// Read waitstates.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//LPC_EEPROM-&amp;gt;EEWSTATE = ((ee_clk / 50000000) &amp;lt;&amp;lt; 16) | ((ee_clk / 25000000) &amp;lt;&amp;lt; 8) | (ee_clk / 100000000); // (0x2 | 0x3&amp;lt;&amp;lt;8 | 0x2&amp;lt;&amp;lt;16);//EEPROM wait state register&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;EERWSTATE = (7 &amp;lt;&amp;lt; 8) | 14;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;EEWSTATE = (4 &amp;lt;&amp;lt; 16) | (8 &amp;lt;&amp;lt; 8) | 2;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Enable AUTOPROG -erase program cycle is handled by hardware after each word is written&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;EEPAUTOPROG = 0; //0x1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/*********************************************************************//**&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @briefeeprom write&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @param[in]None&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @return None&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; **********************************************************************/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;void eeprom_write (uint32_t offset, uint32_t *buff, uint32_t word_cnt)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (word_cnt--)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;eeprom_ptr[offset] = *buff;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;INT_CLR_STATUS = 1&amp;lt;&amp;lt;2;&amp;nbsp;&amp;nbsp; // Clear Program int status bit&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;++offset;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;++buff;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;EECMD = 0x6;&amp;nbsp;&amp;nbsp;&amp;nbsp; // program EEPROM page&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while ( !(LPC_EEPROM-&amp;gt;INT_STATUS &amp;amp; (1&amp;lt;&amp;lt;2)) );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait until programming is done&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 18:49:02 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T18:49:02Z</dc:date>
    <item>
      <title>EEPROM Wait States</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/EEPROM-Wait-States/m-p/564933#M16981</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Randy Nuss on Sun Mar 24 12:37:11 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I could use more explanation of the EEPROM wait-state settings.&amp;nbsp; The user manual states: (waitstates+1)x Tclk &amp;gt;= duration.&amp;nbsp; But what duration is required?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am running the lpc4337 at 80MHz.&amp;nbsp; With the code below, a write changes an address from 0xffffffff to 0x00000000, but does not store the data.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#define EEPROM_BASE (uint32_t)0x20040000&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;volatile uint32_t *eeprom_ptr = (uint32_t *)EEPROM_BASE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/*********************************************************************//**&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @briefeeprom initialization&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @param[in]None&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @return None&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; **********************************************************************/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;void eeprom_init (void)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;uint32_t ee_clk;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;ee_clk = CGU_GetPCLKFrequency(CGU_PERIPHERAL_EEPROM);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;EECLKDIV = (ee_clk / 1500000) - 1; // 31 ;/CGU_GetPCLKFrequency(CGU_PERIPHERAL_EEPROM)/EEPROM clock=1500 KHz&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;EEPWRDWN = 0x0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//LPC_EEPROM-&amp;gt;INT_CLR_STATUS = (1 &amp;lt;&amp;lt; 2);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//LPC_EEPROM-&amp;gt;EERWSTATE = ((ee_clk / 28571429) &amp;lt;&amp;lt; 8) | (ee_clk / 14285714); //(0x3 | 0x5&amp;lt;&amp;lt;8);// Read waitstates.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//LPC_EEPROM-&amp;gt;EEWSTATE = ((ee_clk / 50000000) &amp;lt;&amp;lt; 16) | ((ee_clk / 25000000) &amp;lt;&amp;lt; 8) | (ee_clk / 100000000); // (0x2 | 0x3&amp;lt;&amp;lt;8 | 0x2&amp;lt;&amp;lt;16);//EEPROM wait state register&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;EERWSTATE = (7 &amp;lt;&amp;lt; 8) | 14;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;EEWSTATE = (4 &amp;lt;&amp;lt; 16) | (8 &amp;lt;&amp;lt; 8) | 2;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Enable AUTOPROG -erase program cycle is handled by hardware after each word is written&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;EEPAUTOPROG = 0; //0x1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/*********************************************************************//**&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @briefeeprom write&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @param[in]None&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @return None&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; **********************************************************************/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;void eeprom_write (uint32_t offset, uint32_t *buff, uint32_t word_cnt)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (word_cnt--)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;eeprom_ptr[offset] = *buff;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;INT_CLR_STATUS = 1&amp;lt;&amp;lt;2;&amp;nbsp;&amp;nbsp; // Clear Program int status bit&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;++offset;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;++buff;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_EEPROM-&amp;gt;EECMD = 0x6;&amp;nbsp;&amp;nbsp;&amp;nbsp; // program EEPROM page&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while ( !(LPC_EEPROM-&amp;gt;INT_STATUS &amp;amp; (1&amp;lt;&amp;lt;2)) );&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait until programming is done&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 18:49:02 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/EEPROM-Wait-States/m-p/564933#M16981</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T18:49:02Z</dc:date>
    </item>
  </channel>
</rss>

