понедельник, 10 августа 2026 г.

RTC DS3231 для Raspberry Pi 3 или как убить почти 2 дня на простую операцию

 Как-то довелось мне делать один проект, в котором была использована Raspberry Pi 3, которая работала без интернета и необходимы были часы реального времени, чтобы время не сбрасывалось после выключения.

В закромах я нашел такую плату, китайского производства неизвестного состояния - работала ли она корректно или не работала я не знал, но была приобретена новой 4 года назад, аж в Сараево, для проекта треккера, но не пригодилась, по каким-то причинам.


 Подключил я эту чудо-плату как требуется к Raspberry по схеме:

DS3231            Raspberry Pi

VCC                 Pin 1 (3.2V)

GND                 Pin 6 (GND)

SDA                  Pin 3 (GPIO 2)

SCL                  Pin 5 (GPIO 3)

 

в файл /boot/config.txt добавил строку dtoverlay=i2c-rtc,ds3231 и думал что все должно заработать. Но эта падла выдавала про ошибку формата при попытке считать данные командой hwclock -r - типа неправильный формат.

Ну что-ж, отключил драйвер часов в config.txt начал обращаться напрямую  I2c  к часам по адресу 0x68 - пытаюсь снять дамп - все 00. После перезагрузки один раз дамп удается снять - дамп вроде корректный, т.е. часы что-то передают, но затем опять снова все 00. Попытка что-то записать - снова все 00. В общем первые секунд 30-60 дамп снимается, но при попытке что-то туда записать или считать его через ~ 60 cекунд шина i2c падает и возвращает все 00. Гугление сказало, что в таких непонятных китайских платах стоит температурный датчик - который раз в 64 секунды обновляет данные для термокомпенсации кварца и обращение к нему в случае каких-то неисправностей весит всю шину. Однако в дампе, когда удается его получить, данные с этого датчика есть, т.е. чего-то он меряет и при обращении к нему не сразу весит шину. Ну ок, дальнешее гугление говорит, что в этой плате должна стоять не литиевая батарейка 3В, а литиевый аккумулятор 3.7 В и типа если напряжение ниже 3.7 он пытается ее зарядить и все перегревается и вешает шину. Ну ок, за подзаряд отвечает диод (тот который красный) - выпял его. Ток потребления уменьшился, греться плата стала меньше, но и до этого хоть и грелась но немного. Ситуация не изменилась. Дальнейшее гугление выявило следующую беду в этой плате стоят подтягивающие резисторы, на фотке это блок слева, ближе к краю платы с цифрами 472. Они подтягивают лини SDA и SCL к питанию, а у Raspberry Pi 3 нплате уже есть резисторы 1.8 кОм и возможно сопротивление падает и авходные каскады перегреваются и и срабатывает тепловая защита и вырубает чип, вернее зажимает шину в ноль. ОК, выпаял и их, ситуация не изменилась.

В итоге плюнул на эту платку, купил специально модуль для Raspberry Pi 3 - готовый RS3231


 Подключил его - та же самая история. Ну, подумал я, наверно умерли GPIO 2 и 3 на Raspberry. Переделал подключение на GPIO 17 и 27 в config.txt заменил строку на эту dtoverlay=i2c-gpio,bus=3,gpio_sda=17,gpio_scl=27 и соответсвенно закоментил #dtparam=i2c_arm=on.   

Дамп стал считываться очень медленно, также как и i2cdetect -y 3 и i2cdump -y 3 0x68 соответсвенно там ничего не считалось. все было --, но хоть не 00, значит не упала i2c но что-то ее держит. Гугление показало, что на этих GPIO висит аудио. ОК переделал на другие на 23 и 24 dtoverlay=i2c-gpio,bus=3,gpio_sda=23,gpio_scl=24. Переподключил часы к ним и вот дамп корректный, i2cdetect - корректно, все работает быстро и без 00. Все ок.  С привязкой драйвера тоже пришлось потрахаться. Т.к. dtoverlay=i2c-rtc,ds3231,i2c_csi_dsi,i2c3 не помогло и dtoverlay=i2c-rtc,ds3231,i2c_bus=3 тоже не помогло. Чтож, раз в config.txt не подхватывает будем писать в /etc/rc.local в config.txt оставляем только dtoverlay=i2c-gpio,bus=3,gpio_sda=23,gpio_scl=24 в /etc/rc.local строго перед exit 0 вставил следующий код: 

echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-3/new_device 

sleep 2 

hwclock -s 

И вот наконец вся эта хренотень заработала. Ради интереса подключил ту первую китайскую плату и она тоже заработала. Беда была в самой Raspberry - GPIO 2 и 3 в ней роняли шину. Непонятно правда почему, вероятно, от того китайского модуля до выпайки диода на пины случайно попадало напряжение выше 3.3 вольта и диоды защиты внутри процессора деградировали. При включении транзистор работает нормально, но как по шине начинают гнать данные поврежденный p-n переход внутри процессора нагревается, уходит в лавионообразный тепловой пробой и замыкает SDA линию внутри самой Raspberry и возвращает дампы забитые 00. В общем если кому и пригодится - то можно часы переподключить к другой шине, даже если эта сгорела. Пол дня убил в первый день и пол дня во второй, когда вторые часы пришли.

 

 

 

суббота, 4 мая 2013 г.

It was another wonderful day

Early in the morning I was ready to do all important thing. After I did all important things I visit next pool session organized by Bernard from Singapore freedivers. Today we were at Republic Polytechnic's swimming pool.



There is a very good 50 m swimming pool. Session was exciting and the sun was shining to brightly, so at the end of session I almost got sunstroke, but cold shower saved me. And the long sleeve rash-guard save my skin from this hot sun.
I do not even want to imagine how my skin would be look like.
UPD: Some photos
And one more:
And last one:

пятница, 3 мая 2013 г.