DS1302 — Часы реального времени (RTC)

Подробное руководство по DS1302: 3-wire интерфейс, 31 байт SRAM, зарядка батареи (trickle charger), схемы подключения к Arduino/ESP32 и примеры кода.

RTC 3-Wire

Обзор

DS1302 — это микросхема часов реального времени (RTC) с малым энергопотреблением, которая обеспечивает точный учет секунд, минут, часов, дней месяца, месяцев, дней недели и лет. Главными особенностями чипа являются использование нестандартного 3-wire интерфейса и наличие 31 байта встроенной SRAM для хранения пользовательских данных.

DS1302 работает по проприетарному 3-проводному последовательному протоколу (не путать с I2C или SPI). Он оснащен системой двойного питания с интеллектуальной схемой Trickle Charger, позволяющей подзаряжать резервный аккумулятор или ионистор прямо во время работы от основного источника.

DS1302 RTC
Спецификации

Характеристики DS1302

DS1302 отличается чрезвычайно низким потреблением энергии в режиме удержания времени.

Интерфейс 3-wire serial (CLK, I/O, RST)
Питание 2.0В – 5.5В
Память SRAM 31 байт (неэнергозависимая)
Точность Зависит от внешнего кварца (32.768 кГц)

Энергопотребление и Trickle Charger

Чип спроектирован для работы десятилетиями от одной батарейки:

  • В режиме ожидания (2.0В): менее 300 нА.
  • В активном режиме (5.0В): менее 1.2 мкА.
  • Trickle Charger: Внутренний регистр управления позволяет выбрать один или два диода и резистор (2к, 4к или 8к Ом) для зарядки резервного источника (аккумулятора LIR2032 или суперконденсатора).
Скачать Datasheet (PDF)
Конфигурация

Распиновка DS1302

Интерфейс DS1302 использует три основные линии связи, которые требуют внимания при программной реализации.

Пин Тип Описание Функция
VCC2 Питание Основное питание (Primary) Работа модуля
VCC1 Резерв Резервное питание (Backup) Батарейка / Ионистор
SCLK Вход Serial Clock Синхронизация данных
I/O (DAT) I/O Линия данных Двунаправленная шина
RST (CE) Вход Chip Enable / Reset Управление сессией (High = ON)
Подключение

Подключение DS1302 к ESP32

Поскольку интерфейс нестандартный, мы можем использовать любые свободные GPIO. В примере ниже используются стандартные пины для большинства библиотек.

DS1302 Пин ESP32 Пин Важное примечание
VCC (VCC2) 3.3V / 5V Работает при 3.3В, но 5В предпочтительнее для точности
GND GND Общая земля обязательна
RST (CE) GPIO 5 Высокий уровень разрешает обмен данными
DAT (I/O) GPIO 18 Двунаправленная линия (Data)
CLK (SCLK) GPIO 19 Тактовая частота (Clock)
Отладка

Устранение неполадок DS1302

Время "зависло" или не идет
Самая частая проблема — активный бит CH (Clock Halt). Он находится в 7-м бите регистра секунд (адрес 0x80). Если он равен 1, генератор остановлен. При первом запуске или замене батарейки библиотека обязательно должна программно сбросить этот бит в 0.
Ошибка записи (Write Protection)
DS1302 имеет регистр защиты от записи (Control Register, адрес 0x8E). Перед любой записью времени или данных в SRAM необходимо отправить команду на снятие защиты (бит WP должен быть равен 0).
Мусор в данных (Burst Mode)
При чтении в режиме Burst (пакетная передача) RST должен удерживаться HIGH в течение всего цикла. Если линия RST дребезжит или имеет плохой контакт, данные будут искажены.
Код

Примеры программирования DS1302

1. Arduino IDE

Рекомендуется использовать библиотеку RtcDS1302 от Makuna для надежной работы.

#include <ThreeWire.h>  
#include <RtcDS1302.h>

// Пины: DAT (18), CLK (19), RST (5)
ThreeWire myWire(18, 19, 5); 
RtcDS1302<ThreeWire> Rtc(myWire);

void setup() {
    Serial.begin(115200);
    Rtc.Begin();

    if (Rtc.GetIsWriteProtected()) {
        Rtc.SetIsWriteProtected(false);
    }

    if (!Rtc.GetIsRunning()) {
        Rtc.SetIsRunning(true); // Сброс бита CH
    }
}

void loop() {
    RtcDateTime now = Rtc.GetDateTime();
    Serial.printf("%02d:%02d:%02d\n", now.Hour(), now.Minute(), now.Second());
    delay(1000);
}

2. PlatformIO

Добавьте зависимость в platformio.ini:

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps =
    makuna/RTC @ ^2.3.5

3. MicroPython (Software Protocol)

Поскольку стандартного модуля I2C/SPI нет, используется программная реализация (Bit-banging).

from machine import Pin
import time

class DS1302:
    def __init__(self, clk, dio, cs):
        self.clk = Pin(clk, Pin.OUT)
        self.dio = Pin(dio)
        self.cs = Pin(cs, Pin.OUT)

    def _write_byte(self, dat):
        self.dio.init(Pin.OUT)
        for i in range(8):
            self.dio.value((dat >> i) & 1)
            self.clk.value(1)
            self.clk.value(0)

    def _read_byte(self):
        self.dio.init(Pin.IN)
        dat = 0
        for i in range(8):
            if self.dio.value():
                dat |= (1 << i)
            self.clk.value(1)
            self.clk.value(0)
        return dat

    def get_time(self):
        self.cs.value(1)
        self._write_byte(0xbf) # Burst read
        res = [self._read_byte() for _ in range(7)]
        self.cs.value(0)
        return res

# Использование
rtc = DS1302(clk=19, dio=18, cs=5)
print("Данные RTC (BCD):", rtc.get_time())

Итоги

DS1302 — это “ветеран” среди RTC-модулей. Он уступает по точности DS3231 (из-за внешнего кварца), но выигрывает в цене и наличии дополнительной SRAM. Это отличный выбор для простых логгеров и систем, где отклонение в пару минут в месяц не критично.

Примеры кода Скачать Datasheet