⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dm642main.c

📁 SEED的VPM642测试程序-板级支持库
💻 C
字号:
/********************************************************************/
/*  Copyright 2004 by SEED Incorporated.							*/
/*  All rights reserved. Property of SEED Incorporated.				*/
/*  Restricted rights to use, duplicate or disclose this code are	*/
/*  granted through contract.									    */
/*  															    */
/********************************************************************/
/*
 *---------dm642main.c---------
 * This example uses a timer to read and write the ESAM.
 */


#include <stdio.h>
//#include <string.h>
#include <stdlib.h>

#include <csl.h>
#include <std.h>
#include <csl_irq.h>
#include <csl_chip.h>

#include "seeddm642.h"
#include "seed_rtciic.h"
#include "seed_eeprom.h"
#include "seed_io&led.h"
#include "seeddm642_ide.h"
#include "seeddm642_flash.h"
#include "seeddm642_uart.h"

#define SEEDDM642_SDRAM_BASE		0x80000000

SEEDDM642_RTC_Config rtcCfg = {
	0x2005,
	0x0008,
	0x0002,
	(0x004 + RTC_X1226_24),/*采用24小时的模式*/
	0x0017,
	0x0059,
	0x0003
};
Uint8 rtcregvalue = 0;

SEEDDM642_UART_Config UartConfig ={
	   0x00,/*寄存器IER*/
	   0x57,/*寄存器FCR*/
	   0x03,/*寄存器LCR*/
	   0x01,/*寄存器MCR*/
};
Uint16 uartbuffer;
SEEDDM642_UART_Handle SEEDuartHandleA;
SEEDDM642_UART_Handle SEEDuartHandleB;

void rtc_delay(Uint32 delay)
{
	Uint32 i = 0;
	for(i = 0; i<delay;i++)
	{
		SEEDDM642_waitusec(10000);
	}	
}
extern far void vectors();
/*测试SDRAM Memory*/
void mem_test();
/*测试IO*/
void IO_test();
/*测试LED*/
void LED_test();
/*测试IDE*/
void IDE_test();
/*测试Flash*/
void FLASH_test();
/*测试EEPROM*/
void EEPROM_test();
/*测试RTC写*/
void RTC_write_test();
/*测试RTC读*/
void RTC_read_test();
/*测试UART_A*/
void UART_A_test();
/*测试UART_B*/
void UART_B_test();

Uint32 bsltest = 0;
/* Define source and destination arrays for flash tests */
Uint16 buffer[256];
Uint32 atabuffer[512];
ATA_command atacommand;
char view[30];

/*此程序为BSL库的测试,命令参数从GEL菜单中传入*/
void main()
{

/*-------------------------------------------------------*/
/* perform all initializations                           */
/*-------------------------------------------------------*/
	SEEDVPM642_init();
/*----------------------------------------------------------*/
	/*中断向量表的初始化*/
	IRQ_globalDisable();
	//Point to the IRQ vector table
    IRQ_setVecs(vectors);  
/*----------------------------------------------------------*/
	*(int *)0x3FC = 0;
	
	 /* Open UART */
    SEEDuartHandleA = SEEDDM642_UART_open(SEEDDM642_UARTA, 
    									  SEEDDM642_UART_BAUD9600, 
    									  &UartConfig);
    /*Open UARTB*/
    SEEDuartHandleB = SEEDDM642_UART_open(SEEDDM642_UARTB, 
    									  SEEDDM642_UART_BAUD9600, 
    									  &UartConfig);
	/*test all*/
	while(TRUE)
	{
		bsltest = *(int *)0x3FC;
		bsltest = bsltest & 0xFF;
		switch(bsltest)
		{
			case 0xA0:
			/*测试SDRAM Memory*/
			*(int *)0x3FC = 0xFF;
			mem_test();
			break;
			case 0xA1:
			/*测试LED*/
			*(int *)0x3FC = 0xFF;
			LED_test();
			printf("the led test is finished!\n");
			break;
			case 0xA2:
			*(int *)0x3FC = 0xFF;
			/*测试IO*/
			IO_test();
			break;
			case 0xA3:
			/*测试IDE*/
			*(int *)0x3FC = 0xFF;
			IDE_test();
			break;
			case 0xA4:
			/*测试Flash*/
			*(int *)0x3FC = 0xFF;
			FLASH_test();
			break;
			case 0xA5:
			/*测试EEPROM*/
			*(int *)0x3FC = 0xFF;
			EEPROM_test();
			break;
			case 0xA6:
			/*测试RTC写*/
			*(int *)0x3FC = 0xFF;
			RTC_write_test();
			break;
			case 0xA7:
			/*测试RTC读*/
			RTC_read_test();
			break;
			case 0xA8:
			/*测试UART_A*/
			UART_A_test();
			break;
			case 0xA9:
			/*测试UART_A*/
			UART_B_test();
			break;
			default:
			break;
		}
	}
}
/*测试SDRAM Memory*/
void mem_test()
{
	Uint32 i;
	Uint8 check = 0;
	Uint32 block = 0;
	/*sdram的测试,sdram的地址从0x8000 0000开始,长度为32M字节*/
	//写头256个字节
	for(block = 0;block <0x20000;block++)
	{
		for(i = 0;i<0x100;i++)
		{
			*((Uint8 *)(SEEDDM642_SDRAM_BASE + i+(block<<8))) = i;
		}
		/*read and check*/
		for(i = 0;i<0x100;i++)
		{
			check = *((Uint8 *)(SEEDDM642_SDRAM_BASE + i+(block<<8)));
			if(check != i)
			{
				for(;;)
				{
					printf("the error address is 0x%x\n",SEEDDM642_SDRAM_BASE + i+(block<<8));
					break;
				}
			}
		}
	}
	printf("the SDRAM work well!\n");
	/*测试完成*/
}
/*测试IO*/
void IO_test()
{
	Uint32 temp;
	printf("the io value set is 0x55.\n");
	VPM642_io_write(0x55);
    SEEDDM642_waitusec(0x50000);
	temp = VPM642_io_read();
	temp = 0x55 | temp;

	printf("the io value readback is 0x%x\n",temp);
	printf("the io value set is 0xaa.\n");
	VPM642_io_write(0xAA);
	SEEDDM642_waitusec(0x50000);
	temp = VPM642_io_read();
	temp = 0xaa | temp;

	printf("the io value readback is 0x%x\n",temp);
	printf("the io value set is 0x33.\n");
	VPM642_io_write(0x33);
	SEEDDM642_waitusec(0x50000);
	temp = VPM642_io_read();
	temp = 0x33 | temp;
	printf("the io value readback is 0x%x\n",temp);
}
/*测试LED*/
void LED_test()
{
	int i;
	for(i = 0;i<20;i++)
	{
		VPM642_Led_onboard(VPM642_LED_D3,VPM642_LED_ON);
		SEEDDM642_waitusec(0x50000);
		VPM642_Led_onboard(VPM642_LED_D3,VPM642_LED_OFF);
		SEEDDM642_waitusec(0x50000);
		VPM642_Led_onboard(VPM642_LED_D4,VPM642_LED_ON);
		SEEDDM642_waitusec(0x50000);
		VPM642_Led_onboard(VPM642_LED_D4,VPM642_LED_OFF);
		SEEDDM642_waitusec(0x50000);
	}
}
/*测试IDE*/
void IDE_test()
{
	int  j,i;
//	Uint32 buffer[512];
	for(i = 0;i<512;i++)
	{
		atabuffer[i] = 0;
	}	
	ata_open();
/*----------------------------------------------------*/
	/*确定硬盘的型号与类型*/	
	/*提交设备确认命令*/
	atacommand.features = 0x100;
	atacommand.sector_count = 0x100;
	atacommand.LBA_l = 0x100;
	atacommand.LBA_M = 0x100;
	atacommand.LBA_H = 0x100;
	atacommand.device = 0x00;
	atacommand.prereq = ATA_BUS_DRDY;
	atacommand.complete_flag = ATA_BUS_DRQ;
	atacommand.com_code = IDENTIFY_DEVICE;
	if(FALSE ==ata_command( &atacommand,
							(Uint32)(&atabuffer),
							128))
	{
		for(;;){}
	}
	/*显示序列号*/
	i = 10;
	j = 0;
	do
	{	
		view[j++] = (atabuffer[i] >>8) & 0xff;
		view[j++] = atabuffer[i] & 0xff;
		i++;
	}while(view[j]!= 0x20);
	view[j]= 0x00;
	printf("the Serial number:%s\n",view);
	/*显示模块的名称*/
	i = 27;
	j = 0;
	do
	{	
		view[j++] = (atabuffer[i] >>8) & 0xff;
		view[j++] = atabuffer[i] & 0xff;
		i++;
	}while(view[j]!= 0x20);
	view[j] = 0x00;
	printf("the Model number:%s\n",view);
}
/*测试Flash*/
void FLASH_test()
{
	Uint16 i, j, k, page, limit;
    Uint32 startaddr, addr;
	/*FLash的测试*/
	/*测试每一页*/
    /* Program the Flash page by page, 256 words at a time */
    /* Set Flash page,选择第0页 */
    page  = 0;
    for(page = 0;page<8;page++)
    {
        SEEDDM642_rset(SEEDDM642_FLASHPAGE, page);
        /*等待延时*/
		SEEDDM642_waitusec(1);
        /* Erase all of the Flash for each page */
        SEEDDM642_FLASH_erase(SEEDDM642_FLASH_BASE, SEEDDM642_FLASH_PAGESIZE);
        /*等待延时*/
		SEEDDM642_waitusec(1);
    }
	/*取FLASh的首址*/
    addr = SEEDDM642_FLASH_BASE;
            
    for(page = 0;page<8;page++)
    {
        /*取FLASh的首址*/
    	addr = SEEDDM642_FLASH_BASE;
        /* Set Flash page*/
   		 SEEDDM642_rset(SEEDDM642_FLASHPAGE, page);       		 
   		 /*等待延时*/
		 SEEDDM642_waitusec(1);
        /*将数据写入第0页,每页512K*/
        limit = 8;
        for (i = 0; i < limit; i++)
        {
            for (j = 0; j < 128; j++)
            {
                startaddr = addr;
                /*每次写入512个字节,以16位的数据为基数*/
                for (k = 0; k < 256; k++)
                {
                    buffer[k] = (addr + i + page) & 0xffff;
                    addr += 2;
                }
                SEEDDM642_FLASH_write((Uint32)buffer, startaddr, 512);
            }
        }
   	 }
        
    /* Verify the Flash page by page, 512 bytes at a time */
    for (page = 0; page < 8; page++)
    {
        /*取FLASh的首址*/
        addr = SEEDDM642_FLASH_BASE;
        /* Set Flash page */
        SEEDDM642_rset(SEEDDM642_FLASHPAGE, page);
        /*等待延时*/
		SEEDDM642_waitusec(1);
        addr = SEEDDM642_FLASH_BASE;
        limit = 8;
        for (i = 0; i < limit; i++)
        {
            for (j = 0; j < 128; j++)
            {
                startaddr = addr;
                SEEDDM642_FLASH_read(startaddr, (Uint32)buffer, 512);
                for (k = 0; k < 256; k++)
                {
                    if (buffer[k] != ((addr + i + page) & 0xffff))
                    {     
                    	/*写入出错*/
                    	printf("the flash is error!\n");
                    	for(;;){}
                    }
                    addr += 2;
                }
            }
        }
    }
    /*测试完成*/
    printf("Flash test is OK!\n");
}
/*测试EEPROM*/
void EEPROM_test()
{
	Uint16 page, i;
    Uint8 *pdata;
	/*写eeprom*/    
    /* Write a pattern */
    for (page = 0; page < 4; page++)
    {
        pdata = (Uint8 *)buffer;
        for (i = 0; i < 64; i++)
        {
            *pdata++ = (page + i) & 0xff;
        }
        SEEDDM642_EEPROM_write( SEEDVPM642_I2C_hI2C,
        						(Uint32)buffer, 
        						page << 6, 
        						64);
    }
    
    /* Verify the pattern */
    for (page = 0; page < 4; page++)
    {
        SEEDDM642_EEPROM_read( SEEDVPM642_I2C_hI2C,
                               page << 6, 
                               (Uint32)buffer, 
                               64);
        
        pdata = (Uint8 *)buffer;
        for (i = 0; i < 64; i++)
        {
            if (*pdata++ != (page + i) & 0xff)
            {
                printf("the EEPROM is fail!\n");
                for(;;){}  // Fail     
            }
        }
    }
    printf("the EEPROM is ok!\n");
}
/*测试RTC写*/
void RTC_write_test()
{
	/*设置当前的时间值*/
	/*设置年*/
	rtcregvalue = (rtcCfg.year & 0xff00)>>8;
	RTC_write( SEEDVPM642_I2C_hI2C,
						 RTC_X1226_Y2K,
						 &rtcregvalue);
						 
	rtcregvalue = rtcCfg.year & 0x00ff;
	RTC_write( SEEDVPM642_I2C_hI2C,
						 RTC_X1226_YR, 
						 &rtcregvalue);
	/*设置月*/
	rtcregvalue = rtcCfg.month;
	RTC_write( SEEDVPM642_I2C_hI2C,
						 RTC_X1226_MO,
						 &rtcregvalue);
	/*设置日*/
	rtcregvalue = rtcCfg.day;
	RTC_write( SEEDVPM642_I2C_hI2C,
						RTC_X1226_DT,
						&rtcregvalue);
	/*设置时*/
	rtcregvalue = rtcCfg.hour;
	RTC_write( SEEDVPM642_I2C_hI2C,
						RTC_X1226_HR,
						&rtcregvalue);
	/*设置分*/
	rtcregvalue = rtcCfg.minutes;
	RTC_write( SEEDVPM642_I2C_hI2C,
						 RTC_X1226_MN,
						 &rtcregvalue);
	/*设置秒*/
	rtcregvalue = rtcCfg.seconds;
	RTC_write( SEEDVPM642_I2C_hI2C,
						 RTC_X1226_SC, 
						 &rtcregvalue);
	/*设置星期*/
	rtcregvalue = rtcCfg.week;
	RTC_write( SEEDVPM642_I2C_hI2C,
						 RTC_X1226_DW,
						 &rtcregvalue);
	printf("the RTC set is over!\n");
}
/*测试RTC读*/
void RTC_read_test()
{
//   int i=0;
 //   while(1)
    {
	    /*读年*/ 
		RTC_read( SEEDVPM642_I2C_hI2C,
							RTC_X1226_Y2K,   
							&rtcregvalue);
		rtcCfg.year = ( rtcregvalue & 0x00ff)<<8;
		
		RTC_read( SEEDVPM642_I2C_hI2C,
							RTC_X1226_YR, 
							&rtcregvalue);
		rtcCfg.year = rtcCfg.year + (rtcregvalue & 0x00ff);
		/*读月*/	  
		RTC_read( SEEDVPM642_I2C_hI2C,
							RTC_X1226_MO, 
							&rtcregvalue);
		rtcCfg.month = rtcregvalue;
		/*读日*/	
		RTC_read( SEEDVPM642_I2C_hI2C,
							RTC_X1226_DT, 
							&rtcregvalue);
		rtcCfg.day = rtcregvalue;
		/*读时*/
		
		RTC_read( SEEDVPM642_I2C_hI2C,
							RTC_X1226_HR, 
							&rtcregvalue);
		rtcCfg.hour = rtcregvalue - RTC_X1226_24;
		/*读分*/	
		RTC_read( SEEDVPM642_I2C_hI2C,
							RTC_X1226_MN, 
							&rtcregvalue);
		rtcCfg.minutes = rtcregvalue;
		/*读秒*/	
		RTC_read( SEEDVPM642_I2C_hI2C,
							RTC_X1226_SC, 
							&rtcregvalue);
		rtcCfg.seconds = rtcregvalue;
		/*读星期*/	
		RTC_read( SEEDVPM642_I2C_hI2C,
							RTC_X1226_DW, 
							&rtcregvalue);
		rtcCfg.week = rtcregvalue;
		printf("time is:%x年%x月%x日%x时%x分%x秒\n",rtcCfg.year,rtcCfg.month,
					 rtcCfg.day,rtcCfg.hour,rtcCfg.minutes,rtcCfg.seconds);
		/*延时1秒钟*/
		rtc_delay(80);
//		i++;
//		if(i==6)
//			{
//			*(int *)0x3FC = 0xFF;
//			break;
//			}
		}
		
}
/*测试UART_A*/
void UART_A_test()
{   
    while(1)
    {
		/*测试串口A*/
		uartbuffer = SEEDDM642_UART_getChar(SEEDuartHandleA);
	    SEEDDM642_UART_putChar(SEEDuartHandleA, (uartbuffer & 0xff)); 
	    if((uartbuffer & 0xff)=='\r')
	       {
	          *(int *)0x3FC = 0xFF;
	          break;
	       }
      
    } 
    return;
}
/*测试UART_B*/
void UART_B_test()
{
    while(1)
    {
		uartbuffer = SEEDDM642_UART_getChar(SEEDuartHandleB);
	    SEEDDM642_UART_putChar(SEEDuartHandleB, (uartbuffer & 0xff));
       if((uartbuffer & 0xff)=='\r')
	   {
          *(int *)0x3FC = 0xFF;
          break;
       }
	} 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -