<?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 LPC1788 SDRAM timing problem in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1788-SDRAM-timing-problem/m-p/517084#M2005</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by sebgonzo on Thu Jul 05 05:54:30 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm making SDRAM layout for LPC1788. I want to do it right so I make timing budget calculations based on this article:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.edn.com%2Fdesign%2Ftest-and-measurement%2F4342433%2FPractical-timing-analysis-for-100-MHz-digital-designs" rel="nofollow" target="_blank"&gt;http://www.edn.com/design/test-and-measurement/4342433/Practical-timing-analysis-for-100-MHz-digital-designs&lt;/A&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I think there are some errors in current datasheet (rev. 4 - May 2012) of LPC1788 (Table 18 on page 25):&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;th(Q) data output hold time&amp;nbsp;&amp;nbsp; min. 0.2ns&amp;nbsp; max 1.6ns&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If I understand it correctly this means, that data output is valid only for 0.2ns (worst case) after clock. My memory device, has minimum input hold time 0.8ns (and as I know most SDRAM's has similar value). Output hold time can't be lower than input hold time. I think this th(Q) is much to low.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I compared it with LPC1850 datasheet and in my opinion this is correct value (Table 23 on page 115):&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;th(Q) data output hold time&amp;nbsp;&amp;nbsp; min. 0.5 × Tcy(clk) ns&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;where Tcy(clk) is clock period.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Also, I cant find any SDRAM layout guidelines for this microprocessor. I know there is Application Note for LPC32xx, but I can't find one for LPC1788. &lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 17:26:12 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T17:26:12Z</dc:date>
    <item>
      <title>LPC1788 SDRAM timing problem</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1788-SDRAM-timing-problem/m-p/517084#M2005</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by sebgonzo on Thu Jul 05 05:54:30 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm making SDRAM layout for LPC1788. I want to do it right so I make timing budget calculations based on this article:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.edn.com%2Fdesign%2Ftest-and-measurement%2F4342433%2FPractical-timing-analysis-for-100-MHz-digital-designs" rel="nofollow" target="_blank"&gt;http://www.edn.com/design/test-and-measurement/4342433/Practical-timing-analysis-for-100-MHz-digital-designs&lt;/A&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I think there are some errors in current datasheet (rev. 4 - May 2012) of LPC1788 (Table 18 on page 25):&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;th(Q) data output hold time&amp;nbsp;&amp;nbsp; min. 0.2ns&amp;nbsp; max 1.6ns&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If I understand it correctly this means, that data output is valid only for 0.2ns (worst case) after clock. My memory device, has minimum input hold time 0.8ns (and as I know most SDRAM's has similar value). Output hold time can't be lower than input hold time. I think this th(Q) is much to low.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I compared it with LPC1850 datasheet and in my opinion this is correct value (Table 23 on page 115):&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;th(Q) data output hold time&amp;nbsp;&amp;nbsp; min. 0.5 × Tcy(clk) ns&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;where Tcy(clk) is clock period.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Also, I cant find any SDRAM layout guidelines for this microprocessor. I know there is Application Note for LPC32xx, but I can't find one for LPC1788. &lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 17:26:12 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1788-SDRAM-timing-problem/m-p/517084#M2005</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T17:26:12Z</dc:date>
    </item>
    <item>
      <title>Re: LPC1788 SDRAM timing problem</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1788-SDRAM-timing-problem/m-p/517085#M2006</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by wmues on Thu Jul 05 07:54:49 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Are you sure you have read and understand the purpose of the delay lines in the SDRAM controller?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Please refer to the manual on the ARM website!&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In order to use the SDRAM with LPC17xx, you have to&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;- setup the SDRAM controller, using default values for the delay lines.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;- Doing a RAM test, checking the minimum and maximum usable delays.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;- store the selected delays (== the "original" values).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;- measure the special delay line for compensation == original reference value)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Inside your application,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;- measure the special delay line.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;- Adjust the other delay lines according to the original values * (actual / reference).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Ugly but working.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 17:26:13 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1788-SDRAM-timing-problem/m-p/517085#M2006</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T17:26:13Z</dc:date>
    </item>
    <item>
      <title>Re: LPC1788 SDRAM timing problem</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1788-SDRAM-timing-problem/m-p/517086#M2007</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by sebgonzo on Fri Jul 06 05:11:13 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Yes, I understand what for delay lines are. You can introduce delay to the controller clock, to compensate sdram clock delay. I'm sure that your solution is ok, but I want to do some calculations, because I'm doing PCB layout now and I want do know if it's ok. But the problem is that with timing parameters from datasheet sdram will not work, so this is why I'm suggesting an error in dataheet (or maybe I'm doing something wrong).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is my calculations:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Tclk = 12.5ns (clock period for 80MHz clock)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;TOF = 0.67ns (time of flight for 50mm data traces)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Tskew = 0ns (skew between controller clock and SDRAM clock)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Write operation (Controller to SDRAM)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;toh(CTRL)min = 0.2ns (controller minimum output data hold time)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;td(CTRL)max = 8.7ns (controlle maximum clock to data valid output delay)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;tsu(SDRAM)min = 1.5ns (SDRAM minimum setup time)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;th(SDRAM)min = 0.8ns (SDRAM minimum hold time)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;setup margin = Tclk - td(CTRL)max - TOF + Tskew - tsu(SDRAM)min = 12.5 - 8.7 - 0.67 - 0 - 1.5 = 1.63ns&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;hold margin = toh(CTRL)min + TOF - th(SDRAM)min - Tskew = 0.2 + 0.67 - 0.8 - 0 = 0.07ns&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Setup margin is ok, but hold margin is too low so let's introduce some clock skew.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Tskew = -0.5ns&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;setup margin = 12.5 - 8.7 - 0.67 + (-0.5) - 1.5 = 1.13ns&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;hold margin = 0.2 + 0.67 - 0.8 - (-0.5) = 0.57ns&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Now it's quite ok but let's look at Read operation (SDRAM to Controler)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;toh(SDRAM)min = 1.8ns (SDRAM minimum output data hold time)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;td(SDRAM)max = 6ns (SDRAM maximum clock to data valid output delay - access time)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;tsu(CTRL)min = 1.5ns (controller minimum setup time)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;th(CTRL)min = 3.7ns (controller minimum hold time)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Tskew = 0.5ns (becuase we changed data direction - SDRAM is transmitting, controller is receiving)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;setup margin = 12.5 - 6 - 0.67 + 0.5 - 1.5 = 4.83ns&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;hold margin = 1.8 + 0.67 - 3.7 - 0.5 = -1.73ns&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Hold time is negative so our SDRAM is not working at all. I can't find Tskew that both read and write time requirements are ok.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I know that my post is a bit complicated, but I'd like that someone verify my calculations (the best is someone from NXP) and say that I'm wrong or there is an error in datasheet.&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 17:26:14 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1788-SDRAM-timing-problem/m-p/517086#M2007</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T17:26:14Z</dc:date>
    </item>
    <item>
      <title>Re: LPC1788 SDRAM timing problem</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1788-SDRAM-timing-problem/m-p/517087#M2008</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by wmues on Fri Jul 06 06:51:39 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;sebgonzo,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;there is more than ONE delay line!&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;- There is one delay line to adjust the delay between the SDRAM clock and all outgoing signals.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;- And there is another delay line to adjust the delay between the SDRAM clock and the SDRAM read data latch.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;You have to adjust both lines.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;You may use from the following code fragments:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/* Transform ns into clock cycles (runtime, only 32bit multiplications):&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Valid input range: Clock &amp;lt; 995 MHz, ns = 0..1000000 (1ms)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * a) Divide Clock by 16. This gives enough headroom for step b).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * b) Multiply Clock by 69. This will adjust for decimal/binary divisor.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp; This computation will overflow for a clock &amp;gt; 995 MHz!&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp; This computation will give results 0,5% larger than the real value.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * c) Divide Clock by 1048576 (2^20). This will give enough headroom for step d).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * d) Multiply Clock by ns. This will not overflow for ns = 0..1000000 (1ms).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * e) Divide Clock by 4096 (2^12). This will give value in clocks.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * f) Add 1 to account for rounding.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * (Use runtime computations because frequencies may change in runtime).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define NS_2_EMC_CLKS(ns) ((((((EMCClock &amp;gt;&amp;gt; 4)*69) &amp;gt;&amp;gt; 20)*(ns))&amp;gt;&amp;gt;12)+1)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define NS_2_CPU_CLKS(ns) ((((((SystemCoreClock &amp;gt;&amp;gt; 4)*69) &amp;gt;&amp;gt; 20)*(ns))&amp;gt;&amp;gt;12)+1)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;// Delay loop for short busy waits&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;__attribute__( ( always_inline ) ) static inline void wait_clocks( unsigned int clocks)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; clocks &amp;gt;&amp;gt;= 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 2 Takte pro Durchlauf&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; while(clocks--) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm("":::"memory"); // hint for gcc: do not remove this loop!&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&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;&amp;nbsp; MPU Defines&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *----------------------------------------------------------------------------*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_32B&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x04&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_64B&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x05&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_128B&amp;nbsp;&amp;nbsp; 0x06&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_256B&amp;nbsp;&amp;nbsp; 0x07&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_512B&amp;nbsp;&amp;nbsp; 0x08&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_1K&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x09&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_2K&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0A&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_4K&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0B&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_8K&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0C&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_16K&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0D&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_32K&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0E&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_64K&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0F&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_128K&amp;nbsp;&amp;nbsp; 0x10&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_256K&amp;nbsp;&amp;nbsp; 0x11&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_512K&amp;nbsp;&amp;nbsp; 0x12&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_1M&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x13&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_2M&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x14&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_4M&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x15&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_8M&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x16&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_16M&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x17&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_32M&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x18&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_64M&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x19&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_128M&amp;nbsp;&amp;nbsp; 0x1A&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_256M&amp;nbsp;&amp;nbsp; 0x1B&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_512M&amp;nbsp;&amp;nbsp; 0x1C&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_1G&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x1D&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_2G&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x1E&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SIZE_4G&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x1F&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#define AP_NONE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define AP_RW&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x03&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MEM_TYPE_STRONGLY 0x04&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Strongly ordered, Sharable, no Cache, no Buffer, no allocate&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MEM_TYPE_FLASH&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x02&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Normal, Non-Sharable, Cached, no Buffer, write-through&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MEM_TYPE_IRAM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x06&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Normal, Sharable, Cached, no Buffer, write-through&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MEM_TYPE_ERAM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x07&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Normal, Sharable, Cached, Buffered, write-back &amp;amp; write allocate&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MEM_TYPE_DEVICE&amp;nbsp;&amp;nbsp; 0x05&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Device, Sharable, no Cache, Buffered, no allocate&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#define _RBAR(_ADDR, _VALID, _REGION) \&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;((_ADDR) | ((_VALID) &amp;lt;&amp;lt; 4) | (_REGION))&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#define _RASR(_XN, _AP, _TYPE, _SRD, _SIZE, _ENABLE) \&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;(((_XN) &amp;lt;&amp;lt; 28) | ((_AP) &amp;lt;&amp;lt; 24) | ((_TYPE) &amp;lt;&amp;lt; 16) | ((_SRD) &amp;lt;&amp;lt; 8) | ((_SIZE) &amp;lt;&amp;lt; 1) | (_ENABLE))&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/*----------------------------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; SDRAM calculation values&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *----------------------------------------------------------------------------*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Timing for a 133 MHz SDRAM (-75), calculated in clocks&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define RAS_LATENCY NS_2_EMC_CLKS(20)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define CAS_LATENCY 2&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define T_RP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NS_2_EMC_CLKS(20)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define T_RAS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NS_2_EMC_CLKS(45)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define T_SREX&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NS_2_EMC_CLKS(72)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define T_APR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NS_2_EMC_CLKS(20)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define T_DAL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (CAS_LATENCY+2)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define T_WR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define T_RC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NS_2_EMC_CLKS(65)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define T_RFC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NS_2_EMC_CLKS(75)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define T_XSR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NS_2_EMC_CLKS(72)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define T_RRD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NS_2_EMC_CLKS(15)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define T_MRD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define T_REFRESH&amp;nbsp;&amp;nbsp; NS_2_EMC_CLKS(15625)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;// Default Delays. Quelle: praktische Versuche&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// mit dem Embedded Artist Board . EMC Clock &amp;lt;= 80MHz, Command Delay Strategie +0.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define DEFAULT_CLKOUTDLY 0&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define DEFAULT_FBCLKDLY&amp;nbsp; 20&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define DEFAULT_CMDDLY&amp;nbsp;&amp;nbsp;&amp;nbsp; 16&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/**&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * SDRAM Delay line calibration.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * The estimated value gives a hint to correct the SDRAM timings.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @param&amp;nbsp; none&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @return value 0..4095 corresponding to the speed of logic.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Faster logik (less delay) gives larger output values.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;static unsigned int Calibrate (void)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; unsigned int i;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; unsigned int value = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; unsigned int data;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; for (i = 16; i; i--) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get a mean value&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_SC-&amp;gt;EMCCAL = 0x4000;&amp;nbsp;&amp;nbsp; // start calibration&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = LPC_SC-&amp;gt;EMCCAL;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } while (!(data &amp;amp; 0x8000));// wait until DONE&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value += data &amp;amp; 0xFF;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; return value;&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; * SDRAM Test.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * This is used at startup time (before the first usage) to find the optimum&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * delay time values.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * ATT: This test overwrites the previous SDRAM contents!&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Please note that IT IS NOT POSSIBLE to preserve these contents because&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * it might be possible that garbage address commands are output and we will&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * not know which locations are addressed during this test.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * DO NOT USE this test if executing code from SDRAM.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetKonstante, um das Testpattern zu modifizieren&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 if test OK, 0 if failure&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;static int sdram_check(uint32_t offset)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; volatile uint32_t *ram_ptr;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; uint32_t data;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; uint32_t i,j;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; uint32_t blocks;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SDRAMTEST_BLOCKSIZE 0x100&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define SDRAMTEST_JUMPSIZE&amp;nbsp; 0x10000&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; blocks = SDRAM_SIZE/(sizeof(uint32_t) * SDRAMTEST_JUMPSIZE);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; /* writing */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; ram_ptr = (uint32_t *)SDRAM_START;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; data = 0x10000 + offset;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; for (i = 0; i &amp;lt; blocks; i++)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (j = 0; j &amp;lt; SDRAMTEST_BLOCKSIZE; j++)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ram_ptr++ = data;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data += j + (j &amp;lt;&amp;lt; 4);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ram_ptr += SDRAMTEST_JUMPSIZE - SDRAMTEST_BLOCKSIZE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data += i + (i &amp;lt;&amp;lt; 4);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; /* Verifying */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; ram_ptr = (uint32_t *)SDRAM_START;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; data = 0x10000 + offset;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; for (i = 0; i &amp;lt; blocks; i++)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (j = 0; j &amp;lt; SDRAMTEST_BLOCKSIZE; j++)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (data != *ram_ptr++)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data += j + (j &amp;lt;&amp;lt; 4);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ram_ptr += SDRAMTEST_JUMPSIZE - SDRAMTEST_BLOCKSIZE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data += i + (i &amp;lt;&amp;lt; 4);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; return 1;&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; * Optimize the SDRAM delays.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * The complete range of a delay (0..31) is set, then tested by a SDRAM test.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Output value is the middle of the functional range.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @param shift&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bitshift value to point to the delay position in EMCDLYCTL&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @param def_value&amp;nbsp; Value to set if no positive range can be found.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Optimum value which is set in EMCDLYCTL.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;static unsigned int Optimize_Delay( unsigned int shift, unsigned int def_value)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; int i;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; int start_delay = -1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; int stop_delay = -1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define DELAY_RANGE 0x1F&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; for (i = 0; i &amp;lt;= DELAY_RANGE; i++) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set delay value&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_SC-&amp;gt;EMCDLYCTL = ( LPC_SC-&amp;gt;EMCDLYCTL &amp;amp; ~(DELAY_RANGE &amp;lt;&amp;lt; shift) ) | (i &amp;lt;&amp;lt; shift) ;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sdram_check(i+10+shift)) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (start_delay &amp;lt; 0)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start_delay = i;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stop_delay = i;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; // Hier an dieser Stelle wissen wir, ob das SDRAM ueberhaupt vernuenftig geht.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; if ((stop_delay - start_delay) &amp;lt; 3) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Tja, damit kann man kein Telefon fahren&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (1)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {};&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; i = (start_delay + stop_delay) / 2;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; if (i &amp;lt; 0)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = def_value;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; // set new delay value&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; LPC_SC-&amp;gt;EMCDLYCTL = ( LPC_SC-&amp;gt;EMCDLYCTL &amp;amp; ~(DELAY_RANGE &amp;lt;&amp;lt; shift) ) | (i &amp;lt;&amp;lt; shift);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; return i;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; // configure the dynamic memory read strategy.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; // ------------------------------------------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_EMC-&amp;gt;DynamicReadConfig = 0x00000001;&amp;nbsp; // Command delayed strategy + 0, using EMCCLKDELAY&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // (command delayed, clock out not delayed)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; /* Anmerkung:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; * mit Clockout Delayed Strategie (00) kann man die Data Hold Time (NXP min 0,2ns, SDRAM min 1,0ns)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; * nicht mehr sicher erreichen, also muss man zwangsweise Command Delayed verwenden.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; */&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; // Default-Werte fuer Delaylines setzen&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; LPC_SC-&amp;gt;EMCDLYCTL = (DEFAULT_CLKOUTDLY &amp;lt;&amp;lt; 24) | (DEFAULT_CLKOUTDLY &amp;lt;&amp;lt; 16) | (DEFAULT_FBCLKDLY &amp;lt;&amp;lt; 8) | DEFAULT_CMDDLY;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; // do the reference calibration&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; perm.initial_calibration_value = Calibrate();&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Delay-startwerte ausmessen, setzen und aufbewahren&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; perm.original_cmdclkdelay = Optimize_Delay( 0, DEFAULT_CMDDLY);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; perm.original_fbclkdelay&amp;nbsp; = Optimize_Delay( 8, DEFAULT_FBCLKDLY);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wir sind im Bootloader&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;CTRL = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // MPU disablen&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Flush into MPU&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __ISB();&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // instruction memory barrier&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Die Regionen sind mit unterschiedlicher Prioritaet versehen. Region 0 ist&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // die unterste, d.h. man kann sie gut als Default verwenden. Und wenn man sie so&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // programmiert, dass alle Zugriffe verboten sind, so kann man damit ungueltige&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Speicherzugriffe abfangen und die Software neu starten.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Region 0: Default ohne Zugriffsrechte, gesamter Adressbereich&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RBAR = _RBAR(0x00000000, 1, 0);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RASR = _RASR(1, AP_NONE, MEM_TYPE_STRONGLY, 0, SIZE_4G, 1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Region 1: internes Flash, internes SRAM, Boot ROM,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&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; Peripheral SRAM, AHB Peripherals&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 0x00000000 - 0x3FFFFFFF&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Subregions: 0 = Flash, 2 = SRAM, 3 = Boot ROM,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&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; 4 = Peripheral SRAM + AHB Peripherals&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RBAR = _RBAR(0x00000000, 1, 1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RASR = _RASR(0, AP_RW, MEM_TYPE_IRAM, 0xE2, SIZE_1G, 1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Region 2: Peripheral Devices&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 0x40000000 - 0x400FFFFF&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 0x42000000 - 0x43FFFFFF Bitband-Alias&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RBAR = _RBAR(0x40000000, 1, 2);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RASR = _RASR(1, AP_RW, MEM_TYPE_DEVICE, 0, SIZE_64M, 1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Region 3: ext. Chip Selects/Devices (XHFC)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 0x80000000 - 0x9000FFFF&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RBAR = _RBAR(0x80000000, 1, 3);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RASR = _RASR(1, AP_RW, MEM_TYPE_DEVICE, 0, SIZE_64K, 1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Region 4: SDRAM&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 0xA0000000 - 0xA0FFFFFF&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RBAR = _RBAR(0xA0000000, 1, 4);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RASR = _RASR(0, AP_RW, MEM_TYPE_ERAM, 0, SIZE_16M, 1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Region 5: Cortex-M3 Private Peripheral Bus&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 0xE0000000 - 0xE00FFFFF&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RBAR = _RBAR(0xE0000000, 1, 5);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RASR = _RASR(1, AP_RW, MEM_TYPE_STRONGLY, 0, SIZE_1M, 1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Region 6: not used (immer gut, eine frei zu haben)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RBAR = _RBAR(0x00000000, 1, 6);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RASR = _RASR(0, 0, 0, 0, 0, 0);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Region 7: Stack check&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RBAR = _RBAR(STACK_START, 1, 7);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;RASR = _RASR(1, AP_NONE, MEM_TYPE_IRAM, 0, SIZE_32B, 1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // MPU (wieder) einschalten&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MPU-&amp;gt;CTRL = 0x01;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // MPU enabled&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; // Flush into MPU&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; __DSB();&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; // Data Sync&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; __ISB();&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; // instruction memory barrier&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/** Diese Routine sollte in regelmaessigen Abstaenden aufgerufen werden,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * um das Timing bei Aenderungen der Umgebungsbedingungen abzustimmen.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;void adjust_timing (void)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; // wie schnell sind wir denn heute?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; unsigned int calibration_value = Calibrate();&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; // neue Kalibrierwerte errechnen&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; unsigned int fbclkdelay&amp;nbsp; = ((perm.original_fbclkdelay&amp;nbsp; * calibration_value) / perm.initial_calibration_value);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; unsigned int cmdclkdelay = ((perm.original_cmdclkdelay * calibration_value) / perm.initial_calibration_value);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; // Check the range, luke&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; if (fbclkdelay &amp;gt; 0x1F)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fbclkdelay = 0x1F;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; if (cmdclkdelay &amp;gt; 0x1F)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmdclkdelay = 0x1F;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; // Set new values&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; LPC_SC-&amp;gt;EMCDLYCTL = (DEFAULT_CLKOUTDLY &amp;lt;&amp;lt; 24) | (DEFAULT_CLKOUTDLY &amp;lt;&amp;lt; 16)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | (fbclkdelay &amp;lt;&amp;lt; 8) | cmdclkdelay;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 17:26:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1788-SDRAM-timing-problem/m-p/517087#M2008</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T17:26:15Z</dc:date>
    </item>
    <item>
      <title>Re: LPC1788 SDRAM timing problem</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1788-SDRAM-timing-problem/m-p/517088#M2009</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by sebgonzo on Fri Jul 06 07:40:50 MST 2012&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Now everything it's clear. Thank you very much. It seems that I haven't read UM carefully.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 17:26:16 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC1788-SDRAM-timing-problem/m-p/517088#M2009</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T17:26:16Z</dc:date>
    </item>
  </channel>
</rss>

