This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C129XNCZAD: SDRAM compatibility: ESMT vs Alliance

Part Number: TM4C129XNCZAD

Hi,

It's almost 2 years that we are producing our boards: MCU TivaC129 + external EPI SDRAM (for frame buffer).

We've choosen SDRAM ESMT M12L64164A(2Y) for our purpose and all was fine.

Now we've produced 6 samples with new SDRAM Alliance AS4C4M16SA, because there are some problems to find the above part number.

The main problem we have discovered is that the LCD screen shows light blue vertical lines with the same firmware.

We choosen the Alliance memory, because from datasheet they have almost the same characteristics of ESMT, but now we are not so sure that the 2 SDRAM are compatible.

Attached to this post, the timing table e the screenshot of the defect we obtain with new SDRAM.

What's going wrong?

The good image is:

  • Hi Marco,
    Did your board change with Alliance memory chip in any way that affects the capacitance on the traces compared to before?

  • May I note that your "Good Image" reveals less color saturation for both the green and orange colors. (finding 1)

    Your attempt at providing an, "A-B" comparison of images is sub-optimal as the new image fields are "wider" than the old ones.    (90mm vs. 84mm on my monitor - that's > 6% - makes the new image appear bolder!)   (finding 2)   

    Note too - there is a clear "regularity" displayed by the slight, blue, vertical bars (new image) - such regularity argues against the finding of "noise."   (may suggest an "address routing issue.")   (finding 3)

    Review of both specs - as you request - can be greatly assisted by   your (first) pre-viewing - and "Highlighting" the differences.      Forcing such high effort upon your remote "helpers" seems outside your best interest.       (i.e. although I've long been successful w/in the display field - I've no taste to perform that "pre-work" for you  -  that's "common courtesy" - is it not?)

    And - as always - no indication is provided as to the number of such "new boards" which reveal this issue.       Single board anomalies hold NO interest (bad solder joint, wrong component etc.) - multi-board issues prove far more interesting, compelling, impacting - thus warrant (much higher) effort & attention...   (especially so when "such issue" strays FAR from the forum's MCU focus - as this (clearly) does!)

  • Hi cb1.

    I'll try to reply to your consideration point by point so I cannot make mistake.

    1."May I note that your ...": You should consider that the pictures were taken with a camera and different light sources. So the issue is not saturation. 

    2. "your attempt at providing...":  the dimensions of the pictures are not the main concept that I want to show you, but my focus is on vertical lines.

    3. "note too - there is a clear...": this suggestion is quite good, but I've already done a check for addressing issue and I didn't find it.

    4. "Review of both specs...": It's strange that someone who worked a lot on the display field could not find the information in the tables I sent. This is not "common courtesy", but it's just a matter of knowing whether or not to find information in the tables above.

    5. "And as Always - no indication...": I've already filtered this kind of information. We have done a pre series with 'n' boards and all of them suffer of this kind of issue. No other issue like bad soldering, wrong compoment, etc..

    Since this is not the first time that you use such a rude approach to my post, I ask you to refrain from answering any more, as I think your considerations are of little interest.

    Regards,

    Marco Crivellari

  • Hi Charles,
    From the tables is posted above, I've done some consideration but I'd like to share with you before attempt to check capacitance on signals.

    My concern is about row pre-charge time, row cycle time, row active time and clock cycle time. Could these time differences affect the refresh time and create vertical lines on LCD?

    I suppose that there's something related to LCD controller pixel clock (set to 30 MHz) , EPIDividerSet (set to 60 MHz) and refresh time.

    Thanks,
    Regards,
    Marco
  • Hi Marco,

      I don't know which version of each memory device you have. I try to compare the widest extreme between the two. The Alliance -7 is somehow slower than ESMT -5. Can you still modify your firmware? Can you play (i.e. adjust timing) with these timing parameters in the EPI to see if it makes a difference? 

        Alliance Version -7 ESMT Version -5 unit
        min max min max ns
    row cycle time   63   53   ns
    RAS to CAS delay   21   15   ns
    precharge to refresh/low activate   21   15   ns
    row activate to row activate delay
    (different bank)
      14   10   ns
    row activate to precharge
    (same bank)
      42   38   ns
    write recovery time   2       tck
    CAS to CAS delay   1       ns
    Clock cycle time CL = 2 10   7.5   ns
    Clock cycle time CL = 3 7   5   ns
    Clock high   2.5       ns
    Clock low   2.5       ns
    Access time from CLK CL = 2   6 6   ns
    Access time from CLK CL = 3   5.4 5   ns
    Data output hold   2.5       ns
    Data otuput low impedance   0       ns
    Data output high impedance     5.4     ns
    Data/Address/Control setup time   1.5       ns
    Data/Address/Control hold  time   0.8       ns
    Mode Register set command time   2       tck
    Average refresh interval time     15.6us    64ms
  • Marco Crivellari said:
    "And as Always - no indication...": I've already filtered this kind of information.

    Yet - you failed to provide such information - did you not?        Presenting your "checks & findings" saves the time/effort of your "helpers" - who (predictably) may "duplicate your efforts" - when such efforts are "unmentioned & withheld!"

    Your judge of  "rudeness"  is not shared (rudeness does not result from simple, "statement of fact.")      Images - when presented to others for comparison & analysis - should be as "consistent as possible!"    (thus camera angle, settings, focal length should strive for consistency - did yours?)      

    Your  "expectation" that (others) would "comb thru your (voluminous) Non-MCU device data" - suggests "less than full" care/concern for your  "MCU-based, forum helpers."    You had (most likely) "already done such" - thus would have been easy for you to "highlight those areas of difference" - saving that unwanted effort (forced) upon your "would be" helpers...

    Surely you must realize that, "Speeding & Easing the efforts of others - operating entirely "in your behalf" - makes great sense.     (likely enhances those efforts - which of course - was my objective...)

    Despite your attitude - my hope is that you do (finally) succeed.       Read w/a more "open, accepting  and less hostile mindset"  - those guidelines clearly, "intend to and can aid/assist."     (such is FAR from rude...)

  • Hi Charles.

    I'm using the Alliance version -6 .

    My project is based on TI-RTOS with Peripheral Driver Library API. Below the init sequence:

    - EPIModeSet(EPI0_BASE, EPI_MODE_SDRAM);
    - EPIDividerSet(EPI0_BASE, 1);
    - EPIConfigSDRAMSet( EPI0_BASE, (EPI_SDRAM_CORE_FREQ_50_100 | EPI_SDRAM_FULL_POWER | EPI_SDRAM_SIZE_64MBIT), 900 );
    - EPIAddressMapSet(EPI0_BASE, EPI_ADDR_CODE_SIZE_16MB | EPI_ADDR_CODE_BASE_1 );

    Aside from the EPIDividerSet and EPIConfigADRAMSet, which are the other API that I've to use for play with the timing parameters?


    Regards,

    Marco
  • Hi Marco,
    The Alliance datasheet says " The internal refresh counter increments automatically on every auto refresh cycle to all of the rows. The refresh operation must be performed 4096 times within 32ms. This is actually half of the ESMT requirement which is 64ms. I will suggest you play with the - EPIConfigSDRAMSet() for the refresh rate. Currently you have 900. Try changing to 450 and see if it makes a difference.
  • Hi Charles,

    I've already done this test but I didn't see any difference.

    Regards,
    Marco
  • Hi Marco,
    Have you play with the EPIDividerSet() yet? I will suggest a few things but not sure which one is feasible for you at your current development stage:
    1) compare the PCB layouts between Alliance and ESMT
    2) if you have logic analyzer and if you can probe the EPI interface then you can compare between the two boards when accessing the EPI.
    3) Can you experiment with a third vendor memory device (non ESMT and non Alliance)?
    4) Can you replace the Alliance device with the ESMT device in the board that currently have Alliance?
  • Hi Charles.

    1. the PCB layout is the same.

    2. Work in progress...

    3. I'm going to replace the Alliance  with ISSI as soon as the samples will arrive

    4.I'm going to repllace Alliance device with ESMT in the board, but this will take a little time

    I'll let you know.

    Regards,

    Marco

  • Hi.

    Just a simple update for this post.

    All PCB constains and signals integrity are ok.

    The SDRAM is configured as:
     - EPIModeSet(EPI0_BASE, EPI_MODE_SDRAM);
     - EPIDividerSet(EPI0_BASE, 1);
     - EPIConfigSDRAMSet( EPI0_BASE, (EPI_SDRAM_CORE_FREQ_50_100 | EPI_SDRAM_FULL_POWER | EPI_SDRAM_SIZE_64MBIT), 900 );
     - EPIAddressMapSet(EPI0_BASE, EPI_ADDR_CODE_SIZE_16MB | EPI_ADDR_CODE_BASE_1 );
    and it's correct for both ESMT and Alliance, i.e. the unit test runs with no error for both (see unit test code at the bottom):

    In order to get good picture again, we modified the pixel clock divisor for the LCD Controller:
    old --> LCDModeSet(LCD0_BASE, LCD_MODE_RASTER | LCD_MODE_AUTO_UFLOW_RESTART, (120000000/4), 120000000UL);
    new --> LCDModeSet(LCD0_BASE, LCD_MODE_RASTER | LCD_MODE_AUTO_UFLOW_RESTART, (120000000/6), 120000000UL);

    There's only one side effect in doing this adjustment: the unit test on SDRAM is about 1.3 times slower than before.

    Regards,
    Marco

    -----------------------------------------------------------------------
    UNIT TEST FOR SDRAM @ 0x10000000
    -----------------------------------------------------------------------

            HAL_MEM_DATA_PATTERN                (0x55AA55AA)
            nLocation = SDRAM_NUM_BYTES / 4;
            divisor = 4;
            buffer.word = HAL_MEM_DATA_PATTERN;       

            timetick = OS_GetTimerTick();


            // ------------------------------------------------
            // WRITING...
           
            g_puiEPISdram32 = (uint32_t *)SDRAM_BASE_ADDRESS;
            g_puiEPISdram16 = (uint16_t *)SDRAM_BASE_ADDRESS;
            g_puiEPISdram8  = (uint8_t *)SDRAM_BASE_ADDRESS;

            for( i=0; i<nLocation; i++ )
            {
                switch(divisor)
                {
                case 1:
                    // write 4 word 8 bit
                    EPIWorkaroundByteWrite( g_puiEPISdram8, buffer.byte.b1 ); g_puiEPISdram8++;
                    EPIWorkaroundByteWrite( g_puiEPISdram8, buffer.byte.b2 ); g_puiEPISdram8++;
                    EPIWorkaroundByteWrite( g_puiEPISdram8, buffer.byte.b3 ); g_puiEPISdram8++;
                    EPIWorkaroundByteWrite( g_puiEPISdram8, buffer.byte.b4 ); g_puiEPISdram8++;
                    break;

                case 2:
                    // write 2 word 16 bit
                    EPIWorkaroundHWordWrite( g_puiEPISdram16, buffer.halfword.low  ); g_puiEPISdram16++;
                    EPIWorkaroundHWordWrite( g_puiEPISdram16, buffer.halfword.high ); g_puiEPISdram16++;
                    break;

                case 4:
                    // write 1 word 32bit
                    EPIWorkaroundWordWrite( g_puiEPISdram32, buffer.word ); g_puiEPISdram32++;
                    break;

                default:
                    break;
                }
            }

            // ---------------------------------------------------
            // READING...
           
            g_puiEPISdram32 = (uint32_t *)SDRAM_BASE_ADDRESS;
            g_puiEPISdram16 = (uint16_t *)SDRAM_BASE_ADDRESS;
            g_puiEPISdram8  = (uint8_t *)SDRAM_BASE_ADDRESS;

            for( i=0; i<nLocation; i++ )
            {
                buffer.word = 0;

                switch( divisor )
                {
                case 1:
                    // read 4 word 8 bit
                    buffer.byte.b1 = EPIWorkaroundByteRead( g_puiEPISdram8 ); g_puiEPISdram8++;
                    buffer.byte.b2 = EPIWorkaroundByteRead( g_puiEPISdram8 ); g_puiEPISdram8++;
                    buffer.byte.b3 = EPIWorkaroundByteRead( g_puiEPISdram8 ); g_puiEPISdram8++;
                    buffer.byte.b4 = EPIWorkaroundByteRead( g_puiEPISdram8 ); g_puiEPISdram8++;
                    break;
                case 2:
                    // read 2 word 16 bit
                    buffer.halfword.low  = EPIWorkaroundHWordRead( g_puiEPISdram16 ); g_puiEPISdram16++;
                    buffer.halfword.high = EPIWorkaroundHWordRead( g_puiEPISdram16 ); g_puiEPISdram16++;
                    break;
                case 4:
                    // read 1 word 32 bit
                    buffer.word = EPIWorkaroundWordRead( g_puiEPISdram32 ); g_puiEPISdram32++;
                    break;
                default:
                    break;
                }

                if( buffer.word != HAL_MEM_DATA_PATTERN )
                {
                    aCnt++;
                    printf( "0x%08X @ 0x%08X \n", buffer.word, SDRAM_BASE_ADDRESS + (i*divisor) );
                }
            }

            timetick = OS_GetTimerTick() - timetick;

           printf( "\n time: %d [ticks]\n", timetick );

  • If I may - the pixel clock has been reduced from 30MHz to 20MHz via your SW change.

    • is that pixel clock w/in the spec of the display?
    • is any "flicker" noted?
    • is the depth of any of the primary colors impacted?

    Lowering the pixel clock - if (not) impacting any of the above - usually produces a more robust (forgiving) interface & lessens current-draw.

    Experience teaches that it would be wise for you to test these changes upon several displays - especially those w/most recent "date codes."

    Are you satisfied w/your current results?    (I - possibly others - cannot tell from this posting)