|
发表于 2011-9-1 22:33:37
|
显示全部楼层
以前做过的一个项目软件中使用的代码,提取出来,以供参考。
能使用的,好像ds1302直接接晶振,通讯口要上拉电阻的:
在main.c中主程序循环体内,每隔25ms调用一次如下的代码
#undef EXT
#define EXT extern
#include "rtc.h"
void main(void)
{
while(1)
{
//25ms ticker entry
if(25ms_ticker)
{
vClkBurstRead(RTCReadedBuf);
Time.Hour = BCD2Dec( RTCReadedBuf[HOUR] & (~( (1<<7)|(1<<5) ) ) );
Time.Minute = BCD2Dec( RTCReadedBuf[MINUTE] );
Time.Second = BCD2Dec( RTCReadedBuf[SECOND] & (~(1<<7)));
}
}
}
在rtc.h中:
#ifndef DS1302_RTC_USING_DEBUG
#define DS1302_RTC_USING_DEBUG 1
#else
#define EXT
#endif
#if DS1302_RTC_USING_DEBUG
typedef struct
{
unsigned char Hour;
unsigned char Minute;
}HOUR_MINUTE_FORMAT;
EXT HOUR_MINUTE_FORMAT RTCTime;
#define RTC_PORT_DDR_USING_DEBUG
#ifdef RTC_PORT_DDR_USING_DEBUG
//st72f324 mcu
#define RTC_Port_DDR PEDDR
/*
#define DAT_Out PEDDR |= (1<<0); PEOR |= (1<<0);
#define DAT_In PEDDR &= ~(1<<0);PEOR &= ~(1<<0);
#define CE_Out PCDDR |= (1<<1); PCOR |= (1<<1);
#define CLK_Out PEDDR |= (1<<1); PEOR |= (1<<1);
*/
#define DAT_Out PEDDR |= (1<<0);
#define DAT_In PEDDR &= ~(1<<0);
#define CE_Out PCDDR |= (1<<1);
#define CLK_Out PEDDR |= (1<<1);
#endif
//PA3, PA4, PA6 is corresponding connect to DS1302 CE, IO, SCK
#define RTC_Port PEDR.byte
#define RTC_CLK_Set (RTC_Port |= (1<<1) ) // PE.1
#define RTC_CLK_Clr (RTC_Port &= ~(1<<1))
#define RTC_DATA_Set (RTC_Port |= (1<<0) ) // PE.0
#define RTC_DATA_Clr (RTC_Port &= ~(1<<0))
#define RTC_CE_Set (PCDR |= (1<<1) ) // PC.1
#define RTC_CE_Clr (PCDR &= ~(1<<1))
#define DATA_Pin (RTC_Port & (1<<0) )
// Address/Command Byte
#define WR_SEC 0x80
#define WR_MIN 0x82
#define WR_HOUR 0x84
#define WR_DATE 0x86
#define WR_MON 0x88
#define WR_DAY 0x8A // day of a week
#define WR_YEAR 0x8C
#define WR_CTRL 0x8E
#define WR_CHG 0x90 // trickle-charge register
#define WR_CLK_BURST 0xBE
#define WR_RAM_BURST 0xFE
#define RD_SEC WR_SEC | 0x01
#define RD_MIN WR_MIN | 0x01
#define RD_HOUR WR_HOUR | 0x01
#define RD_DATE WR_DATE | 0x01
#define RD_MON WR_MON | 0x01
#define RD_DAY WR_DAY | 0x01
#define RD_YEAR WR_YEAR | 0x01
#define RD_CTRL WR_CTRL | 0x01
#define RD_CHG WR_CHG | 0x01
#define RD_CLK_BURST WR_CLK_BURST | 0x01
#define RD_RAM_BURST WR_RAM_BURST | 0x01
//regiseter address
enum
{
SECOND,
MINUTE,
HOUR,
DATE,
MONTH,
DAY, //WEEK,
YEAR,
WRITE_PROTECT,
CHARGE_MANAGE,
TIME_CALENDAR_END
};
EXT unsigned char RTCReadedBuf[TIME_CALENDAR_END];
//for rtc set step define
typedef enum
{
YEAR_SET,
MONTH_SET,
DATE_SET,
DAY_SET, //WEEK_SET,
HOUR_SET,
MINUTE_SET,
SECOND_SET,
SET_STEP_MAX
}Set_RTC_Step;
EXT unsigned char SetRTCStep;
typedef enum
{
RUNNING,
SETTING,
OTHERS
}RTC_State;
EXT unsigned char RTCState;
#define RTC_DS1302_BURST_OPERATION_DEBUG //Conditional Debug
EXT void vWriteCommand(unsigned char ucAddr, unsigned char ucData);
EXT unsigned char ucReadCommand(unsigned char ucAddr);
EXT void vInitRTC(void);
EXT void vWriteByte(unsigned char ucData);
EXT unsigned char ucReadByte(void);
#ifdef RTC_DS1302_BURST_OPERATION_DEBUG
EXT void vClkBurstWrite(unsigned char *ucData);
EXT void vClkBurstRead(unsigned char *ucData);
EXT void vRamBurstWrite(unsigned char *ucRAMData);
EXT void vRamBurstRead(unsigned char *ucRAMData);
#endif
#endif
在rtc.c中
#if DS1302_RTC_USING_DEBUG
//----------------------------------------------- Function ---------------------------------------------
// Description:
//
// Creation Date:
// Author(s): Sean Zang
//
// Related Document(s):
//
// Arguments:
// Return Value:
//
// Required excitation rate:
//
//------------------------------------------------------------------------------------------------------
//------------------------- Copyright 2006. All rights reserved - CONFIDENTIAL -------------------------
//------------------------------------------------------------------------------------------------------
void vInitRTC(void)
{
unsigned char temp;
#ifdef RTC_PORT_DDR_USING_DEBUG
CE_Out;
CLK_Out;
DAT_Out;
#endif
RTC_CE_Clr;
RTC_CLK_Clr;
RTC_DATA_Clr;
//vWriteCommand(WR_SEC, 0x00); // clock halt flag=false, second=0
vWriteCommand(WR_CHG, 0xA5); // 1 diode, 2Kohm
temp = ucReadCommand(RD_HOUR);
temp |= (1<<7); //12hour format
vWriteCommand(WR_HOUR, temp);
Re_Adjust_RTC_Finished = 0;
}
//----------------------------------------------- Function ---------------------------------------------
// Description:
//
// Creation Date:
// Author(s): Sean Zang
//
// Related Document(s):
//
// Arguments:
// Return Value:
//
// Required excitation rate:
//
//------------------------------------------------------------------------------------------------------
//------------------------- Copyright 2006. All rights reserved - CONFIDENTIAL -------------------------
//------------------------------------------------------------------------------------------------------
void vWriteCommand(unsigned char ucAddr, unsigned char ucData)
{
RTC_CE_Set;
vWriteByte(ucAddr);
vWriteByte(ucData);
RTC_CE_Clr;
}
//----------------------------------------------- Function ---------------------------------------------
// Description:
//
// Creation Date:
// Author(s): Sean Zang
//
// Related Document(s):
//
// Arguments:
// Return Value:
//
// Required excitation rate:
//
//------------------------------------------------------------------------------------------------------
//------------------------- Copyright 2006. All rights reserved - CONFIDENTIAL -------------------------
//------------------------------------------------------------------------------------------------------
unsigned char ucReadCommand(unsigned char ucAddr)
{
unsigned char temp;
RTC_CE_Set;
vWriteByte(ucAddr);
temp = ucReadByte();
RTC_CE_Clr;
return(temp);
}
//----------------------------------------------- Function ---------------------------------------------
// Description:
//
// Creation Date:
// Author(s): Sean Zang
//
// Related Document(s):
//
// Arguments:
// Return Value:
//
// Required excitation rate:
//
//------------------------------------------------------------------------------------------------------
//------------------------- Copyright 2006. All rights reserved - CONFIDENTIAL -------------------------
//------------------------------------------------------------------------------------------------------
void vWriteByte(unsigned char ucData)
{
unsigned char i;
for (i=0; i<8; i++)
{
if (ucData & 0x01)
{
RTC_DATA_Set;
}
else
{
RTC_DATA_Clr;
}
ucData >>= 1;
RTC_CLK_Set;
vDelay(5);
RTC_CLK_Clr;
vDelay(5);
}
}
//----------------------------------------------- Function ---------------------------------------------
// Description:
//
// Creation Date:
// Author(s): Sean Zang
//
// Related Document(s):
//
// Arguments:
// Return Value:
//
// Required excitation rate:
//
//------------------------------------------------------------------------------------------------------
//------------------------- Copyright 2006. All rights reserved - CONFIDENTIAL -------------------------
//------------------------------------------------------------------------------------------------------
unsigned char ucReadByte(void)
{
unsigned char i, temp;
#ifdef RTC_PORT_DDR_USING_DEBUG
DAT_In;
#endif
for(i=0,temp=0; i<8; i++)
{
temp >>= 1; //It must be place here, very Importmenting
if(DATA_Pin)
{
temp |= (1<<7);
}
else
{
temp &= ~(1<<7);
}
//
RTC_CLK_Set;
vDelay(5);
RTC_CLK_Clr;
vDelay(5);
}
#ifdef RTC_PORT_DDR_USING_DEBUG
DAT_Out;
#endif
return(temp);
}
#ifdef RTC_DS1302_BURST_OPERATION_DEBUG
//----------------------------------------------- Function ---------------------------------------------
// Description:
//
// Creation Date:
// Author(s): Sean Zang
//
// Related Document(s):
//
// Arguments:
// Return Value:
//
// Required excitation rate:
//
//------------------------------------------------------------------------------------------------------
//------------------------- Copyright 2006. All rights reserved - CONFIDENTIAL -------------------------
//------------------------------------------------------------------------------------------------------
void vClkBurstWrite(unsigned char *ucData)
{
unsigned char i;
RTC_CE_Set;
vWriteByte(WR_CLK_BURST);
for(i=0; i<8; i++)
{
vWriteByte(*ucData);
ucData++;
}
RTC_CE_Clr;
}
//----------------------------------------------- Function ---------------------------------------------
// Description:
//
// Creation Date:
// Author(s): Sean Zang
//
// Related Document(s):
//
// Arguments:
// Return Value:
//
// Required excitation rate:
//
//------------------------------------------------------------------------------------------------------
//------------------------- Copyright 2006. All rights reserved - CONFIDENTIAL -------------------------
//------------------------------------------------------------------------------------------------------
void vClkBurstRead(unsigned char *ucData)
{
unsigned char i;
RTC_CE_Set;
vWriteByte(RD_CLK_BURST);
for (i=0; i<8; i++)
{
*ucData = ucReadByte();
ucData++;
}
RTC_CE_Clr;
}
//----------------------------------------------- Function ---------------------------------------------
// Description:
//
// Creation Date:
// Author(s): Sean Zang
//
// Related Document(s):
//
// Arguments:
// Return Value:
//
// Required excitation rate:
//
//------------------------------------------------------------------------------------------------------
//------------------------- Copyright 2006. All rights reserved - CONFIDENTIAL -------------------------
//------------------------------------------------------------------------------------------------------
void vRamBurstWrite(unsigned char *ucRAMData)
{
unsigned char i;
RTC_CE_Set;
vWriteByte(WR_RAM_BURST);
for (i=0; i<31; i++)
{
vWriteByte(*ucRAMData);
ucRAMData++;
}
RTC_CE_Clr;
}
//----------------------------------------------- Function ---------------------------------------------
// Description:
//
// Creation Date:
// Author(s): Sean Zang
//
// Related Document(s):
//
// Arguments:
// Return Value:
//
// Required excitation rate:
//
//------------------------------------------------------------------------------------------------------
//------------------------- Copyright 2006. All rights reserved - CONFIDENTIAL -------------------------
//------------------------------------------------------------------------------------------------------
void vRamBurstRead(unsigned char *ucRAMData)
{
unsigned char i;
RTC_CE_Set;
vWriteByte(RD_RAM_BURST);
for (i=0; i<31; i++)
{
*ucRAMData = ucReadByte();
ucRAMData++;
}
RTC_CE_Clr;
}
#endif
//----------------------------------------------- Function ---------------------------------------------
// Description:
//
// Creation Date:
// Author(s): Sean Zang
//
// Related Document(s):
//
// Arguments:
// Return Value:
//
// Required excitation rate:
//
//------------------------------------------------------------------------------------------------------
//------------------------- Copyright 2008. All rights reserved - CONFIDENTIAL -------------------------
//------------------------------------------------------------------------------------------------------
#if RTC_SETTING_ENABLE
#define PM 0 //1
void vForcibledSetRTC(void)
{
RTCReadedBuf[YEAR] = 0x08;
RTCReadedBuf[DAY] = 0x06; //week
RTCReadedBuf[MONTH] = 0x11;
RTCReadedBuf[DATE] = 0x08;
#if PM
RTCReadedBuf[HOUR] = 0x11 | (1<<7) | (1<<5); //12format PM
#else
RTCReadedBuf[HOUR] = 0x01 | (1<<7) | (0<<5); //12format AM
#endif
RTCReadedBuf[MINUTE] = 0x50;
RTCReadedBuf[SECOND] = 0x00;
RTCReadedBuf[WRITE_PROTECT] = 0x00;
RTCReadedBuf[CHARGE_MANAGE] = 0xa5;
vClkBurstWrite(RTCReadedBuf);
}
#endif
#endif
#endif
//2008-7-25 9:00 added |
|