📄 rtc4513.c
字号:
#include <windows.h>#include <types.h>#include <memory.h>#include <nkintr.h>
#include <oal.h>
#include <bulverde.h>
#include "xllp_gpio.h"
#include "xsbase270_g.h"#define RTC_SDA (XLLP_BIT_9) //gpio9#define RTC_GET_TIME 0x1#define RTC_SETTING_TIME 0x2
#define RTC_CE (1<<0) //
#define RTC_CLK (1<<1) // #define TWH 10#define TWL 10#define TCS 15#define TCH 20#define TCR 30#define TCKS 20#define TCKH 20#define TDS 50#define TDH 50#define TRD 25#define TRZ 10#define TRF 20#define RTC_WR_MODE 0x3#define RTC_RD_MODE 0xc#define RTC4513_S1 0x0#define RTC4513_S10 0x1#define RTC4513_MI1 0x2#define RTC4513_MI10 0x3#define RTC4513_H1 0x4#define RTC4513_H10 0x5#define RTC4513_D1 0x6#define RTC4513_D10 0x7#define RTC4513_MO1 0x8#define RTC4513_MO10 0x9#define RTC4513_Y1 0xa#define RTC4513_Y10 0xb#define RTC4513_W 0xc#define RTC4513_CD 0xd#define RTC4513_CE 0xe#define RTC4513_CF 0xfstatic volatile UINT8 *g_pRTCBCRegs = NULL;
static volatile BULVERDE_GPIO_REG *g_pGPIORegs = NULL;
static volatile UINT8 *g_pRTCRegs = NULL;
//static int bcr=0;
#define XSBASE270_RTC_SETBIT(x) \
{ \
*g_pRTCBCRegs |= (x); \
*g_pRTCRegs = *g_pRTCBCRegs; \
}
#define XSBASE270_RTC_CLEARBIT(x) \
{ \
*g_pRTCBCRegs &= ~(x); \
*g_pRTCRegs = *g_pRTCBCRegs; \
}
static void Wait(UINT32 microSeconds)
{
volatile UINT32 *TimerOSCRAddress= (volatile UINT32 *) OALPAtoVA((BULVERDE_BASE_REG_PA_OST + 0x10), FALSE);
UINT32 Value, Time;
Time = *TimerOSCRAddress;
Value = Time + (microSeconds * 4);
if (Value < Time)
{ // test for wrap.
while (Time < *TimerOSCRAddress);
}
while (*TimerOSCRAddress <= Value);
}void RTC_Enable(void){ g_pGPIORegs->GPDR0 |= RTC_SDA; g_pGPIORegs->GPCR0 |= RTC_SDA; Wait(TCKS); XSBASE270_RTC_SETBIT(RTC_CE); Wait(TCS);}void RTC_Disable(void){ g_pGPIORegs->GPDR0 |= RTC_SDA; g_pGPIORegs->GPCR0 |= RTC_SDA; Wait(TCH); XSBASE270_RTC_CLEARBIT(RTC_CE); Wait(TCR);}unsigned long read_nbits(int nbit) { unsigned long data = 0; int i; g_pGPIORegs->GPDR0 &= ~RTC_SDA; for(i = 0; i < nbit; i++){ XSBASE270_RTC_SETBIT(RTC_CLK); Wait(TWH); data |= (((g_pGPIORegs->GPLR0 & RTC_SDA)!=0) ? 0x01<<i:0); XSBASE270_RTC_CLEARBIT(RTC_CLK); Wait(TWL); } Wait(TRZ); return(data);}int read_4bits(void){ return read_nbits(4);}void write_nbits(unsigned long put_data, int nbit) /* n bit instruction set download */{ int i; g_pGPIORegs->GPDR0 |= RTC_SDA; for(i=0; i < nbit; i++){ if(put_data & (0x01<<i)) g_pGPIORegs->GPSR0 |= RTC_SDA; else g_pGPIORegs->GPCR0 |= RTC_SDA; Wait(TDS); XSBASE270_RTC_SETBIT(RTC_CLK); Wait(TWH); XSBASE270_RTC_CLEARBIT(RTC_CLK); Wait(TWL); }}void write_4bits(char data){ write_nbits(data, 4);}char read_register(char address){ char ret; g_pGPIORegs->GPCR0 |= RTC_SDA; XSBASE270_RTC_CLEARBIT(RTC_CLK); RTC_Enable(); write_4bits(RTC_RD_MODE); write_4bits(address); ret = read_4bits(); RTC_Disable(); return ret;}void read_register_close(void){ RTC_Disable();}void write_register(char address, char data){ g_pGPIORegs->GPCR0 |= RTC_SDA; XSBASE270_RTC_CLEARBIT(RTC_CLK); RTC_Enable(); write_4bits(RTC_WR_MODE); write_4bits(address); write_4bits(data); RTC_Disable();}void RTC4513GetRealTime(LPSYSTEMTIME lpst){ lpst->wYear = read_register(RTC4513_Y1) + read_register(RTC4513_Y10) * 10 +2000; lpst->wMonth = read_register(RTC4513_MO1)+ read_register(RTC4513_MO10) * 10 + 1; lpst->wDayOfWeek = read_register(RTC4513_W)-1; lpst->wDay = read_register(RTC4513_D1)+ read_register(RTC4513_D10) * 10 + 1 ; lpst->wHour = read_register(RTC4513_H1)+ read_register(RTC4513_H10) * 10; lpst->wMinute = read_register(RTC4513_MI1)+ read_register(RTC4513_MI10) * 10; lpst->wSecond = read_register(RTC4513_S1)+ read_register(RTC4513_S10) * 10; lpst->wMilliseconds = 0; #if 0 RETAILMSG(1,(TEXT("RTC4513GetRealTime: Year: %u, Month: %u, Day: %u, Hour: %u, Minute: %u, second: %u \r\n"), lpst->wYear, lpst->wMonth,lpst->wDay, lpst->wHour, lpst->wMinute,lpst->wSecond));#endif return;}void RTC4513SetRealTime(LPSYSTEMTIME lpst){ lpst->wYear = lpst->wYear % 100; lpst->wDay = lpst->wDay - 1; lpst->wMonth = lpst->wMonth - 1; write_register(RTC4513_CF, 0x7); // 24h, stop, reset write_register(RTC4513_S1, lpst->wSecond%10); write_register(RTC4513_S10, lpst->wSecond/10); write_register(RTC4513_MI1, lpst->wMinute%10); write_register(RTC4513_MI10, lpst->wMinute/10); write_register(RTC4513_H1, lpst->wHour%10); write_register(RTC4513_H10, lpst->wHour/10); write_register(RTC4513_D1, lpst->wDay%10); write_register(RTC4513_D10, lpst->wDay/10); write_register(RTC4513_MO1, lpst->wMonth%10); write_register(RTC4513_MO10, lpst->wMonth/10); write_register(RTC4513_W, lpst->wDayOfWeek+1); write_register(RTC4513_Y1, (lpst->wYear ) %10); write_register(RTC4513_Y10, (lpst->wYear )/10); write_register(RTC4513_CF, 0x4); // 24h write_register(RTC4513_CD, 0x2); // ADJ, IRQ-F, CAL/HW, HOLD #if 0 RETAILMSG(1,(TEXT("RTC4513SetRealTime: Year: %u, Month: %u, Day: %u, Hour: %u, Minute: %u, second: %u \r\n"), lpst->wYear, lpst->wMonth,lpst->wDay, lpst->wHour, lpst->wMinute,lpst->wSecond));#endif return;} void RTC4513_Init(void){
g_pGPIORegs = (volatile BULVERDE_GPIO_REG *) OALPAtoVA(BULVERDE_BASE_REG_PA_GPIO, FALSE);
g_pRTCBCRegs = (volatile UINT8 *) OALPAtoVA(0xa3ff0000, FALSE);
g_pRTCRegs = (volatile UINT8 *) OALPAtoVA(0x10200000, FALSE);
if(!g_pGPIORegs || !g_pRTCBCRegs ||!g_pRTCRegs)
{
RETAILMSG(1, (L"Error in Init RTC4513!\r\n"));
return;
}
// RETAILMSG(1,(L"+++++++rtc init\r\n"));
*g_pRTCBCRegs = 0;
// RETAILMSG(1,(L"---------rtc init\r\n"));
g_pGPIORegs->GAFR0_L &=~(0x000C0000);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -