常用的計時時鐘晶片有 DS12C887, DS1302, DS1307, DS3231, RX8025, 各型號還有衍生型號. 可以看到到大部分是Dallas生產的晶片, RX8025的廠商是Epson. 其中
RX8025T 是高精度I2C實時時鐘晶片, I2C匯流排地址為固定的0x64
注意, RX-8025T 與 RX-8025SA/NB 只是部分相同, Pin不相容, 暫存器也不完全相同
二者精度都很高, 誤差接近
PIN | Name | I/O | 說明 |
---|---|---|---|
1 | T1(CE) | Input | 廠商測試 (不連線) |
2 | SCL | Input | I2C的時鐘 |
3 | FOUT | Output | C-MOS 輸出, 由 FOE 控制. 當 FOE 為高電平時, 輸出 32.768 kHz 訊號, 當停止輸出時, FOUT pin 表現為高阻態 (high impedance) |
4 | N.C. | ||
5 | TEST | Input | 廠商測試 (不連線) |
6 | VDD | 供電正電壓 | |
7 | FOE | Input | 用於控制 FOUT pin 的輸出. 當此pin為高電平時, FOUT pin 為輸出模式, 低電平時 FOUT pin 停止輸出. |
8 | N.C. | ||
9 | N.C. | ||
10 | /INT | Output | 這個 pin 用於輸出鬧鐘訊號, 定時器訊號, 時鐘更新訊號等, 這個pin為開漏輸出. |
11 | GND | 接地 | |
12 | T2(VPP) | 廠商測試 (不連線) | |
13 | SDA | I/O | I2C的資料輸入輸出, 輸出時為 N-ch open drain, 需要上拉電阻. |
14 | N.C. |
Addr | Name | 說明 |
---|---|---|
0x00 | SEC | 計時秒, BCD碼[0, 59], 前六位有效 |
0x01 | MIN | 計時分鐘, BCD碼[0, 59], 前六位有效 |
0x02 | HOUR | 計時小時, BCD碼[0, 23], 24小時制, 前五位有效 |
0x03 | WEEK | 計時日(周天), 每一個bit代表一天, 從bit0至bit6依次為週日, 週一, ..., 週六 |
0x04 | DAY | 計時日, BCD碼[1, 31], 前五位有效 |
0x05 | MONTH | 計時月, BCD碼[1, 12], 前四位有效 |
0x06 | YEAR | 計時年, BCD碼[0, 99], 全八位有效 |
0x07 | RAM | 非功能, 可讀寫區域 |
0x08 | MIN Alarm | 鬧鐘分鐘, BCD碼[0, 59], 前六位有效. 第七位AE標識是否忽略(不參與比較), 0:否, 1:是 |
0x09 | HOUR Alarm | 鬧鐘小時, BCD碼[0, 23], 前五位有效. 第七位AE標識是否忽略 |
0x0A | WEEK Alarm / DAY Alarm | 鬧鐘日(周天/日), 由 WADA 暫存器控制 |
鬧鐘周天, 每一個bit代表一天, 從bit0至bit6依次為週日至週六, 第七位AE標識是否忽略 | ||
鬧鐘日, BCD碼[1, 31], 前五位有效, 第七位AE標識是否忽略 | ||
0x0B | Timer Counter 0 | 計數器的低8位元, HEX碼(正常數值) |
0x0C | Timer Counter 1 | 計數器的高4位元, HEX碼(正常數值) |
0x0D | Extension Register | 擴充套件功能暫存器 |
0x0E | Flag Register | 標誌位暫存器 |
0x0F | Control Register | 控制位暫存器 |
P32 -> SCL
P33 -> SDA
GND -> GND
3.3V -> VCC
程式碼下載地址
程式碼會將 RX8025T 時間設定為 2022-07-16 10:10:10, 然後每隔一秒顯示一次時間, 數值為十六進位制
10-10-10-40-16-07-22-01-00-04-00-00-00-00-00-40-
11-10-10-40-16-07-22-01-00-04-00-00-00-00-20-40-
12-10-10-40-16-07-22-01-00-04-00-00-00-00-20-40-
13-10-10-40-16-07-22-01-00-04-00-00-00-00-20-40-
14-10-10-40-16-07-22-01-00-04-00-00-00-00-20-40-
15-10-10-40-16-07-22-01-00-04-00-00-00-00-20-40-
讀寫時間的方法
__XDATA uint8_t buff[7];
uint8_t RX8025T_Write(uint8_t reg, uint8_t dat)
{
return I2C_Write(RX8025T_I2C_ADDR, reg, &dat, 1);
}
// 初始化, 清除標誌位, 關閉中斷
uint8_t RX8025T_Init(void)
{
// Reset all flags
RX8025T_Write(RX8025T_REG_FLAG, 0x00);
// Default , turn off all interrupts
RX8025T_Write(RX8025T_REG_CONTROL, 0x40);
return HAL_OK;
}
// 讀取時間
uint8_t RX8025T_GetTime(uint8_t *t)
{
I2C_Read(RX8025T_I2C_ADDR, RX8025T_REG_SECOND, t, 16);
return HAL_OK;
}
// 設定時間
uint8_t RX8025T_SetTime(uint8_t *t)
{
RX8025T_Write(RX8025T_REG_SECOND, t[0]);
RX8025T_Write(RX8025T_REG_MINUTE, t[1]);
RX8025T_Write(RX8025T_REG_HOUR, t[2]);
RX8025T_Write(RX8025T_REG_WEEKDAY, t[3]);
RX8025T_Write(RX8025T_REG_DAY, t[4]);
RX8025T_Write(RX8025T_REG_MONTH, t[5]);
RX8025T_Write(RX8025T_REG_YEAR, t[6]);
return HAL_OK;
}
main方法範例
int main(void)
{
uint8_t i;
SYS_SetClock();
// UART1 configuration: baud 115200 with Timer2, 1T mode, no interrupt
UART1_Config8bitUart(UART1_BaudSource_Timer2, HAL_State_ON, 115200);
GPIO_Init();
I2C_Init();
RX8025T_Init();
time[0] = 0x10; // second
time[1] = 0x10; // minute
time[2] = 0x10; // hour
time[3] = 0x40; // week day
time[4] = 0x16; // day
time[5] = 0x07; // month
time[6] = 0x22; // year
RX8025T_SetTime(time);
while(1)
{
RX8025T_GetTime(time);
for (i = 0; i < BUFF_SIZE; i++)
{
UART1_TxHex(time[i]);
UART1_TxChar('-');
}
UART1_TxString("\r\n");
SYS_Delay(1000);
}
}