Как-то довелось мне делать один проект, в котором была использована 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. В общем если кому и пригодится - то можно часы переподключить к другой шине, даже если эта сгорела. Пол дня убил в первый день и пол дня во второй, когда вторые часы пришли.


