免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1599 | 回复: 0
打印 上一主题 下一主题

sdram数据线和地址线短路测试 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-04 17:08 |只看该作者 |倒序浏览
在系统启动中偶尔会遇到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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP