www.pudn.com > SRAMtest.rar > SRAMTest070721.c, change:2007-05-06,size:6088b


/**************************************************************************** 
* 文 件 名:SRAMTest.c 
* 功    能: 检测IS61LV25616AL是否能正常工作 
****************************************************************************/ 
#include "config.h" 
#include "Functions.h" 
#define  SRAM_ADDR		0x81000000  	// SRAM的起始地址(分配为Bank1块) 
#define  SRAMMaxAddrShift   0x1FFFFF		//最大地址偏移量 
 
// 转换地址。将要发送给IS61LV25616AL的地址值进行转换,以便于LPC2214输出。 
// 由于IS61LV25616AL的A0是与LPC2214的A1相连,所以addr要左移1位。 
#define  GetAddr(addr)	(volatile uint16  *)(SRAM_ADDR|(addr<<1)) 
 
/**************************************************************************** 
* 名    称:SRAMWordProgram() 
* 功    能:半字(16位)数据编程。 
* 入口参数:Addr		编程地址(IS61LV25616AL内部地址)	 
*           Data		编程数据 
****************************************************************************/ 
uint16  SRAMWordWrite(uint32 Addr, uint16 Data)  
{   
    volatile uint16  *ip; 
     
    ip = (volatile uint16  *)(SRAM_ADDR|(Addr&0x1FFFFF)); 
    *ip = Data;				// 地址Addr,数据Data 
 
	if((int)ip == 0x81FFFFFF)//如果SRAM满,显示 
	{ 
		UART0_SendStr("\nSRAM is full."); 
		return TRUE; 
	} 
	else  
		return FALSE; 
    
 //   return(*ip); 
} 
 
/*************************************************************************** 
** 名称:SRAMWordRead() 
** 功能:半字(16位)数据读 
** 入口参数:SRAM的内部地址 
** 返回值:从该地址读取的数据 
****************************************************************************/ 
 
uint16 SRAMWordRead(uint32 Addr) 
{ 
	volatile uint16 *ip; 
 
	ip = (volatile uint16  *)(SRAM_ADDR|(Addr&0x1FFFFF)); 
 
	return (*ip); 
} 
 
/**************************************************************************** 
* 名    称:SRAMTest() 
* 功    能:检测SRAM存储器 
* 入口参数:无 
* 出口参数:无 
****************************************************************************/ 
void SRAMTest(void) 
{   
	uint8   i; 
    uint32  AddrShift;//定义地址偏移量 
	uint32  AddrReg;//定义地址寄存器 
	uint16  testdata[] = {0x0000,0x5555,0xAAAA,0xFFFF};//testdata 
	uint16  shiftreg; 
/***************************************************************************** 
** 名称:SRAM_数据_读/写 
** 功能:该测试把测试数据写入SRAM中,然后再读出来比较,测试数据为0x0000,0x5555, 
         0xAAAA和0xFFFF.该测试可以检测SRAM的正确存储原理。 
** 结果:如果有错误,显示出错的地址。 
******************************************************************************/ 
	/*依次向SRAM中写入0x0000,0x5555,0xAAAA,0xFFFF*/ 
	for (i=0;i<4;i++) 
	{ 
		AddrShift = 0; 
		while(AddrShift <= SRAMMaxAddrShift) 
		SRAMWordWrite(AddrShift++, testdata[i]); 
 
	/*从SRAM中读出,并与0x00比较,如果不相等,就记录下该地址,并通过串口显示*/ 
 
		AddrShift = 0; 
		while(AddrShift <= SRAMMaxAddrShift) 
		{ 
			if(testdata[i] != SRAMWordRead(AddrShift++)) 
			{ 
				UART0_SendStr("\nthere is a mistake at address:");//如果不对,则显示 
				AddrReg = SRAM_ADDR + AddrShift - 1;//计算出错的地址 
				UART0_SendByte1(AddrReg); 
			} 
		} 
	} 
	 
/********************************************************************************* 
** 名称:SRAM_数据_地址 
** 功能:该测试把当前的测试地址作为数据写入当前地址中.然后再从该地址出读出地址数据 
		 和该地址比较 
** 结果:如果从某个地址出读出的数不等于该地址,则串口显示出错,并显示出错地址 
***********************************************************************************/ 
	 
	AddrShift = 0; 
 
	/*把地址作为数据写入该地址,能检测的最大地址为AddrShift+0xFFFF*/ 
	while (AddrShift <= 0xFFFF) 
		SRAMWordWrite(AddrShift,(uint16)AddrShift); 
	 
	/*从SRAM中读出数据并和该地址比较*/ 
	AddrShift = 0; 
	while(AddrShift <= 0xFFFF) 
		{ 
			if(AddrShift != SRAMWordRead(AddrShift)) 
			{ 
				UART0_SendStr("\nthere is a mistake at address:");//如果不对,则显示 
				AddrReg = SRAM_ADDR + AddrShift - 1;//计算出错的地址 
				UART0_SendByte1(AddrReg); 
			} 
			AddrShift ++; 
		} 
 
/************************************************************************************ 
** 名称:SRAM_存储器_填充 
** 功能:SRAM全部写入0,然后在某个地址写入0xAAAA。这可以测试数据线和地址线连接是否正确 
** 结果:若果出错,显示出错的地址 
*************************************************************************************/ 
	AddrShift = 0; 
 
	/*将SRAM全部清零*/ 
	while(AddrShift <= SRAMMaxAddrShift) 
	SRAMWordWrite(AddrShift++, 0x0000); 
 
	/*将SRAM的某个地址写入0xAAAA*/ 
 
	SRAMWordWrite((SRAMMaxAddrShift - 0xAAAA),0xAAAA); 
 
	/*从SRAM中读数据,如果不为零且不为0xAAAA,则出错,显示出错的地址;如果为0xAAAA,但是不在 
	(AddrShift - 0xAAAA)偏移量出,则也出错,显示出错地址*/ 
	AddrShift = 0; 
	while(AddrShift <=0xFFFFFF) 
	{ 
		if (0x0000 != SRAMWordRead(AddrShift++)) 
		{ 
			/*如果读出的数据是0xAAAA,且在SRAMSRAMMaxAddrShift-0xAAAA地址出*/ 
			if((0xAAAA == SRAMWordRead(AddrShift-1)) && (AddrShift ==SRAMMaxAddrShift-0xAAAA)) 
				; 
			else 
			{ 
				UART0_SendStr("\nthere is a mistake at address:");//如果不对,则显示 
				AddrReg = SRAM_ADDR + AddrShift - 1;//计算出错的地址 
				UART0_SendByte1(AddrReg); 
			} 
		} 
	} 
 
/*********************************************************************************************** 
** 名称:SRAM_步进_1/0 
** 功能:SRAM先全写入1,然后从SRAM的最低半字节开始,1->0->1,写入,然后读出,比较 
** 结果:如果出错,就显示出错的地址 
************************************************************************************************/ 
 
	AddrShift = 0; 
 
	/*将SRAM全部置1*/ 
	while(AddrShift <= SRAMMaxAddrShift) 
	SRAMWordWrite(AddrShift++, 0xFFFF); 
 
	/*写入,读出,比较*/ 
	AddrShift = 0; 
	 
    while(AddrShift <= SRAMMaxAddrShift)//该循环测试整个SRAM 
	{ 
		 
		for(i=0;i<16;i++)//该循环测试SRAM中的每个半字 
		{ 
			shiftreg = 0xFFFF;//以下两个语句实现shiftreg循环移位 
			shiftreg ^= 1<