0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

PCF8563時鐘芯片驅動程序分享

姚小熊27 ? 來源:網(wǎng)絡整理 ? 2018-03-04 09:26 ? 次閱讀

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 時)。

PCF8563時鐘芯片驅動程序分享

時鐘頻率最大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

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 驅動程序
    +關注

    關注

    19

    文章

    836

    瀏覽量

    48038
  • PCF8563
    +關注

    關注

    3

    文章

    37

    瀏覽量

    24551
收藏 人收藏

    評論

    相關推薦

    基于PCF8563的數(shù)字時鐘設計

    PCF8563是PHILIPS公司推出的一款工業(yè)級、內(nèi)含I2C總線接口功能,且具有極低功耗的多功能時鐘/日歷芯片,還具有多種報警功能、定時器功能、時鐘輸出功能,以及中斷輸出功能等,能完
    發(fā)表于 09-29 14:47 ?7665次閱讀
    基于<b class='flag-5'>PCF8563</b>的數(shù)字<b class='flag-5'>時鐘</b>設計

    通用IIC總線驅動程序設計及實時時鐘芯片PCF8563的控制實例

    ;><strong>通用IIC總線驅動程序設計及實時時鐘芯片PCF8563的控制實例<br/></strong&
    發(fā)表于 10-31 16:24

    PCF8563時鐘設計應用

    前天我用時鐘芯片PCF8563與89C51搭了個系統(tǒng)!現(xiàn)在分享下PCF8563R日歷時鐘芯片原理
    發(fā)表于 08-26 11:32

    關于PCF8563時鐘模塊的介紹

    ESP32使用PCF8563時鐘模塊獲取網(wǎng)絡校時關于PCF8563時鐘模塊的介紹接線下載Arduino的PCF8563庫關于
    發(fā)表于 01-17 08:20

    PCF8563匯編程序

    剛寫的一個PCF8563匯編程序,請教高手?。。?***************************************************************;PCF8563
    發(fā)表于 08-19 17:41 ?90次下載

    PCF8563驅動程序演示實驗

    PCF8563驅動程序演示實驗 一、實驗目的PCF8563是一款性價比極高的時鐘
    發(fā)表于 09-26 17:40 ?4078次閱讀

    PCF8563日歷時鐘芯片原理及應用設計

    PCF8563日歷時鐘芯片原理及應用設計,很好的學習資料。
    發(fā)表于 06-03 15:31 ?79次下載

    時鐘芯片PCF8563

    時鐘芯片PCF8563
    發(fā)表于 12-17 10:06 ?16次下載

    pcf8563芯片功能_工作原理和引腳圖及應用介紹

    本文開始介紹了了pcf8563主要特性與pcf8563引腳圖及功能,其次介紹了pcf8563功能和pcf8563工作原理,最后介紹了PCF8563
    發(fā)表于 03-04 09:01 ?7.2w次閱讀

    如何調整pcf8563精度_PCF8563高精度調整方法介紹

    本文開始介紹看pcf8563的特性與pcf8563方框圖,其次介紹了pcf8563工作原理及管腳配置圖及說明,最后詳細的闡述了PCF8563實時時鐘
    的頭像 發(fā)表于 03-04 10:00 ?2.4w次閱讀
    如何調整<b class='flag-5'>pcf8563</b>精度_<b class='flag-5'>PCF8563</b>高精度調整方法介紹

    基于PCF8563時鐘芯片的萬年歷制作

    PCF8563是PHILIPS公司推出的一款工業(yè)級內(nèi)含I2C總線接口功能的具有極低功耗的多功能時鐘/日歷芯片.本文介紹了pcf8563工作原理及pc
    發(fā)表于 03-04 16:07 ?2w次閱讀

    使用單片機應用PCF8563時鐘芯片的C語言程序免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用單片機應用PCF8563時鐘芯片的C語言程序免費下載。
    發(fā)表于 09-04 17:27 ?21次下載
    使用單片機應用<b class='flag-5'>PCF8563</b><b class='flag-5'>時鐘</b><b class='flag-5'>芯片</b>的C語言<b class='flag-5'>程序</b>免費下載

    微雪電子RTC時鐘模塊PCF8563 PCF8563T介紹

    PCF8563 RTC時鐘模塊 I2C接口 帶日歷功能,接入備用電池,掉電后可繼續(xù)工作 型號 PCF8563 RTC Board
    的頭像 發(fā)表于 12-30 08:59 ?7684次閱讀
    微雪電子RTC<b class='flag-5'>時鐘</b>模塊<b class='flag-5'>PCF8563</b> <b class='flag-5'>PCF8563</b>T介紹

    PCF8563時鐘模塊

    電子發(fā)燒友網(wǎng)站提供《PCF8563時鐘模塊.zip》資料免費下載
    發(fā)表于 07-19 09:28 ?10次下載
    <b class='flag-5'>PCF8563</b><b class='flag-5'>時鐘</b>模塊

    PCF8563時鐘芯片 C語言編程樣例

    PCF8563 時鐘芯片 C語言編程樣例
    發(fā)表于 10-17 14:46 ?31次下載