DDR SDRAM内存测试的一种官方方案(简单易懂)

#话不多说,先上图,再上代码!

DDR SDRAM内存测试的一种官方方案(简单易懂)_第1张图片

 

 ddr_base = DDR_BASE;
    ddr_size = 0x100000;    // Partial memory range

    if ( memfill32( ddr_base, ddr_size, 0xffffffff ) )
        errors += 0x01;

    if ( memfill32( ddr_base, ddr_size, 0xaaaaaaaa ) )
        errors += 0x02;

    if ( memfill32( ddr_base, ddr_size, 0x55555555 ) )
        errors += 0x04;

    if ( memfill32( ddr_base, ddr_size, 0x00000000 ) )
        errors += 0x08;




Uint32 memfill32( Uint32 start, Uint32 len, Uint32 val )
{
    Uint32 i;
    Uint32 end = start + len;
    Uint32 errorcount = 0;

    /* Write Pattern */
    for ( i = start; i < end; i += 4 )
    {
        *( volatile Uint32* )i = val;
    }

    /* Read Pattern */
    for ( i = start; i < end; i += 4 )
    {
        if ( *( volatile Uint32* )i != val )
        {
            errorcount++;
            break;
        }
    }

    return errorcount;
}
  1. DDR2的寻址方式,为 行地址+列地址+bank地址寻址,理解成2维表格就可以,你是哪一张纸上的二维表格(bank),横纵坐标定位(行列地址)。
  2. 测数据肯定得写呀,比如你有2根数据线,你写个值 0b 01,读出来是0b 10 ,00 ,11都说明你硬件有问题。连线就不对。当然了,肯定不止有2根数据线了,延伸到你有16位数据线,你写0xaaaa(1010 1010 1010 1010),如何能读到0xaaaa,说明你的硬件连线奇偶顺序是对的,因为奇数位都是0,偶数位都是1,错误也只能是第一位和第三位,或者第五位顺序跌倒。
  3. 如果上一步过了,就写数据0b 1100 1100 1100 1100,即0xcccc,把相邻2根线合并为一组,来缩小奇偶范围,接着4根线合并为一组,8根线一组,测完就可以知道你的硬件布线是否出错了。
  4. 以上就是原理,和代码不是完全对照,可以参考理解。

你可能感兴趣的:(DDR SDRAM内存测试的一种官方方案(简单易懂))