|
時(shí)鐘芯片PCF2129精度高,論壇沒(méi)有這個(gè)芯片資料,剛好自己用到,找了好久改寫(xiě)調(diào)試通過(guò),補(bǔ)充一下論壇資料,其他不多說(shuō)了。
單片機(jī)源程序如下:
- #include <C8051F410.h >
- #include "C8051F410_SMBUS.h"
- #ifndef __PCF2129_H__
- #define __PCF2129_H__
- #define PCF2129_SLA 0xA2 // 定義PCF2129的器件地址
- #define s 0x00 // 定義PCF2129的秒寄存器地址
- #define m 0x01 // 定義PCF2129的分寄存器地址
- #define h 0x02 // 定義PCF2129的小時(shí)寄存器地址
- #define d 0x03 // 定義PCF2129的天寄存器地址
- #define wd 0x04 // 定義PCF2129的星期寄存器地址
- #define mo 0x05 // 定義PCF2129的月寄存器地址
- #define y 0x06 // 定義PCF2129的年寄存器地址
- //extern idata unsigned char Time[7];
- extern xdata unsigned char Time[7]; //時(shí)間寄存器
- void PCF2129_W_time(void);
- void PCF2129_R_time(void);
- void PCF2129_Init(void);
- #endif
- 由于我使用的是C8051F410芯片的硬件SMBUS(IIC)不具有通用性C文件就不發(fā)了,隨便找一個(gè)模擬IIC子程序改寫(xiě)一下就好
- #ifndef __C8051F410_SMBUS_H__
- #define __C8051F410_SMBUS_H__
- //------------------------------------------------------------------
- void SMbus_W(uchar wrda ,uchar dat);//寫(xiě)半個(gè)字節(jié)(器件碼,數(shù)據(jù))
- //適用與PCF8574iic擴(kuò)展IO 器件碼4e, 8574A器件碼7e;
- uchar SMbus_ByteR(uchar wrda ); //讀半個(gè)字節(jié) (器件碼)
- //適用與PCF8574iic擴(kuò)展器件碼4e, 8574A器件碼7e; smbus時(shí)鐘50khz
- //=============================================================================
- void SMbus_Write(uchar wrda ,uchar dest_addr, uchar dat);
- // 寫(xiě)一個(gè)字節(jié) ( 器件碼 , 地址 , 數(shù)據(jù) )
- uchar SMbus_ByteRead(uchar wrda ,uchar dest_addr);
- // 讀一個(gè)字節(jié) 器件碼 地址
- //讀流程為 (起始,器件碼寫(xiě),應(yīng)答,操作地址,應(yīng)答,停,起始,器件碼讀,應(yīng)答,讀數(shù)據(jù))。
- // 適用與EEPROM存儲(chǔ)器件 24c02,器件碼a0,24c16器件碼a0-ae, 時(shí)鐘PCF2129,取件碼a2
- //=======================================================================================
- void SMbus_WriteArray(uchar wrda , uchar dest_addr, uchar *src_addr, uchar len);
- //連續(xù)寫(xiě)一串?dāng)?shù)組 器件碼 起始地址 數(shù)組 字?jǐn)?shù)
- //流程為(起始,器件碼寫(xiě),應(yīng)答,操作地址,應(yīng)答,寫(xiě)數(shù)據(jù),應(yīng)答,寫(xiě)N個(gè)數(shù)據(jù)————停)
- void SMbus_Write_Array(uchar wrda,uchar dest_addr, uchar *src_addr,uchar len);
- //斷續(xù)寫(xiě)一串?dāng)?shù)組 器件碼 起始地址 數(shù)組 字?jǐn)?shù)
- void SMbus_ReadArray (uchar wrda, uchar src_addr, uchar *dest_addr, uchar len);
- // 讀取一串?dāng)?shù)組 器件碼 起始地址 讀出存儲(chǔ)位置 字?jǐn)?shù)
- //讀流程為(起始,器件碼寫(xiě),應(yīng)答,操作地址,應(yīng)答,停,起始,器件碼讀,應(yīng)答,讀數(shù)據(jù)應(yīng)答,————讀N數(shù)據(jù),停)
- #endif
- //=================================================================
- #include "C8051F410.h"
- #include "C8051F410_SMBUS.h"
- #include "PCF2129.h"
- //======================================================================
- xdata unsigned char Time[7]; //時(shí)間寄存器
- #define BCD_TO_HEX(bcd) ((((bcd)>>4)*10)+((bcd)&0x0F))
- #define HEX_TO_BCD(hex) ((((hex)/10)<<4)+((hex)%10))
- void PCF2129_W_time(void)
- {
- xdata unsigned char Time_o[7];
- uchar x = 0;
- for (x=0; x < 7; x++) // 清空數(shù)據(jù)緩沖區(qū)
- Time_o[x] = 0;
- SMbus_Write( 0xa2,0x00,0X20); //停止時(shí)鐘
- Time_o[s] = (HEX_TO_BCD(Time[s]))&0x7f; // 秒
- Time_o[m] = (HEX_TO_BCD(Time[m]))&0x7f; // 分
- Time_o[h] = (HEX_TO_BCD(Time[h]))&0x3f; // 小時(shí)
- Time_o[d] = (HEX_TO_BCD(Time[d]))&0x3f; // 日
- Time_o[wd] = (HEX_TO_BCD(Time[wd]))&0x07; // 星期
- Time_o[mo] = (HEX_TO_BCD(Time[mo]))&0x3f; // 月
- Time_o[y] = (HEX_TO_BCD(Time[y])); // 年
- SMbus_WriteArray(0xa2,0x03,Time_o, 7);
- SMbus_Write( 0xa2,0x00,0X00); //啟動(dòng)時(shí)鐘
- }
- void PCF2129_R_time(void)
- {
- xdata unsigned char Time_in[7];
- SMbus_ReadArray (0xa2, 0x02, Time_in, 7);
- Time[s] = BCD_TO_HEX((Time_in[s]&0x7F)) ; // 秒
- Time[m] = BCD_TO_HEX(Time_in[m]) ; // 分
- Time[h] = BCD_TO_HEX(Time_in[h]) ; // 小時(shí)
- Time[d] = BCD_TO_HEX(Time_in[d]) ; // 日
- Time[wd] = BCD_TO_HEX(Time_in[wd]) ; // 星期
- Time[mo] = BCD_TO_HEX(Time_in[mo]) ; // 月
- Time[y] = BCD_TO_HEX(Time_in[y]) ; // 年
- }
- void PCF2129_Init(void)
- {
- // u8 x = 0;
- SMbus_Write( 0xa2,0x00,0X00); //啟動(dòng)時(shí)鐘
- SMbus_Write( 0xa2,0x01,0X00); //啟動(dòng)時(shí)鐘
- SMbus_Write( 0xa2,0x02,0X00); //啟動(dòng)時(shí)鐘
- // SMbus_Write( 0xa2,0x10,0X82); //看門(mén)狗秒報(bào)警控制。
- SMbus_Write( 0xa2,0x0f,0X06); // 設(shè)置CLKOUT為1Hz
- SMbus_Write( 0xa2,0x19,0X0C); // 晶振老化補(bǔ)償設(shè)為-4ppm
- }
- //================================================================
復(fù)制代碼
注意重點(diǎn)這個(gè)芯片時(shí)間寄存器讀和寫(xiě)位置是不同的 ,雖然手冊(cè)給的寄存器序號(hào)03開(kāi)始是秒但是我的2129芯片卻是00寄存器只能寫(xiě)不能讀,
讀的時(shí)候自動(dòng)跳過(guò)。也就出現(xiàn)了SMbus_WriteArray(0xa2,0x03,Time_o, 7); //=====重點(diǎn) 把Time_o數(shù)組寫(xiě)入器件A2 從地址0X03開(kāi)始寫(xiě),寫(xiě)7個(gè)數(shù)據(jù)。讀的時(shí)候卻是秒從0X02開(kāi)始SMbus_ReadArray (0xa2, 0x02, Time_in, 7); //==========重點(diǎn)
附PCF2129手冊(cè):
pcf2129.pdf
(951.52 KB, 下載次數(shù): 12)
2022-12-1 21:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|