PCF8563時鐘芯片簡介
PCF8563是PHILIPS公司推出的一款工業(yè)級內(nèi)含I2C總線接口功能的具有極低功耗的多功能時鐘/日歷芯片。PCF8563的多種報警功能、定時器功能、時鐘輸出功能以及中斷輸出功能能完成各種復雜的定時服務,甚至可為單片機提供看門狗功能。內(nèi)部時鐘電路、內(nèi)部振蕩電路、內(nèi)部低電壓檢測電路(1.0V)以及兩線制I2C總線通訊方式,不但使外圍電路及其簡潔,而且也增加了芯片的可靠性。同時每次讀寫數(shù)據(jù)后,內(nèi)嵌的字地址寄存器會自動產(chǎn)生增量。當然作為時鐘芯片,PCF8563亦解決了2000年問題。因而,PCF8563是一款性價比極高的時鐘芯片,它已被廣泛用于電表、水表、氣表、電話、傳真機、便攜式儀器以及電池供電的儀器儀表等產(chǎn)品領域。
PCF8563芯片主要電氣特性
1)大工作電壓范圍:1.0~5.5V
2)400KHz 的 I2C 總線接口(VDD=1.8~5.5V 時)。
時鐘頻率最大400KH
3)i2C 總線從地址:讀,0A3H;寫,0A2H 。
PCF8563時鐘芯片驅動程序
//******************************************************
//define
//*****************************************************
#define PCF8563_ADDR 0xa2 // PCF8563設備地址
#define PCF8563_ENABLE 0x00 // 設置
#define PCF8563_SUBADDR 0x02 // 時間地址
#define PCF8563_NUMB 0x07 // 時間個數(shù)
#define PCF8563_LOOPTIME 0x02 // 循環(huán)次數(shù)
#define PCF8563_SECMASK 0x7f // second
#define PCF8563_MINMASK 0x7f // minute
#define PCF8563_HRMASK 0x3f // hour
#define PCF8563_DAYMASK 0x3f // day
#define PCF8563_WKMASK 0x07 // week
#define PCF8563_MOMASK 0x1f // month
#define PCF8563_YRMASK 0xff // year
*
void DELAY_US(Uint16 i)
{ Uint16 m,n;
for(m=0;m《i;m++)
{
for(n=0;n《5;n++)
{
_nop_();
}
}
} */
/********************************************************
** 函數(shù)名稱: void DELAY_MS(Uint16 i)
** 功能描述: 延時函數(shù)
** 輸 入:延時毫秒數(shù)
** 輸 出:無
********************************************************/
//延時函數(shù)單位ms
void DELAY_MS(Uint16 i)
{ Uint16 m,n; for(m=0;m《i;m++)
{
for(n=0;n《1000;n++)
{
_nop_();
}
}
}
********************************************************
** 函數(shù)名稱: InitCrt()
** 功能描述: SD2405的初始化
** 輸 入:無 ** 輸 出:無
********************************************************/
void InitCrt() { //設備地址
I2cDeviceAdd = PCF8563_ADDR; }
/********************************************************
** 函數(shù)名稱: CrtGetDateTime(struct SYSTEM_TIME *Time)
** 功能描述: 讀取時間
** 說 明:將從PCF8563中讀取的時間放入Time指向的結構中
** 輸 入:無
** 輸 出:無
********************************************************/
void CrtGetDateTime(struct SYSTEM_TIME *Time) {
Uint8 buf[8]; //設備地址
I2cDeviceAdd = PCF8563_ADDR;
SM_Receive (PCF8563_SUBADDR , buf, PCF8563_NUMB);
Time-》time.ucSecond = buf[0]; //秒
Time-》time.ucMinute = buf[1]; //分
Time-》time.ucHour = buf[2]; //時
屏蔽最高位 Time-》date.ucDay = buf[3]; //日
Time-》Week = buf[4]; //星期 Time-》date.ucMonth = buf[5]; //月
Time-》date.ucYear = buf[6]; //年
}
/******************************************************** ** 函數(shù)名稱: CrtSetDateTime(struct SYSTEM_TIME *Time) ** 功能描述: 設置時間
** 說 明:將Time指向的結構中日期時間參數(shù)設置到sd24.5中
** 輸 入:無 ** 輸 出:無
********************************************************/
void CrtSetDateTime(struct SYSTEM_TIME *Time)
{
Uint8 buf[8]; //設備地址
I2cDeviceAdd = PCF8563_ADDR;
//寫入設置(時鐘工作、關閉復位、關閉測試模式)
buf[0] = PCF8563_ENABLE;
SM_Send (0, buf, 0);
//寫入日期時間 buf[0] = Time-》time.ucSecond; //秒
buf[1] = Time-》time.ucMinute; //分
buf[2] = Time-》time.ucHour|0x80; //時 置為24小時格式
buf[3] = Time-》date.ucDay; //日
buf[4] = Time-》Week; //星期
buf[5] = Time-》date.ucMonth; //月
buf[6] = Time-》date.ucYear; //年
SM_Send (PCF8563_SUBADDR, buf, PCF8563_NUMB);
}
4 新華龍C8051F022的IIC驅動程序
//----------------------------------------------------------------------------- // Includes
//-----------------------------------------------------------------------------
#include 《c8051f020.h》 // SFR declarations #include 《stdio.h》
#include 《king.h》
#include 《DYSJ.h》
#include 《I2C.H》
#define SMB_FREQUENCY 10000L // Target SCL clock rate
/******************************************************************************
** 函數(shù)名稱:void SPI0_Init()
** 功能描述:I2C初始化程序
** 說 明:
1. 置下降沿有效
2. 置工作時鐘2MHz
3.
** 輸 入:無
** 輸 出:無
*******************************************************************************/
void I2C_Init() { SMB0CN = 0x44; // Enable SMBus with ACKs on acknowledge cycle
SMB0CR = -80; //257 - (SYSCLK / (2 * SMB_FREQUENCY));
EIE1 |= 2; // SMBus interrupt enable
// EA = 1; // Global interrupt enable
I2cSM_BUSY = 0; // Free SMBus for first transfer.
}
/******************************************************************************
** 函數(shù)名稱:void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count)
** 功能描述:I2C寫入程序
** 說 明:
1. 等待空閑
2. 寫入數(shù)據(jù)
3. 等待結束
** 輸 入:地址byte_address、寫入數(shù)據(jù)緩沖區(qū)*SendBuf、數(shù)量count
** 輸 出:無
*******************************************************************************/
void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count)
{
ET0 = 0; //禁止中斷
ET2 = 0; //禁止中斷
while (I2cSM_BUSY); // 等待空閑
I2cSM_BUSY = 1; // 置忙
SMB0CN = 0x44; // SMBus enabled, ACK on acknowledge cycle
I2cSendCount = count; // 置寫入數(shù)量
I2cRecCount = 0; // 讀出數(shù)量清零
I2cSendDPTR = SendBuf; // SMBus enabled, ACK on acknowledge cycle
I2CWRITE; // Chip select + WRITE
I2cMemAdd = byte_address;
STO = 0;
STA = 1; // 啟動傳輸
FeedWatchdog(); while (I2cSM_BUSY); // 等待空閑
ET0 = 1; //允許中斷
ET2 = 1; //允許中斷
******************************************************************************
** 函數(shù)名稱:void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count)
** 功能描述:I2C讀取程序
** 說 明:
1. 等待空閑
2. 置地址
3. 讀取數(shù)據(jù)
3. 等待結束
** 輸 入:地址byte_address、讀取數(shù)據(jù)緩沖區(qū)*SendBuf、數(shù)量count
** 輸 出:無
*******************************************************************************
/
void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count)
{
ET0 = 0; //禁止中斷
ET2 = 0; //禁止中斷
while (I2cSM_BUSY); // 等待空閑
I2cSM_BUSY = 1; // 置忙
SMB0CN = 0x44; // SMBus enabled, ACK on acknowledge cycle
I2cSendCount = 0; // 置寫入數(shù)量
I2CWRITE; // Chip select + WRITE
I2cMemAdd = byte_address; //值地址偏移
I2cRecCount = count; //要接收的數(shù)據(jù)個數(shù)
I2cRecDPTR = ReadBuf; //指向要接收的數(shù)據(jù)區(qū)
STO = 0;
STA = 1; // Start transfer
FeedWatchdog();
while (I2cSM_BUSY); // 等待空閑
ET0 = 1; //允許中斷
ET2 = 1; //允許中斷
}
/******************************************************************************
** 函數(shù)名稱:void SMBUS_ISR (void) interrupt 7
** 功能描述:I2C中斷服務程序
** 說 明:
1. 選擇器件地址
2. 置讀寫地址
3. 讀取或寫入數(shù)據(jù)
3. 置結束標志
** 輸 入:無
** 輸 出:無
*******************************************************************************
/
void SMBUS_ISR (void) interrupt 7
{
switch (SMB0STA) // Status code for the SMBus (SMB0STA register)
{
// 主發(fā)送器/接收器:起始條件已發(fā)送
// 在該狀態(tài)發(fā)送的COMMAND 字的R/W 位總是為0(W),
// 因為對于讀和寫操作來說都必須先寫存儲器地址。
case SMB_START:
SMB0DAT = I2cCOMMAND;
// 寫入含讀寫指令的設備地址
STA = 0;
// 清除啟動標志
break;
//主發(fā)送器/接收器:重復起始條件已發(fā)送。
// 該狀態(tài)只應在讀操作期間出現(xiàn),在存儲器地址已發(fā)送并得到確認之后
case SMB_RP_START:
I2CREAD; // 置設備讀
SMB0DAT = I2cCOMMAND; // 寫入含讀寫指令的設備地址
STA = 0;
break;
// 主發(fā)送器 設備地址+(W/R)已發(fā)出。收到ACK。
case SMB_MTADDACK:
SMB0DAT = I2cMemAdd; // 發(fā)送要寫入的字節(jié)地址
break;
// 主發(fā)送器 從地址+W已發(fā)出。收到NACK。
case SMB_MTADDNACK:
/* if (I2cSendCount) // 傳輸結束
{
SMB0DAT = *I2cSendDPTR; //傳送數(shù)據(jù)
I2cSendDPTR++;
I2cSendCount--;
}
else
{ if(I2cRecCount)
{
STO = 0;
STA = 1;
}
else
{
STO = 1
I2cSM_BUSY = 0; //發(fā)送停止,釋放總線
}
}*/
STO = 1;
STA = 1;
break;
// 數(shù)據(jù)字節(jié)已經(jīng)發(fā)出,收到ACK
case SMB_MTDBACK:
if (I2cSendCount) // 傳輸結束
{
SMB0DAT = *I2cSendDPTR; //傳送數(shù)據(jù)
I2cSendDPTR++;
I2cSendCount--;
}
else
{
if(I2cRecCount)
{ STO = 0;
STA = 1;
}
else
{
STO = 1;
I2cSM_BUSY = 0; //發(fā)送停止,釋放總線
} }
break;
// 數(shù)據(jù)字節(jié)已經(jīng)發(fā)出,收到NACK
case SMB_MTDBNACK:
STO = 1;
STA = 1;
break;
// 主發(fā)送器 競爭失敗
case SMB_MTARBLOST:
STO = 1;
STA = 1;
break;
// 從地址+R已經(jīng)發(fā)出,收到ACK
case SMB_MRADDACK:
SysBuff[500]=8;
//if (counter == 1) //只接收一個字節(jié)時要設置接收后就NACK
//{
// AA = 0;
// NACK sent on acknowledge cycle.
//}
break;
// 從地址+R已經(jīng)發(fā)出,收到NACK
case SMB_MRADDNACK:
STO = 0;
STA = 1;
break; // 數(shù)據(jù)字節(jié)收到,ACK已經(jīng)發(fā)出
case SMB_MRDBACK:
if (I2cRecCount == 1)
{
AA = 0;
// 收到最后一個字節(jié)前準備設置最后一個字節(jié)不應答
}
I2cRecCount--;
*I2cRecDPTR = SMB0DAT;
I2cRecDPTR++;
break;
// 數(shù)據(jù)字節(jié)收到,NACK已經(jīng)發(fā)出
case SMB_MRDBNACK:
*I2cRecDPTR = SMB0DAT;
STO = 1;
I2cSM_BUSY = 0; // Free SMBus
break;
// 未知狀態(tài)或總線錯誤
default:
STO = 1; // Reset communication.
I2cSM_BUSY = 0;
break;
}
SI=0; // clear interrupt flag
}
-
驅動程序
+關注
關注
19文章
818瀏覽量
47906 -
PCF8563
+關注
關注
3文章
37瀏覽量
24484
發(fā)布評論請先 登錄
相關推薦
評論