PCF8563時(shí)鐘芯片簡(jiǎn)介
PCF8563是PHILIPS公司推出的一款工業(yè)級(jí)內(nèi)含I2C總線接口功能的具有極低功耗的多功能時(shí)鐘/日歷芯片。PCF8563的多種報(bào)警功能、定時(shí)器功能、時(shí)鐘輸出功能以及中斷輸出功能能完成各種復(fù)雜的定時(shí)服務(wù),甚至可為單片機(jī)提供看門狗功能。內(nèi)部時(shí)鐘電路、內(nèi)部振蕩電路、內(nèi)部低電壓檢測(cè)電路(1.0V)以及兩線制I2C總線通訊方式,不但使外圍電路及其簡(jiǎn)潔,而且也增加了芯片的可靠性。同時(shí)每次讀寫數(shù)據(jù)后,內(nèi)嵌的字地址寄存器會(huì)自動(dòng)產(chǎn)生增量。當(dāng)然作為時(shí)鐘芯片,PCF8563亦解決了2000年問(wèn)題。因而,PCF8563是一款性價(jià)比極高的時(shí)鐘芯片,它已被廣泛用于電表、水表、氣表、電話、傳真機(jī)、便攜式儀器以及電池供電的儀器儀表等產(chǎn)品領(lǐng)域。
PCF8563芯片主要電氣特性
1)大工作電壓范圍:1.0~5.5V
2)400KHz 的 I2C 總線接口(VDD=1.8~5.5V 時(shí))。
時(shí)鐘頻率最大400KH
3)i2C 總線從地址:讀,0A3H;寫,0A2H 。
PCF8563時(shí)鐘芯片驅(qū)動(dòng)程序
//******************************************************
//define
//*****************************************************
#define PCF8563_ADDR 0xa2 // PCF8563設(shè)備地址
#define PCF8563_ENABLE 0x00 // 設(shè)置
#define PCF8563_SUBADDR 0x02 // 時(shí)間地址
#define PCF8563_NUMB 0x07 // 時(shí)間個(gè)數(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í)毫秒數(shù)
** 輸 出:無(wú)
********************************************************/
//延時(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的初始化
** 輸 入:無(wú) ** 輸 出:無(wú)
********************************************************/
void InitCrt() { //設(shè)備地址
I2cDeviceAdd = PCF8563_ADDR; }
/********************************************************
** 函數(shù)名稱: CrtGetDateTime(struct SYSTEM_TIME *Time)
** 功能描述: 讀取時(shí)間
** 說(shuō) 明:將從PCF8563中讀取的時(shí)間放入Time指向的結(jié)構(gòu)中
** 輸 入:無(wú)
** 輸 出:無(wú)
********************************************************/
void CrtGetDateTime(struct SYSTEM_TIME *Time) {
Uint8 buf[8]; //設(shè)備地址
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]; //時(shí)
屏蔽最高位 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) ** 功能描述: 設(shè)置時(shí)間
** 說(shuō) 明:將Time指向的結(jié)構(gòu)中日期時(shí)間參數(shù)設(shè)置到sd24.5中
** 輸 入:無(wú) ** 輸 出:無(wú)
********************************************************/
void CrtSetDateTime(struct SYSTEM_TIME *Time)
{
Uint8 buf[8]; //設(shè)備地址
I2cDeviceAdd = PCF8563_ADDR;
//寫入設(shè)置(時(shí)鐘工作、關(guān)閉復(fù)位、關(guān)閉測(cè)試模式)
buf[0] = PCF8563_ENABLE;
SM_Send (0, buf, 0);
//寫入日期時(shí)間 buf[0] = Time-》time.ucSecond; //秒
buf[1] = Time-》time.ucMinute; //分
buf[2] = Time-》time.ucHour|0x80; //時(shí) 置為24小時(shí)格式
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驅(qū)動(dòng)程序
//----------------------------------------------------------------------------- // 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初始化程序
** 說(shuō) 明:
1. 置下降沿有效
2. 置工作時(shí)鐘2MHz
3.
** 輸 入:無(wú)
** 輸 出:無(wú)
*******************************************************************************/
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寫入程序
** 說(shuō) 明:
1. 等待空閑
2. 寫入數(shù)據(jù)
3. 等待結(jié)束
** 輸 入:地址byte_address、寫入數(shù)據(jù)緩沖區(qū)*SendBuf、數(shù)量count
** 輸 出:無(wú)
*******************************************************************************/
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; // 啟動(dòng)傳輸
FeedWatchdog(); while (I2cSM_BUSY); // 等待空閑
ET0 = 1; //允許中斷
ET2 = 1; //允許中斷
******************************************************************************
** 函數(shù)名稱:void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count)
** 功能描述:I2C讀取程序
** 說(shuō) 明:
1. 等待空閑
2. 置地址
3. 讀取數(shù)據(jù)
3. 等待結(jié)束
** 輸 入:地址byte_address、讀取數(shù)據(jù)緩沖區(qū)*SendBuf、數(shù)量count
** 輸 出:無(wú)
*******************************************************************************
/
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ù)個(gè)數(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中斷服務(wù)程序
** 說(shuō) 明:
1. 選擇器件地址
2. 置讀寫地址
3. 讀取或?qū)懭霐?shù)據(jù)
3. 置結(jié)束標(biāo)志
** 輸 入:無(wú)
** 輸 出:無(wú)
*******************************************************************************
/
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),
// 因?yàn)閷?duì)于讀和寫操作來(lái)說(shuō)都必須先寫存儲(chǔ)器地址。
case SMB_START:
SMB0DAT = I2cCOMMAND;
// 寫入含讀寫指令的設(shè)備地址
STA = 0;
// 清除啟動(dòng)標(biāo)志
break;
//主發(fā)送器/接收器:重復(fù)起始條件已發(fā)送。
// 該狀態(tài)只應(yīng)在讀操作期間出現(xiàn),在存儲(chǔ)器地址已發(fā)送并得到確認(rèn)之后
case SMB_RP_START:
I2CREAD; // 置設(shè)備讀
SMB0DAT = I2cCOMMAND; // 寫入含讀寫指令的設(shè)備地址
STA = 0;
break;
// 主發(fā)送器 設(shè)備地址+(W/R)已發(fā)出。收到ACK。
case SMB_MTADDACK:
SMB0DAT = I2cMemAdd; // 發(fā)送要寫入的字節(jié)地址
break;
// 主發(fā)送器 從地址+W已發(fā)出。收到NACK。
case SMB_MTADDNACK:
/* if (I2cSendCount) // 傳輸結(jié)束
{
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) // 傳輸結(jié)束
{
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ā)送器 競(jìng)爭(zhēng)失敗
case SMB_MTARBLOST:
STO = 1;
STA = 1;
break;
// 從地址+R已經(jīng)發(fā)出,收到ACK
case SMB_MRADDACK:
SysBuff[500]=8;
//if (counter == 1) //只接收一個(gè)字節(jié)時(shí)要設(shè)置接收后就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;
// 收到最后一個(gè)字節(jié)前準(zhǔn)備設(shè)置最后一個(gè)字節(jié)不應(yīng)答
}
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)或總線錯(cuò)誤
default:
STO = 1; // Reset communication.
I2cSM_BUSY = 0;
break;
}
SI=0; // clear interrupt flag
}
-
驅(qū)動(dòng)程序
+關(guān)注
關(guān)注
19文章
849瀏覽量
48234 -
PCF8563
+關(guān)注
關(guān)注
3文章
37瀏覽量
24657
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
基于PCF8563的數(shù)字時(shí)鐘設(shè)計(jì)
![基于<b class='flag-5'>PCF8563</b>的數(shù)字<b class='flag-5'>時(shí)鐘</b>設(shè)計(jì)](https://file1.elecfans.com//web2/M00/A6/06/wKgZomUMO1iAZ064AAAibVOAugs927.jpg)
通用IIC總線驅(qū)動(dòng)程序設(shè)計(jì)及實(shí)時(shí)時(shí)鐘芯片PCF8563的控制實(shí)例
PCF8563時(shí)鐘設(shè)計(jì)應(yīng)用
關(guān)于PCF8563時(shí)鐘模塊的介紹
PCF8563匯編程序
PCF8563驅(qū)動(dòng)程序演示實(shí)驗(yàn)
PCF8563日歷時(shí)鐘芯片原理及應(yīng)用設(shè)計(jì)
pcf8563芯片功能_工作原理和引腳圖及應(yīng)用介紹
如何調(diào)整pcf8563精度_PCF8563高精度調(diào)整方法介紹
![如何調(diào)整<b class='flag-5'>pcf8563</b>精度_<b class='flag-5'>PCF8563</b>高精度調(diào)整方法介紹](https://file.elecfans.com/web1/M00/46/57/o4YBAFqbU22ATt8ZAACRBvdtY_w671.jpg)
基于PCF8563時(shí)鐘芯片的萬(wàn)年歷制作
使用單片機(jī)應(yīng)用PCF8563時(shí)鐘芯片的C語(yǔ)言程序免費(fèi)下載
![使用單片機(jī)應(yīng)用<b class='flag-5'>PCF8563</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>芯片</b>的C語(yǔ)言<b class='flag-5'>程序</b>免費(fèi)下載](https://file.elecfans.com/web1/M00/A5/8F/pIYBAF1vMVaAQBp4AAOKi0C-Kx4343.png)
微雪電子RTC時(shí)鐘模塊PCF8563 PCF8563T介紹
![微雪電子RTC<b class='flag-5'>時(shí)鐘</b>模塊<b class='flag-5'>PCF8563</b> <b class='flag-5'>PCF8563</b>T介紹](https://file.elecfans.com/web1/M00/AC/7C/o4YBAF3Cx-6ANornAADqDrXUOaw189.jpg)
評(píng)論