Chinaunix

标题: sdram数据线和地址线短路测试 [打印本页]

作者: sil    时间: 2009-02-04 17:08
标题: sdram数据线和地址线短路测试
在系统启动中偶尔会遇到SDRAM数据线和地址线有短路或者没有焊接等情况
有必要提高一个测试手段来检测。


Object: MT48LC4M32B2
Configuration   1M*32*4bank
refresh count  4 k
Row addressing      4k[a0---a11]
Bank addressing      4[BA0,BA1]
Column addressing   256[A0--A7]


---------------------------------------------------------------------------------

/*--------------------------------------------------------------------------------------
Function Name        :测试SDRAM的数据线和地址线是否有短路等焊接问题。
input p                 :null
output p              :null
sdram configuration:
sdram: 16MB【字节】
MTSDRAM共32条数据线,SDRAMC_A【12:0】共用地址线,bank片选  BK【1:0】
32-bit data bus width
地址线分配:共24位
23--22   21-----10  9----------0
Bk[1:0]      Row[11:0]  Column[7:0]  
检测方法:可以基本判定数据线与地址线是否有短路,具体那条线有问题的判定方法有局限性。
针对数据线:
1和0两次轮询的检测,
如  1轮询,对某一地址如0x1000,写入32次只有1个位为1 其他都为0的32位数【移位操作】,后再读此地址中数值与写入值比较,即可确定32位数据线中那条线有短路。
次数  需要写入的值   操作
0  0x1    1左移0
1  0x2    1左移1
2  0x4    1左移2
3  0x8    1左移3
4  0x10    1左移4
5  0x20    1左移5
6  0x40    1左移6
7  0x80    1左移7
。  。    。
。  。    。
。  。    。
31  0x80000000   1左移31
如  0轮询,对某一地址如0x1000,写入32次只有1个位为0其他都为1的32位数【移位操作后取反】,后再读此地址中数值与写入值比较,即可确定32位数据线中那条线有短路。
次数  需要写入的值   操作
0  ~0x1    1左移0取反
1  ~0x2    1左移1取反
2  ~0x4    1左移2取反
3  ~0x8    1左移3取反
4  ~0x10   1左移4取反
5  ~0x20   1左移5取反
6  ~0x40   1左移6取反
7  ~0x80   1左移7取反
。  。    。
。  。    。
。  。    。
31  ~0x80000000  1左移31取反
针对地址线:
因为地址线是Row[11:0]和Column[7:0]  共用
取Row来测试即21--10IO线和B1,B0
需要2个循环,循环1是写初始值,循环2是比较。
@从0x20000000开始16字节按照32存取即4字节一组进行写值操作。写入的值为对应地址。
@从0x20000000地址开始读值比较,可以初步确定地址线是否有问题,具体确定是那条线的算法见
程序部分,
--------------------------------------------------------------------------------------*/
void test_sdram_ok(void)
{
unsigned long i,j;
//unsigned  char data[1024];
volatile unsigned long *ptadr=NULL; //需要volatile
volatile unsigned long tval;   //需要volatile
unsigned long gval;
unsigned long  anddata;
unsigned long flage[14];
unsigned long *adrdes=(unsigned long *)(0x20400000);
int addr_flag=0;
/* test data bus */
printf("###Test Sdram Data Bus -1###\n\r");

ptadr=adrdes+0x40000; //随机一个地址
  
for(j=0;j
adrdes=(unsigned long *)(0x20000000);
for(i=0;i
   }
  }   
  //printf("addr  %x(unsigned long)   val of read this addr  %x\n\r",tval,gval);
  }
  adrdes++;
}
printf("Sdram test over\n");
}







本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/22754/showart_1812891.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2