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