<?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: LPC4357 SDRAM test only half valid in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-SDRAM-test-only-half-valid/m-p/552395#M14380</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 Nov 20 06:56:25 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Yes, burst == 4 is for 32bit data bus width, and burst == 8 for 16bit data bus width.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;So each burst gives the same amount of bytes, regardless of the bus width.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Result: the performance of 32bit bus with is not the double of 16bit width. It's less.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 18:35:06 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T18:35:06Z</dc:date>
    <item>
      <title>LPC4357 SDRAM test only half valid</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-SDRAM-test-only-half-valid/m-p/552393#M14378</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by emfytech on Thu Nov 19 21:10:43 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hello,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have connected a&amp;nbsp; ISSI IS42SM16400K-75BLI to the LPC4357.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN&gt;Datasheet: &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.mouser.com%2Fds%2F2%2F198%2F42SM-RM-VM16400K-258276.pdf" rel="nofollow noopener noreferrer" target="_blank"&gt;http://www.mouser.com/ds/2/198/42SM-RM-VM16400K-258276.pdf&lt;/A&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am having two test functions:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
uint32_t sdram_test( void )
{
&amp;nbsp; volatile uint32_t *wr_ptr;
&amp;nbsp; volatile uint16_t *short_wr_ptr;
&amp;nbsp; uint32_t data;
&amp;nbsp; uint32_t i, j;
&amp;nbsp; uint32_t uiGood = 0;
&amp;nbsp; uint32_t uiBad = 0;

&amp;nbsp; wr_ptr = (uint32_t *)SDRAM_BASE;
&amp;nbsp; short_wr_ptr = (uint16_t *)wr_ptr;

&amp;nbsp; /* 16 bit write */
&amp;nbsp; for (i = 0; i &amp;lt; SDRAM_SIZE/0x40000; i++)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (j = 0; j &amp;lt; 0x100; j++)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *short_wr_ptr++ = (i + j) &amp;amp; 0xFFFF;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *short_wr_ptr++ = ((i + j) + 1) &amp;amp; 0xFFFF;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp; }

&amp;nbsp; /* Verifying */
&amp;nbsp; wr_ptr = (uint32_t *)SDRAM_BASE;
&amp;nbsp; for (i = 0; i &amp;lt; SDRAM_SIZE/0x40000; i++)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (j = 0; j &amp;lt; 0x100; j++)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = *wr_ptr;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (data != (((((i + j) + 1) &amp;amp; 0xFFFF) &amp;lt;&amp;lt; 16) | ((i + j) &amp;amp; 0xFFFF)))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uiBad++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //return 0x0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uiGood++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wr_ptr++;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp; }
&amp;nbsp; return 0x1;
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;This results in 4096 Good read/write and 4096 Bad read/write.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;And a second test function:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
uint32_t sdram_test2(void)
{
uint32_t *ramdata;
uint32_t uiGood = 0;
&amp;nbsp; uint32_t uiBad = 0;
&amp;nbsp; uint32_t i&amp;nbsp; = 0;

ramdata = (uint32_t *)SDRAM_BASE;
for(i=0;i &amp;lt; SDRAM_SIZE/4; i++){
*ramdata = i;
ramdata++;
}

 ramdata = (uint32_t *)SDRAM_BASE;
for(i=0;i &amp;lt; SDRAM_SIZE/4; i++){
if(*ramdata != i) {
uiBad++;
}
else
uiGood++;
ramdata++;
}

return 1;

}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;This result in 1048592 Good read/write and 1048560 Bad read/write.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;It seems partly initialized because it writes about 50% of the test function without any problems. &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I just have trouble figuring out what this could be, I have tried changing timings but it all resulted in the same.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am initializing the chip the following way:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
uint32_t sdram_init (void)
{
&amp;nbsp; uint32_t temp;
&amp;nbsp; uint32_t emcclk;

&amp;nbsp; /* Select EMC clock-out */
&amp;nbsp; LPC_SCU-&amp;gt;SFSCLK_0 = (MD_PLN | MD_EZI | MD_ZI | MD_EHS);
&amp;nbsp; LPC_SCU-&amp;gt;SFSCLK_1 = (MD_PLN | MD_EZI | MD_ZI | MD_EHS);
&amp;nbsp; LPC_SCU-&amp;gt;SFSCLK_2 = (MD_PLN | MD_EZI | MD_ZI | MD_EHS);
&amp;nbsp; LPC_SCU-&amp;gt;SFSCLK_3 = (MD_PLN | MD_EZI | MD_ZI | MD_EHS);

&amp;nbsp; /* Setup EMC delays */
&amp;nbsp; LPC_SCU-&amp;gt;EMCDELAYCLK = ((CLK0_DELAY) | (CLK0_DELAY &amp;lt;&amp;lt; 4) | (CLK0_DELAY &amp;lt;&amp;lt; 8) | (CLK0_DELAY &amp;lt;&amp;lt; 12));

&amp;nbsp; /* EMC clock is half of CGU_BASE_M4 if CGU_BASE_M4 is &amp;gt;104 MHz */
&amp;nbsp; long SystemCoreClock = 204000000;
&amp;nbsp; if (SystemCoreClock &amp;gt; 104000000)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_CCU1-&amp;gt;CLK_M4_EMCDIV_CFG = ( (1&amp;lt;&amp;lt;0) | (1&amp;lt;&amp;lt;1) | (1&amp;lt;&amp;lt;2) | (1&amp;lt;&amp;lt;5) );
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_CREG-&amp;gt;CREG6 |= (1&amp;lt;&amp;lt;16);
&amp;nbsp;&amp;nbsp;&amp;nbsp; emcclk = SystemCoreClock / 2;
&amp;nbsp; }
&amp;nbsp; else
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_CCU1-&amp;gt;CLK_M4_EMCDIV_CFG = ( (1&amp;lt;&amp;lt;0) | (1&amp;lt;&amp;lt;1) | (1&amp;lt;&amp;lt;2) | (0&amp;lt;&amp;lt;5) );
&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_CREG-&amp;gt;CREG6 &amp;amp;= ~(1&amp;lt;&amp;lt;16);
&amp;nbsp;&amp;nbsp;&amp;nbsp; emcclk = SystemCoreClock;
&amp;nbsp; }

&amp;nbsp; LPC_EMC-&amp;gt;CONTROL&amp;nbsp;&amp;nbsp; = 0x00000001;
&amp;nbsp; LPC_EMC-&amp;gt;CONFIG&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000000;
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICCONFIG0&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0&amp;lt;&amp;lt;14 | 1&amp;lt;&amp;lt;12 | 1&amp;lt;&amp;lt;9 | 1&amp;lt;&amp;lt;7; /* 64Mb, 1Mx16, 4 banks, row=12, column=8 */

&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICRASCAS0&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000303; /* 3 RAS, 3 CAS latency */
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICREADCONFIG = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */

&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICRP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(emcclk, 20); //tRP
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICRAS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(emcclk, 45); //tRAS
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICSREX&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(emcclk, 80); //tXSR
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICAPR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000005;
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICDAL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(emcclk, 40); //tDAL
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICWR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(emcclk, 15); //tDPL
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICRC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(emcclk, 68); //tRC
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICRFC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(emcclk, 80); //tRFC
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICXSR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(emcclk, 80); //tXSR
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICRRD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(emcclk, 15); //tRRD
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICMRD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000002;

&amp;nbsp; chThdSleepMicroseconds(100);&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; /* wait 100us */
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICCONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000183; /* Issue NOP command */

&amp;nbsp; chThdSleepMicroseconds(200);&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; /* wait 200us */
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICCONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000103; /* Issue PALL command */

&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICREFRESH&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2; /* ( n * 16 ) -&amp;gt; 32 clock cycles */

&amp;nbsp; chThdSleepMicroseconds(200);&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; /* wait 200us */

&amp;nbsp; /* (64ms / 4096 row) */
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICREFRESH&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(emcclk, 64000000 / 4096)/16; /* ( n * 16 ) */

&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICCONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000083; /* Issue MODE command */

&amp;nbsp; temp = *((volatile uint32_t *)(SDRAM_BASE | (3&amp;lt;&amp;lt;4| 2)&amp;lt;&amp;lt;(9+2+2))); /* 4 burst, 3 CAS latency */
&amp;nbsp; temp = temp;
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICCONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000000; /* Issue NORMAL command */

&amp;nbsp; //[re]enable buffers
&amp;nbsp; LPC_EMC-&amp;gt;DYNAMICCONFIG0&amp;nbsp;&amp;nbsp;&amp;nbsp; |= 1&amp;lt;&amp;lt;19;

&amp;nbsp; return 1;
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Does anyone have an idea what could be going on here or anything I could check?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 18:35:05 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-SDRAM-test-only-half-valid/m-p/552393#M14378</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T18:35:05Z</dc:date>
    </item>
    <item>
      <title>Re: LPC4357 SDRAM test only half valid</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-SDRAM-test-only-half-valid/m-p/552394#M14379</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by emfytech on Thu Nov 19 23:29:33 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Finally got it to work, the burst had to be on 8 which was on 4.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So by changing this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
temp = *((volatile uint32_t *)(SDRAM_BASE | (3&amp;lt;&amp;lt;4| 2)&amp;lt;&amp;lt;(9+2+2))); /* 4 burst, 3 CAS latency */
temp = temp;
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Into this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
&amp;nbsp; *((volatile uint32_t *)(SDRAM_BASE | ((3 | (3 &amp;lt;&amp;lt; 4)) &amp;lt;&amp;lt; (8 + 1))));
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;It passed both test successfully.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 18:35:06 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-SDRAM-test-only-half-valid/m-p/552394#M14379</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T18:35:06Z</dc:date>
    </item>
    <item>
      <title>Re: LPC4357 SDRAM test only half valid</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-SDRAM-test-only-half-valid/m-p/552395#M14380</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 Nov 20 06:56:25 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Yes, burst == 4 is for 32bit data bus width, and burst == 8 for 16bit data bus width.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;So each burst gives the same amount of bytes, regardless of the bus width.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Result: the performance of 32bit bus with is not the double of 16bit width. It's less.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 18:35:06 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/LPC4357-SDRAM-test-only-half-valid/m-p/552395#M14380</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T18:35:06Z</dc:date>
    </item>
  </channel>
</rss>

