📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.zyinside.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: main.c
** Last modified Date: 2005-12-06
** Last Version: v1.0
** Description: DeviceARM2410测试SDRAM
** 要求使用NOR Flash启动方式 (不能引导Linux,因为如果打开MMU,测试会有问题)
** Note: 请短接实验箱上的JP1跳线,断开JP8跳线,使用串口延长线把实验箱的CZ11与PC机的COM1口相连。
** PC机端使用"超级终端"接收数据,设置波持率为115200,8位数据位,1位停止位,无奇偶校验位。
**------------------------------------------------------------------------------------------------------
** Created By: 黄绍斌
** Created date: 2005-12-06
** Version: v1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/
#include "config.h"
#define TEST_ALL_SDRAM 1 /* 是否使用SDRAM完全测试程序(为1时使用) */
// SDRAM错误指示变量
#if TEST_ALL_SDRAM==0
uint32 g_data_bus_err = 0;
uint32 g_addr_bus_err = 0;
#else
uint32 g_sdram_err = 0;
uint32 g_sdram_addr = 0;
uint8 g_test_data = 0;
uint8 g_read_data = 0;
#endif
// 定义SDRAM错误字
#define WRITE_ZERO 60
#define WRITE_DATA 68
// 运行LED灯控制字定义
#define LED_RUN (1<<21) /* GPA21,低电平时点亮 */
#define LED_RUN_MASK (~LED_RUN)
// 蜂鸣器控制
#define BEEP (1<<10) /* GPH10,低电平时蜂鸣 */
#define BEEP_MASK (~BEEP)
// SDRAM的地址(32位宽度)
#define SRAM_ADDR ((volatile unsigned int *) 0x30000000)
/*********************************************************************************************************
** Function name: DelayNS
** Descriptions: 长软件延时。
** 延时时间与系统时钟有关。
** Input: no 延时参数,值越大,延时越久
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-06
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DelayNS(uint32 no)
{
uint32 i;
for(; no>0; no--)
for(i=0; i<50000; i++);
}
/*********************************************************************************************************
** Function name: RunBeep
** Descriptions: 控制蜂鸣器Be一声音。
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-06
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void RunBeep(void)
{
rGPHDAT = rGPHDAT & BEEP_MASK; // BEEP = 0
DelayNS(8);
rGPHDAT = rGPHDAT | BEEP; // BEEP = 1
DelayNS(8);
}
/*********************************************************************************************************
** Function name: TestErr
** Descriptions: 出错报警(蜂鸣器响三声)。
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-06
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TestErr(void)
{
int i;
for(i=0; i<3; i++)
{
rGPHDAT = rGPHDAT & BEEP_MASK; // BEEP = 0
DelayNS(6);
rGPHDAT = rGPHDAT | BEEP; // BEEP = 1
DelayNS(4);
}
}
/*********************************************************************************************************
** Function name: ErrorShow
** Descriptions: 出错报警(RUN灯快闪)。
** Input: 无
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-06
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ErrorShow(void)
{
while(1)
{
rGPADAT = rGPADAT | LED_RUN;
DelayNS(2);
rGPADAT = rGPADAT & LED_RUN_MASK;
DelayNS(2);
}
}
#if TEST_ALL_SDRAM==0
/*********************************************************************************************************
** Function name: TestDataBus
** Descriptions: 对SDRAM的0地址进行数据读/写操作,以判断数据总线上的错误。
** 0地址的好处是,即使地址总线有短接错误,都能够正确读/写操作。
** Input: 无
** Output: 返回0表示测试错误,否则表示测试通过
** Created by: 黄绍斌
** Created Date: 2005-12-06
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32 TestDataBus(void)
{
uint32 wr_data;
uint32 rd_data;
uint32 i;
// 对16位数据总线进行测试
UART_SendStr("\n Data bus test\n");
wr_data = 1;
for(i=0; i<32; i++)
{
SRAM_ADDR[0x00] = wr_data; // 写数
rd_data = SRAM_ADDR[0x00]; // 读数据
if(rd_data != wr_data) // 判断读/写是否正确
{
UART_SendStr("\n Data bus is err!\n");
g_data_bus_err = i | 0xFF000000; // 错误报警设置
return(0);
}// end of if(rd_data != wr_data)...
wr_data = wr_data<<1; // 测试下一条数据线
}
UART_SendStr("\n Data bus is OK!\n");
return(1);
}
/*********************************************************************************************************
** Function name: TestAddrBus
** Descriptions: 对SDRAM的0、1、2、4...地址进行数据读/写操作,以判断地址总线上的错误。
** 数据选用0x55AA。如果数据线没有测试通过,此函数测试也不会通过。
** Input: 无
** Output: 返回0表示测试错误,否则表示测试通过
** Created by: 黄绍斌
** Created Date: 2005-12-06
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32 TestAddrBus(void)
{
uint32 rd_data;
uint32 addr;
uint32 i;
// 先一次性写入数据
UART_SendStr("\n Addr bus test\n");
addr = 1;
for(i=1; i<25; i++)
{
SRAM_ADDR[addr] = 0x5A000000 | i; // 写入0x5A00000x,其中x表示Ax地址线
addr = addr << 1; // 下一地址线
}
SRAM_ADDR[0] = 0x5A000000; // 因为若是某个地址线短接到GND,或2根地址线间短路,其操作地址都将为0 (此时0x02/0x0
// 4/0x08...等地址即是0地址),所以对0地址操作,将可以判断是否有短接。
// 对于短接到电源的地址线,也会检测出来,因为此时0地址即是0x02/0x04/0x08...等地址。
// 读出校验,判断地址线是否正确
addr = 1;
for(i=1; i<25; i++)
{
rd_data = SRAM_ADDR[addr]; // 读数据
if(rd_data != (0x5A000000 | i)) // 判断读/写是否正确
{
UART_SendStr("\n Addr bus is err!\n");
g_addr_bus_err = i | 0xFF000000; // 错误报警设置
return(0);
}// end of if(rd_data != (0x5A000000 | i))...
addr = addr << 1; // 下一地址线
}
UART_SendStr("\n Addr bus is OK!\n");
return(1);
}
#else
/*
const uint8 WriteData[] =
{
0x01, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80,
0x55, 0xaa, 0xff, 0x00
};
*/
const uint8 WriteData[] =
{
0x55, 0xaa, 0xff, 0x00
};
/*********************************************************************************************************
** Function name: TestAllSDRAM
** Descriptions: 对SDRAM的0、1、2、4...字节地址进行数据读/写操作,以判断存储器的错误。
** 会对LnWBE0--LnWBE3进行测试。
** Input: 无
** Output: 返回0表示测试错误,否则表示测试通过
** Created by: 黄绍斌
** Created Date: 2005-12-06
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32 TestAllSDRAM(void)
{
volatile uint8 *cp;
uint32 i;
uint32 j;
uint32 temp;
// 显示测试信息
UART_SendStr("\n HY57V651620 test\n");
// SDRAM填充0,使用32位宽度
UART_SendStr(" Step1 -- write 0\n");
for(i = 0; i<(64*1024*1024/4); i++)
{
SRAM_ADDR[i] = 0x00000000;
if((i & 0x0000ffff) == 0)
{
UART_SendStr(".");
}
}
// 对每一个单元进行测试,使用8位宽度
UART_SendStr("\n Step2 -- check 0, write&read \n");
cp = (uint8 *)0x30000000;
for(i = 0; i <(64*1024*1024); i++) // 测试64MB大小
{
// 校验0测试
temp = cp[0];
if(temp != 0)
{
g_sdram_err = WRITE_ZERO; // 写0失败
g_sdram_addr = 0x30000000 + i;
g_test_data = 0x00;
g_read_data = temp;
UART_SendStr("\n HY57V651620 set 0 err! \n");
return(0);
}
// 写字节数据测试
j = 0;
while(j<20) // 最多测试数据为20个
{
cp[0] = WriteData[j];
temp = cp[0];
if (temp != WriteData[j])
{
g_sdram_err = WRITE_DATA; // 写数据失败
g_sdram_addr = 0x30000000 + i;
g_test_data = WriteData[j];
g_read_data = temp;
UART_SendStr("\n HY57V651620 write and read err!\n");
return(0);
}
j++; // 指向下一个测试数据
if (WriteData[j] == 0) break; // 如果已测试完所有数据,则退出
} // end of while(j<20)...
cp++; // 指向SDRAM的下一字节
if ((i & 0x0000ffff) == 0)
{
UART_SendStr(".");
}
} // end of for (i = 0; i <(64*1024*1024); i++)...
UART_SendStr("\n HY57V651620 is OK!\n");
return(1);
}
#endif
/*********************************************************************************************************
** Function name: main
** Descriptions: 测试SDRAM。
** Input: 无
** Output: 系统返回值0
** Created by: 黄绍斌
** Created Date: 2005-12-06
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main(void)
{
// GPIO设置
rGPACON = rGPACON & (~(1<<21)); // A口,RUN灯控制口 (GPA21)
rGPHCON = (rGPHCON & (~(0x03<<20))) | (0x01<<20); // rGPHCON[21:20] = 01b,设置GPH10为I/O输出模式
UART_Select(0); // 选择UART0
UART_Init(); // 初始化UART
UART_SendStr("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
RunBeep(); // 蜂鸣一声,开始测试
rGPADAT = rGPADAT & LED_RUN_MASK; // 点亮RUN灯
#if TEST_ALL_SDRAM==0
// 快速测试SDRAM (地址线、数据线)
if(TestDataBus() == 0) TestErr();
if(TestAddrBus() == 0) TestErr();
#else
// 完全测试SDRAM
if(TestAllSDRAM() == 0) TestErr(); // 测试SDRAM
#endif
UART_SendStr("\n TestSDRAM end!\n");
RunBeep(); // 测试结束
// 测试通过,控制RUN灯闪烁
while(1)
{
rGPADAT = rGPADAT | LED_RUN;
DelayNS(30);
rGPADAT = rGPADAT & LED_RUN_MASK;
DelayNS(30);
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -