RTC-IC-PCF2129
一特點:
-20~70度,SPI/I2C接口,1.2 V to 4.2 V ,可編程看門狗,時鐘輸出以便校準(zhǔn),鬧鐘輸出,時間戳輸出。低功耗高精度,電源切換,中斷輸出。
SPI接口和I2C接口硬件接法:IFS和BSS連接則是I2C接法。
時間戳輸出:/TS低電平輸入引腳當(dāng)信號到來時將時間信息存到時間戳寄存器,此時通過接口可讀出的時間即為此事件發(fā)生時的時間。
鬧鐘輸出:當(dāng)前時間不斷與設(shè)置的鬧鐘時間比較,匹配時產(chǎn)生標(biāo)志,使能中斷時通過/INT輸出。
電源切換:在VDD和Vbat上加系統(tǒng)電壓和電池電壓,內(nèi)部可實現(xiàn)自動切換;也可將VCC和電池分別通過二極管連接到VDD上,此時Vbat一定要接地,并且軟件電源管理的3位設(shè)置為111
電池低電壓輸出:當(dāng)?shù)碗妷簷z測使能時,當(dāng)電池電壓低到一定值時則事件輸出
/*------------------------filename.h------------------------------------*/
#ifndef __PCF2129_I2C_H
#define __PCF2129_I2C_H
/* head include ------------------------------------------------------------*/
# include "stm32f10x.h"
/* Exported types ------------------------------------------------------------*/
typedef struct
{
??? unsigned char ucSLA;??????????? //? 從機(jī)地址(這是7位純地址,不含讀寫控制位)
??? unsigned char? ulAddr;?????????? //? 數(shù)據(jù)地址
??? unsigned char *pcData;?????????????????? //? 指向收發(fā)數(shù)據(jù)緩沖區(qū)的指針
??? unsigned char usSize;????????? //? 收發(fā)數(shù)據(jù)長度
} tI2CM_DEVICE;
typedef struct
{
? unsigned char?? s;???????? // 秒
? unsigned char?? m;???????? // 分
? unsigned char?? h;???????? // 小時
? unsigned char?? d;???????? // 日
? unsigned char?? wd;??????? // 星期
? unsigned char?? mm;??????? // 月
? unsigned char?? y;??????? // 年
} dt_dat;
/* Exported constants --------------------------------------------------------*/
/*I2C實時時鐘接口
SCL?? ??? ??? ??? ?PD7
SDA?? ??? ??? ??? ?PD6
INT ?? ??? ??? ?PD5*/
/* Exported macro ------------------------------------------------------------*/
//? 定義pcf2129(NXP RTC,I2C接口)
#define? PCF2129_SLA??????????? 0xA2 ?? ??? ??? ??? ???? //? 定義PCF2129的器件地址
//#define? PCF2129_S????????????? (u8)0x02??????????? //? 定義PCF2129的秒寄存器地址?? ?
//#define? PCF2129_M????????????? (u8)0x03??????????? //? 定義PCF2129的分寄存器地址?? ?
//#define? PCF2129_H????????????? (u8)0x04??????????? //? 定義PCF2129的小時寄存器地址 ?
//#define? PCF2129_D????????????? (u8)0x05??????????? //? 定義PCF2129的天寄存器地址?? ?
//#define? PCF2129_W????????????? (u8)0x06??????????? //? 定義PCF2129的星期寄存器地址 ?
//#define? PCF2129_Mo???????????? (u8)0x07??????????? //? 定義PCF2129的月寄存器地址?? ?
//#define? PCF2129_Y????????????? (u8)0x08??????????? //? 定義PCF2129的年寄存器地址低位
???????????????????????????????????? ?
#define? PCF2129_S????????????? (u8)0x03??????????? //? 定義PCF2129的秒寄存器地址??? ?
#define? PCF2129_M????????????? (u8)0x04??????????? //? 定義PCF2129的分寄存器地址??? ?
#define? PCF2129_H????????????? (u8)0x05??????????? //? 定義PCF2129的小時寄存器地址? ?
#define? PCF2129_D????????????? (u8)0x06??????????? //? 定義PCF2129的天寄存器地址??? ?
#define? PCF2129_W????????????? (u8)0x07??????????? //? 定義PCF2129的星期寄存器地址? ?
#define? PCF2129_Mo???????????? (u8)0x08??????????? //? 定義PCF2129的月寄存器地址??? ?
#define? PCF2129_Y????????????? (u8)0x09??????????? //? 定義PCF2129的年寄存器地址低位
//#define Second_alarm???? 0x0a
//#define Minute_alarm???? 0x0b
//#define Hour_alarm?????? 0x0c
//#define Day_alarm??????? 0x0d
//#define Weekday_alarm??? 0x0e
//#define CLKOUT_ctl?????? 0x0f
//#define Watchdg_tim_ctl? 0x10
//#define Watchdg_tim_val? 0x11
//#define Timestp_ctl????? 0x12
//#define Sec_timestp????? 0x13
//#define Min_timestp????? 0x14
//#define Hour_timestp???? 0x15
//#define Day_timestp????? 0x16
//#define Mon_timestp????? 0x17
//#define Year_timestp???? 0x18
//#define Aging_offset???? 0x19
//#define Internal_reg???? 0x1a
/* Exported functions --------------------------------------------------------*/
?
void PCF2129_Init(void); ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?
void PCF2129_GetTime(void );
void PCF2129_SetTime(dt_dat *date_time);
#endif //__PCF2129_I2C_H
//******************************file.c*************************************************
? * @file ?? ??? ?file.c?? ?
? * @author ?
? * @version
? * @date?? ?
? * @brief?? This file contains the headers of the xx handlers.
? ******************************************************************************
? * @attention
? *
? *
? *******************************************************************************/
? /* Includes ------------------------------------------------------------------*/
#include "PCF2129.h"
#include "myiic.h"
//#include "stm32f10x_pwr.h"
//#include "stm32f10x_bkp.h"
/* extern variables prototypes------------------------------------------------*/
/* extern function prototypes ------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
#define BCD_TO_HEX(bcd) ((((bcd)>>4)*10)+((bcd)&0x0F))
#define HEX_TO_BCD(hex) ((((hex)/10)<<4)+((hex)%10))
/* Private variables ---------------------------------------------------------*/
u8 databuff[0x1c]={0};
dt_dat dt;
tI2CM_DEVICE PCF2129 = {PCF2129_SLA,????? //? 從機(jī)地址為PCF2129 ?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?0x00,???????????? //? 數(shù)據(jù)地址為0x00
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?databuff,???????? //? 指向收發(fā)數(shù)據(jù)緩沖區(qū)的指針
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?10};????????????? //? 突發(fā)發(fā)送10個字節(jié)數(shù)據(jù);
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
--- @brief ?
--- @param? None
--- @retval None
--- @note
*******************************************************************************/
static void IIC_Bus_write(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt)
{
?? ?u8 stringpos = 0;
?? ?IIC_Start();
?? ?//1表示無應(yīng)答
?? ?if(IIC_Send_Byte(dev_addr)== 1)
?? ?{
?? ??? ?IIC_Stop();
??? return;
?? ?}?? ?
?? ?//發(fā)送設(shè)備地址+寫信號
?? ?if(IIC_Send_Byte(reg_addr)== 1)
?? ?{
?? ??? ?IIC_Stop();
??? return;
?? ?}?? ?
?? ?//內(nèi)部寄存器地址,
?? ?//IIC_Wait_Ack();
?? ?for (stringpos = 0; stringpos < cnt; stringpos++)
?? ?{
?? ??? ?if(IIC_Send_Byte(reg_data[stringpos])== 1)
?? ??? ?{
?? ??? ??? ?IIC_Stop();
?? ??? ??? ?return;
?? ??? ?}
?? ??? ?//內(nèi)部寄存器數(shù)據(jù),
?? ??? ?//IIC_Wait_Ack();
?? ?}
?? ?IIC_Stop();
?? ?//發(fā)送停止信號
}
void IIC_Bus_Read(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt)
{
?? ?u8 stringpos = 0;
?? ?IIC_Start();
?? ?//起始信號
?? ?if(IIC_Send_Byte(dev_addr)== 1)
?? ?{
?? ??? ?IIC_Stop();
??? return;
?? ?}?? ?
?? ?//發(fā)送設(shè)備地址+寫信號
?? ?if(IIC_Send_Byte(reg_addr)== 1)
?? ?{
?? ??? ?IIC_Stop();
??? return;
?? ?}?? ?
?? ?//發(fā)讀命令
?? ?IIC_Start();
?? ?if(IIC_Send_Byte(dev_addr+1)== 1)
?? ?{
?? ??? ?IIC_Stop();
??? return;
?? ?}?? ??? ?
?? ?//發(fā)送設(shè)備地址+讀信號
?? ?
?? ?for (stringpos = 0; stringpos < cnt; stringpos++)
?? ?{
?? ??? ?if(stringpos != cnt -1)
?? ??? ??? ?reg_data[stringpos]=IIC_Read_Byte(1);
?? ??? ?else?? ??? ??? ?
?? ??? ??? ?reg_data[stringpos]=IIC_Read_Byte(0);?? ??? ?
?? ?}
?? ?//IIC_NAck(); //最后一個字節(jié)讀完發(fā)信號
?? ?//IIC_Send_Ack(1);?? ?
?? ?IIC_Stop();?? ?//停止信號
}
//? 對tI2CM_DEVICE結(jié)構(gòu)體變量設(shè)置與數(shù)據(jù)收發(fā)相關(guān)的成員(數(shù)據(jù)地址、數(shù)據(jù)緩沖區(qū)、數(shù)據(jù)大小)
void I2CM_DeviceDataSet(tI2CM_DEVICE *pDevice, unsigned char ulAddr,
?????????????????????????????????????????????? unsigned char? *pcData,
?????????????????????????????????????????????? unsigned char usSize)
{
??? pDevice->ulAddr = ulAddr;
??? pDevice->pcData = pcData;
??? pDevice->usSize = usSize;
}
/*******************************************************************************
--- @brief? 初始化
--- @param? None
--- @retval None
--- @note
*******************************************************************************/
extern void delay_us(u32 nus);
void PCF2129_Init(void)
{
?? ?u8 x = 0;?? ?
?? ?IIC_Init();?? ?
//?? ?if (BKP_ReadBackupRegister(BKP_DR1) != 0xA6A6)
//?? ?{
//?? ??? ?RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
//??? //后備域解鎖
//??? PWR_BackupAccessCmd(ENABLE);
//??? //備份寄存器模塊復(fù)位
//?? ??? ?BKP_DeInit();?? ?
//?? ??? ?
//?? ??? ?dt.s = 0;
//?? ??? ?dt.m = 40;
//?? ??? ?dt.h = 9;//12小時格式,真正的小時是&0X0F,其它2位是AMPM;或者4小時模式
//?? ??? ?dt.d = 7;//
//?? ??? ?dt.wd = 6;
//?? ??? ?dt.mm =1 ;
//?? ??? ?dt.y = 17;/*0~99*/
//?? ??? ?PCF2129_SetTime(&dt);
//?? ??? ??? ?//配置完成后,向后備寄存器中寫特殊字符0xA5A5
//?? ??? ?BKP_WriteBackupRegister(BKP_DR1, 0xA6A6);
//?? ?}
//?? ?else
//?? ?{
若后備寄存器沒有掉電,則無需重新配置RTC
//?? ??? ?//這里我們可以利用RCC_GetFlagStatus()函數(shù)查看本次復(fù)位類型
//?? ??? ?if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
//?? ??? ?{
//?? ??? ??? ??? ?//這是上電復(fù)位
//?? ??? ?}
//?? ??? ?else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
//?? ??? ?{
//?? ??? ??? ??? ?//這是外部RST管腳復(fù)位
//?? ??? ?}
//?? ??? ?//清除RCC中復(fù)位標(biāo)志
//?? ??? ?RCC_ClearFlag();
//?? ?}
?? ?PCF2129_GetTime();
?? ?if((dt.y ==0)&&(dt.mm ==0)&&(dt.wd ==0)&&(dt.d ==0)&&(dt.h ==0)&&(dt.m ==0)&&(dt.s ==0))
?? ?{
?? ??? ?delay_us(2000000);/*2017.03.13初始化時如果讀時間失敗,重復(fù)操作2次以判斷是否初始化過,中間間隔2S*/
?? ??? ?PCF2129_GetTime();
?? ??? ?if((dt.y ==0)&&(dt.mm ==0)&&(dt.wd ==0)&&(dt.d ==0)&&(dt.h ==0)&&(dt.m ==0)&&(dt.s ==0))
?? ??? ?{
?? ??? ??? ?dt.s = 0;
?? ??? ??? ?dt.m = 0;
?? ??? ??? ?dt.h = 0;//12小時格式,真正的小時是&0X0F,其它2位是AMPM;或者4小時模式
?? ??? ??? ?dt.d = 1;//
?? ??? ??? ?dt.wd = 1;
?? ??? ??? ?dt.mm =1 ;
?? ??? ??? ?dt.y = 17;/*0~99*/
?? ??? ??? ?PCF2129_SetTime(&dt);
?? ??? ?}
?? ?}
?? ?for (x=0; x < 7; x++)? //? 清空數(shù)據(jù)緩沖區(qū)
?? ??? ?databuff[x+2] = 0;?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?
}
/*******************************************************************************
--- @brief? 讀取時間
--- @param? None
--- @retval None
--- @note
*******************************************************************************/
void PCF2129_GetTime(void )
{?? ?
?? ?u8 x = 0;
?? ?for (x=0; x < 7; x++)? //? 清空數(shù)據(jù)緩沖區(qū)
?? ??? ?databuff[x+2] = 0;
?? ?I2CM_DeviceDataSet(&PCF2129, ?
?????????????????????? 0x02,
?????????????????????? &databuff[2],
?????????????????????? 7); ?? ?
?? ?IIC_Bus_Read(PCF2129.ucSLA, PCF2129.ulAddr, PCF2129.pcData, PCF2129.usSize);?? ?
?? ?dt.s = BCD_TO_HEX(databuff[PCF2129_S -1] & 0x7f);
?? ?dt.m = BCD_TO_HEX(databuff[PCF2129_M -1] & 0x7f);
?? ?dt.h = BCD_TO_HEX(databuff[PCF2129_H -1] & 0x1f);//12小時格式,真正的小時是&0X0F,其它2位是AMPM;或者4小時模式
?? ?dt.d = BCD_TO_HEX(databuff[PCF2129_D -1] & 0x3f);//
?? ?dt.wd = BCD_TO_HEX(databuff[PCF2129_W -1] & 0x07);
?? ?dt.mm = BCD_TO_HEX(databuff[PCF2129_Mo -1] & 0x1f);
?? ?dt.y = BCD_TO_HEX(databuff[PCF2129_Y -1] & 0x7f);/*0~99*/
}
/*******************************************************************************
--- @brief? 設(shè)置時間
--- @param? None
--- @retval None
--- @note
*******************************************************************************/
void PCF2129_SetTime(dt_dat *date_time)
{?? ?
?? ?databuff[0] = 0;?? ?
? databuff[1] = 0;?? ?
? databuff[2] |= (7<<5);/*2017.03.13 14:57功耗管理 單獨VDD供電。*/
?? ?databuff[PCF2129_S]?? ? = HEX_TO_BCD(date_time->s); ?
?? ?databuff[PCF2129_M]?? ? = HEX_TO_BCD(date_time->m); ?
?? ?databuff[PCF2129_H]?? ? = HEX_TO_BCD(date_time->h); ?
?? ?databuff[PCF2129_D]?? ? = HEX_TO_BCD(date_time->d); ?
?? ?databuff[PCF2129_W]?? ? = HEX_TO_BCD(date_time->wd); /*PAD沒有傳相關(guān)參數(shù),如果需要該參數(shù),需要增加函數(shù)實現(xiàn)。*/
?? ?databuff[PCF2129_Mo] = HEX_TO_BCD(date_time->mm);
?? ?databuff[PCF2129_Y]? = HEX_TO_BCD(date_time->y); ?
//?? ?databuff[10] = 0x80;?? ??? ??? ? //秒報警控制及報警值設(shè)置。
//? databuff[15] = 0x06;?????? //? 設(shè)置CLKOUT為1Hz
//? databuff[19] = 0x0C;?????? //? 晶振老化補(bǔ)償設(shè)為-4ppm?? ?
?? ?I2CM_DeviceDataSet(&PCF2129, ?
?????????????????????? 0x0,
?????????????????????? &databuff[0],
?????????????????????? 10);
?? ?IIC_Bus_write(PCF2129.ucSLA, PCF2129.ulAddr, PCF2129.pcData, PCF2129.usSize);?? ?
?? ?//? 定義I2C主機(jī)結(jié)構(gòu)體:設(shè)置CLKOUT為1Hz?? ?
//? I2CM_DeviceDataSet(&PCF2129,
//???????????????????? 0x0F,
//???????????????????? &databuff[15],
//???????????????????? 1);
// ?
//? IIC_Bus_write(PCF2129.ucSLA, PCF2129.ulAddr, PCF2129.pcData, PCF2129.usSize);
//?? ?//? 定義I2C主機(jī)結(jié)構(gòu)體:設(shè)置晶振老化補(bǔ)償設(shè)為-4ppm
//? I2CM_DeviceDataSet(&PCF2129, ?
//?????????????????????? 0x19,
//?????????????????????? &databuff[19],
//?????????????????????? 1);
//? IIC_Bus_write(PCF2129.ucSLA, PCF2129.ulAddr, PCF2129.pcData, PCF2129.usSize); ?? ?
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/jieruishu/p/6544202.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的RTC-IC-PCF2129的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qt tableWidget 表格控件使
- 下一篇: HackerRank Super Si