www.pudn.com > MPC8241BSP.rar > rtc.c


 
 
/* 
#include "netcomm.h" 
#include  
#include "mpc.h" 
*/ 
#include "vxWorks.h" 
#include "rtc.h"   
   
void     rtctest(void); 
void	 rtc_init(void); 
char     *get_rtc_time(void); 
STATUS   set_rtc_time(char *); 
 
 
     
void     ReadRTC(UBYTE,UBYTE*); 
void     ReadRTCBurst(UBYTE,UBYTE*); 
void     WriteRTC(UBYTE,UBYTE); 
void     HexToAscii(UBYTE,UBYTE*); 
 
char UARTData[100]; 
UBYTE *BCSR0; 
UBYTE *BCSR1; 
UBYTE *BCSR4; 
/* t_Uart_regs *UART; */ 
/* UBYTE *UART_RHR_THR_DLL0; 
UBYTE *UART_IER_DLM1; 
UBYTE *UART_FCR_ISR2; 
UBYTE *UART_LCR3; 
UBYTE *UART_MCR4; 
UBYTE *UART_LSR5; 
UBYTE *UART_MSR6; 
UBYTE *UART_SPR7; 
UBYTE *addr1; 
UBYTE *addr2; 
*/ 
/****************************************************/ 
/* function : LED  FLASH                            */ 
/****************************************************/ 
void	 rtc_init(void) 
{ 
	UBYTE RTCData[1]; 
	WriteRTC(0x8e,0); 
    WriteRTC(0x90,0xab); 
    ReadRTC(0x81,RTCData); 
	*RTCData &= ~BBIT0; 
	WriteRTC(0x80,*RTCData); 
} 
 
char *get_rtc_time() 
{ 
    
   int i,readreg; 
    UBYTE RTCData[1]; 
    char *cp; 
    UBYTE sec; 
    UBYTE min; 
    UBYTE hour; 
    UBYTE date; 
    UBYTE month; 
    UBYTE day; 
    UBYTE year; 
    for(i=0;i<100;i++) 
    UARTData[i]=NULL; 
    cp = UARTData; 
    ReadRTC(0x81,&sec); /* read clock sec*/ 
   	ReadRTC(0x83,&min); /* read clock min*/ 
   	ReadRTC(0x85,&hour); /* read clock hour*/ 
   	ReadRTC(0x87,&date); /* read clock date*/ 
   	ReadRTC(0x89,&month); /* read clock month*/ 
   	ReadRTC(0x8b,&day); /* read clock day*/ 
   	ReadRTC(0x8d,&year); /* read clock year*/ 
     
    sprintf (cp, "0x%02x:",year); 
    cp = UARTData; 
    cp+= strlen (UARTData);  
        
    sprintf (cp, "0x%02x:",month); 
    cp = UARTData; 
    cp+= strlen (UARTData); 
     
    sprintf (cp, "0x%02x:",date); 
    cp = UARTData; 
    cp+= strlen (UARTData);  
        
    sprintf (cp, "0x%02x:",day); 
    cp = UARTData; 
    cp+= strlen (UARTData);    
     
    sprintf (cp, "0x%02x:",hour); 
    cp = UARTData; 
    cp+= strlen (UARTData); 
     
    sprintf (cp, "0x%02x:",min); 
    cp = UARTData; 
    cp+= strlen (UARTData);  
     
    sprintf (cp, "0x%02x",sec); 
    cp = UARTData; 
    cp+= strlen (UARTData);  
     
         
    /* if((*RTCData)>=02&&(*RTCData)<30) */ 
    return UARTData;	   		 
    /* else 
    return NULL;	*/ 
} 
 
STATUS   set_rtc_time(char *initString) 
{ 
	char *  tok;		/* an initString token */ 
    char *  holder = NULL;	/* points to initString fragment beyond tok */ 
	UBYTE RTCData[1]; 
	 
    UBYTE sec; 
    UBYTE min; 
    UBYTE hour; 
    UBYTE date; 
    UBYTE month; 
    UBYTE day; 
    UBYTE year; 
    tok = strtok_r (initString, ":", &holder); 
    if (tok == NULL) 
		return ERROR; 
    year = strtoul (tok, NULL, 16); 
     
    tok = strtok_r (NULL, ":", &holder); 
    if (tok == NULL) 
		return ERROR; 
	month= strtoul (tok, NULL, 16); 
	 
	tok = strtok_r (NULL, ":", &holder); 
    if (tok == NULL) 
		return ERROR; 
	date = strtoul (tok, NULL, 16); 
	 
	tok = strtok_r (NULL, ":", &holder); 
    if (tok == NULL) 
		return ERROR; 
	day= strtoul (tok, NULL, 16); 
	 
	tok = strtok_r (NULL, ":", &holder); 
    if (tok == NULL) 
		return ERROR; 
	hour= strtoul (tok, NULL, 16); 
	 
	tok = strtok_r (NULL, ":", &holder); 
    if (tok == NULL) 
		return ERROR; 
	min= strtoul (tok, NULL, 16); 
	 
	tok = strtok_r (NULL, ":", &holder); 
    if (tok == NULL) 
		return ERROR; 
	sec= strtoul (tok, NULL, 16); 
	 
	 
	 
	WriteRTC(0x80,sec);	/* write clock sec */ 
    WriteRTC(0x82,min);	/* write clock min */ 
    WriteRTC(0x84,hour);	/* write clock hour */ 
    WriteRTC(0x86,date);	/* write clock date */ 
    WriteRTC(0x88,month);	/* write clock month */ 
    WriteRTC(0x8a,day);		/* write clock day */ 
    WriteRTC(0x8c,year);	/* write clock year */ 
	ReadRTC(0x8b,RTCData); 
	if((*RTCData)==day) 
		return (OK); 
	else 
		return (ERROR); 
} 
 
 
void  rtctest(void) 
{ 
     
    UBYTE ii; 
    UBYTE sec; 
    UBYTE min; 
    UBYTE hour; 
    UBYTE date; 
    UBYTE month; 
    UBYTE day; 
    UBYTE year; 
    UWORD jj; 
    UBYTE RTCData[40]; 
    UBYTE UARTData[14]; 
    /*char kk[]="\n\r************************************\n\rHow are you!张加民\n\r************************************\n\r";*/ 
    char y[] ="年"; 
    char x[]="周"; 
    char m[]="月"; 
    char d[]="日"; 
    char h[]="时"; 
    char mi[]="分"; 
    char s[]="秒"; 
     
	/* *BCSR0 = 0xff; 
    for (jj=0; jj < 100000; jj++); 
    *BCSR0 = 0x00;  */  
	 
	 
     
    /*UART_RHR_THR_DLL0=(UBYTE *)(0xff900000); 
    UART_IER_DLM1=(UBYTE *)(0xff900001); 
    UART_FCR_ISR2=(UBYTE *)(0xff900002); 
    UART_LCR3=(UBYTE *)(0xff900003); 
    UART_MCR4=(UBYTE *)(0xff900004); 
    UART_LSR5=(UBYTE *)(0xff900005); 
    UART_MSR6=(UBYTE *)(0xff900006); 
    UART_SPR7=(UBYTE *)(0xff900007); 
	 
	  *UART_LCR3 = 0x80;          
	  *UART_IER_DLM1=0x0; 
    *UART_RHR_THR_DLL0=0x78;*/	/* 9600 1.8432M 0x0c 18.431M 0x78*/ 
    /**UART_LCR3 = 0x03;*/ /* word length 8*/ 
    /**UART_FCR_ISR2 = 0x01; */ /*Enable the transmit and receive FIFO.This bit must be a "1" when other FCR bits are written to or they will not be programmed.*/ 
    /**UART_FCR_ISR2 = 0x07; */ /*clears the contents of receive FIFO and clears thecontents of transmit FIFO,resets the FIFO ciybter kiguc,*/ 
    /**UART_SPR7 =0x55;*/ /* temporary data register*/ 
	/*if((*UART_FCR_ISR2 & 0xC0)==0xC0)*/ /*当FIFO有效时*/ 
	/**UART_IER_DLM1=0x00;  */	/* Set as polling mode 不使用中断*/  
  	  
    /* *UART_MCR4 = 0x10; */ 
     
    /*addr1= (UBYTE *)(0x6000); 
    addr2= (UBYTE *)(0xff900000); 
    for (jj=0; jj < 100; jj++) 
	{	   
	*addr1=*addr2; 
	addr2++; 
	addr1++; 
	} 
   	addr1= (UBYTE *)(0x6000); 
    *UART_RHR_THR_DLL0= 0x0a; 
    *UART_RHR_THR_DLL0= 0x0d; 
    ii=1; 
    while(kk[ii]) 
    { 
	*UART_RHR_THR_DLL0= kk[ii]; 
	ii++; 
	for (jj=0; jj < 10000; jj++); 
    } 
    *UART_RHR_THR_DLL0= 0x0a; 
    *UART_RHR_THR_DLL0= 0x0d;*/ 
    printf("\n************************************\nHow are you!张加民\n************************************\n"); 
    WriteRTC(0x8e,0); 
    WriteRTC(0x90,0xab); 
    ii=1; 
    if(ii==1) 
    { 
		sec=0x00; 
		min=0x10; 
		hour=0x13; 
		date=0x16; 
		month=0x08; 
		day=0x05; 
		year=0x02; 
		WriteRTC(0x80,sec);	/* read clock sec*/ 
		WriteRTC(0x82,min);	/* read clock min*/ 
		WriteRTC(0x84,hour);	/* read clock hour*/ 
		WriteRTC(0x86,date);	/* read clock date*/ 
		WriteRTC(0x88,month);	/* read clock month*/ 
		WriteRTC(0x8a,day);	/* read clock day*/ 
		WriteRTC(0x8c,year);	/* read clock year*/ 
    } 
	/*    WriteRTC(0xc0,0x55);	*/	/* write ram*/ 
    while(1)    	    	 
    {	 
		/*ReadRTC(0xc1,RTCData);*/ /* read ram*/ 
       	ReadRTC(0x81,RTCData); /* read clock sec*/ 
       	HexToAscii(*RTCData,&UARTData[12]); 
       	ReadRTC(0x83,RTCData); /* read clock min*/ 
       	HexToAscii(*RTCData,&UARTData[10]); 
       	ReadRTC(0x85,RTCData); /* read clock hour*/ 
       	HexToAscii(*RTCData,&UARTData[8]); 
       	ReadRTC(0x87,RTCData); /* read clock date*/ 
       	HexToAscii(*RTCData,&UARTData[6]); 
       	ReadRTC(0x89,RTCData); /* read clock month*/ 
       	HexToAscii(*RTCData,&UARTData[4]); 
       	ReadRTC(0x8b,RTCData); /* read clock day*/ 
       	HexToAscii(*RTCData,&UARTData[2]); 
       	ReadRTC(0x8d,RTCData); /* read clock year*/ 
       	HexToAscii(*RTCData,&UARTData[0]); 
		for (jj=0; jj < 1000000; jj++); 
		 
		/*if ((*UART_LSR5 & 0x20) == 0x20 )  
		*UART_RHR_THR_DLL0= 0x0a; 
		*UART_RHR_THR_DLL0= 0x0d; 
		*UART_RHR_THR_DLL0= 0x32; 
		*UART_RHR_THR_DLL0= 0x30;*/ 
		/*for (jj=0; jj < 1000000; jj++); 
		*UART_RHR_THR_DLL0= UARTData[0]; 
    	*UART_RHR_THR_DLL0= UARTData[1]; 
		*UART_RHR_THR_DLL0= y[0]; 
		*UART_RHR_THR_DLL0= y[1];*/ 
		printf("\n"); 
		printf("%c",UARTData[0]); 
		printf("%c",UARTData[1]); 
		printf("%c",y[0]); 
		printf("%c",y[1]); 
		for(ii=3;ii<5;ii++) 
		{	 
			 
			/**UART_RHR_THR_DLL0= UARTData[ii*2-2];*/ 
			printf("%c",UARTData[ii*2-2]); 
			/**UART_RHR_THR_DLL0= UARTData[ii*2-1];*/ 
			printf("%c",UARTData[ii*2-1]); 
			 
			/*if(ii==2) 
			{*UART_RHR_THR_DLL0= 0x20;}*/ 
			if(ii==3) 
			{ 
				/*UART_RHR_THR_DLL0= 0x9;*/ 
    			/**UART_RHR_THR_DLL0= m[0];*/ 
    			printf("%c",m[0]); 
				/**UART_RHR_THR_DLL0= m[1];*/ 
				printf("%c",m[1]); 
			} 
			if(ii==4) 
			{ 
				/*UART_RHR_THR_DLL0= 0x9;*/ 
    			/**UART_RHR_THR_DLL0= d[0];*/ 
    			printf("%c",d[0]); 
				/**UART_RHR_THR_DLL0= d[1];*/ 
				printf("%c",d[1]); 
			} 
			if(ii==5) 
			{ 
				/*UART_RHR_THR_DLL0= 0x9;*/ 
    			/**UART_RHR_THR_DLL0= h[0];*/ 
    			printf("%c",h[0]); 
				/**UART_RHR_THR_DLL0= h[1];*/ 
				printf("%c",h[1]); 
			} 
			if(ii==6) 
			{ 
				/*UART_RHR_THR_DLL0= 0x9;*/ 
    			/**UART_RHR_THR_DLL0= mi[0];*/ 
    			printf("%c",mi[0]); 
				/**UART_RHR_THR_DLL0= mi[1];*/ 
				printf("%c",mi[1]); 
			} 
			if(ii==7) 
			{ 
				/*UART_RHR_THR_DLL0= 0x9;*/ 
    			/**UART_RHR_THR_DLL0= s[0];*/ 
    			printf("%c",s[0]); 
				/**UART_RHR_THR_DLL0= s[1];*/ 
				printf("%c",s[1]); 
			} 
			/*UART_RHR_THR_DLL0= 0x20;*/ 
			for (jj=0; jj < 100000; jj++); 
			 
		} 
		/**UART_RHR_THR_DLL0= x[0];*/ 
		printf("%c",x[0]); 
		/**UART_RHR_THR_DLL0= x[1];*/ 
		printf("%c",x[1]); 
		/**UART_RHR_THR_DLL0= UARTData[2];*/ 
		printf("%c",UARTData[2]); 
		/**UART_RHR_THR_DLL0= UARTData[3];*/ 
		printf("%c",UARTData[3]); 
		/**UART_RHR_THR_DLL0= 0x20;*/ 
		printf("%c",0x20); 
		for(ii=5;ii<8;ii++) 
		{	 
			 
			/**UART_RHR_THR_DLL0= UARTData[ii*2-2];*/ 
			printf("%c",UARTData[ii*2-2]); 
			/**UART_RHR_THR_DLL0= UARTData[ii*2-1];*/ 
			printf("%c",UARTData[ii*2-1]); 
			 
			/*if(ii==2) 
			{*UART_RHR_THR_DLL0= 0x20;}*/ 
			if(ii==3) 
			{ 
				/*UART_RHR_THR_DLL0= 0x9;*/ 
				/**UART_RHR_THR_DLL0= m[0];*/ 
				printf("%c",m[0]); 
				/**UART_RHR_THR_DLL0= m[1];*/ 
				printf("%c",m[1]); 
			} 
			if(ii==4) 
			{ 
				/*UART_RHR_THR_DLL0= 0x9;*/ 
				/**UART_RHR_THR_DLL0= d[0];*/ 
				printf("%c",d[0]); 
				/**UART_RHR_THR_DLL0= d[1];*/ 
				printf("%c",d[1]); 
			} 
			if(ii==5) 
			{ 
				/*UART_RHR_THR_DLL0= 0x9;*/ 
				/**UART_RHR_THR_DLL0= h[0];*/ 
				printf("%c",h[0]); 
				/**UART_RHR_THR_DLL0= h[1];*/ 
				printf("%c",h[1]); 
			} 
			if(ii==6) 
			{ 
				/*UART_RHR_THR_DLL0= 0x9;*/ 
				/**UART_RHR_THR_DLL0= mi[0];*/ 
				printf("%c",mi[0]); 
				/**UART_RHR_THR_DLL0= mi[1];*/ 
				printf("%c",mi[1]); 
			} 
			if(ii==7) 
			{ 
				/*UART_RHR_THR_DLL0= 0x9;*/ 
				/**UART_RHR_THR_DLL0= s[0];*/ 
				printf("%c",s[0]); 
				/**UART_RHR_THR_DLL0= s[1];*/ 
				printf("%c",s[1]); 
			} 
			/*UART_RHR_THR_DLL0= 0x20;*/ 
			for (jj=0; jj < 100000; jj++); 
			 
		} 
		 
		/**UART_RHR_THR_DLL0= 0x0a; 
		*UART_RHR_THR_DLL0= 0x0d;*/	 
		 
    }	 
	 
} 
 
 
void ReadRTC(UBYTE addr1,UBYTE* addr2) 
{ 
	UBYTE  i; 
	UBYTE  TEMP; 
	UBYTE  TEMP1; 
	UWORD  RTCi; 
	UBYTE *BCSR0; 
	UBYTE *BCSR1; 
	UBYTE *BCSR4; 
	 
	TEMP=0; 
	TEMP1=0; 
	BCSR0=(UBYTE *)(0xff800000); 
     
	BCSR1=(UBYTE *)(0xff800001); 
	BCSR4=(UBYTE *)(0xff800004); 
	*BCSR1 &= ~BBIT6;		/* SCLK '0'*/ 
	*BCSR0 &= ~BBIT4;		/* RESET '0'*/ 
	*BCSR4 |= BBIT3;		/* EPLD DIO OUTPUT*/ 
	for (RTCi=0; RTCi < 2000; RTCi++); 
	*BCSR0 |= BBIT4;		/* RESET '1'*/ 
	 
	 
	for(i = 0; i < 8; ++i) 
	{		 
		if(addr1 & 0x01) 
		{ 
			*BCSR1 |= BBIT7;	/* set port pin high to read data */ 
		} 
		else 
			*BCSR1 &= ~BBIT7; 
		*BCSR1 &= ~BBIT6;		/* SCLK '0'*/ 
		for (RTCi=0; RTCi < 100; RTCi++); 
		*BCSR1 |= BBIT6;		/* SCLK '1'*/ 
		for (RTCi=0; RTCi < 100; RTCi++); 
		addr1 >>= 1; 
	} 
    *BCSR4 &= ~BBIT3;	/* EPLD DIO INPUT*/   
	for(i=0;i<8;i++){ 
		 
		*BCSR1 |= BBIT6;		/*SCLK '1'*/ 
		for (RTCi=0; RTCi < 100; RTCi++); 
		*BCSR1 &= ~BBIT6;		/* SCLK '0'*/ 
		for (RTCi=0; RTCi < 100; RTCi++); 
		 
		TEMP=(*BCSR1 & BBIT7);			 
		TEMP<<=7; 
		TEMP1>>= 1;; 
		TEMP1 |= TEMP; 
		 
	} 
	*addr2=TEMP1; 
	*BCSR0 &= ~BBIT4;		/* RESET '0'*/ 
	for (RTCi=0; RTCi < 2000; RTCi++); 
	 
} 
 
 
void  HexToAscii(UBYTE data,UBYTE* addr ) 
{ 
	* addr=(data>>4)+0x30; 
	addr++; 
	* addr=(data&0x0f)+0x30; 
} 
 
 
void WriteRTC(UBYTE addr1,UBYTE data) 
{ 
	UBYTE  i; 
	UBYTE  TEMP; 
	UBYTE  TEMP1; 
	UWORD  RTCi; 
	UBYTE *BCSR0; 
	UBYTE *BCSR1; 
	UBYTE *BCSR4; 
	 
	TEMP=0; 
	TEMP1=0; 
	BCSR0=(UBYTE *)(0xff800000); 
     
	BCSR1=(UBYTE *)(0xff800001); 
	BCSR4=(UBYTE *)(0xff800004); 
	 
	*BCSR1 &= ~BBIT6;		/* SCLK '0'*/ 
	*BCSR0 &= ~BBIT4;		/* RESET '0'*/ 
	*BCSR4 |= BBIT3;		/* EPLD DIO OUTPUT*/ 
	for (RTCi=0; RTCi < 2000; RTCi++); 
	*BCSR0 |= BBIT4;		/* RESET '1'*/ 
	 
	 
	for(i = 0; i < 8; ++i) 
	{		 
		if(addr1 & 0x01) 
		{ 
			*BCSR1 |= BBIT7;	/* set port pin high to read data */ 
		} 
		else 
			*BCSR1 &= ~BBIT7; 
		 
		*BCSR1 &= ~BBIT6;		/* SCLK '0'*/ 
		for (RTCi=0; RTCi < 100; RTCi++); 
		*BCSR1 |= BBIT6;		/* SCLK '1'*/ 
		for (RTCi=0; RTCi < 100; RTCi++); 
		addr1 >>= 1; 
	} 
	 
	for(i = 0; i < 8; ++i) 
	{		 
		if(data & 0x01) 
		{ 
			*BCSR1 |= BBIT7;	/* set port pin high to read data */ 
		} 
		else 
			*BCSR1 &= ~BBIT7; 
		 
		*BCSR1 &= ~BBIT6;		/* SCLK '0'*/ 
		for (RTCi=0; RTCi < 100; RTCi++); 
		*BCSR1 |= BBIT6;		/* SCLK '1'*/ 
		for (RTCi=0; RTCi < 100; RTCi++); 
		data >>= 1; 
    } 
	 
	*BCSR0 &= ~BBIT4;		/* RESET '0'*/ 
	for (RTCi=0; RTCi < 2000; RTCi++); 
}