www.pudn.com > SRAMtest.rar > SRAMTest070721.c
/****************************************************************************
* 文 件 名: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<