M41T56 это микросхема Real Time Clock, являющаяся аналогом популярной DS1307. И хотя даже цоколевка микросхем совпадает, у них есть существенные отличия, о которых я постараюсь рассказать.
Краткое описание
Я не буду останавливаться на работе шины IIC, отмечу только что обе микросхемы имеет адрес 0xd0. Для работы с временем микросхемы содержат семь регистров счета и регистр управления. Регистры счета содержат числа в двоично-десятичном формате, однако некоторые биты имеют особое значение.
Регистры
xxx — значение бита не определено.
функция | индекс | биты | возможные значения | |||||||
---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||
секунды | 0x00 | ST | десятки секунд | единицы секунд | 0 — 59 | |||||
минуты | 0x01 | xxx | десятки минут | единицы минут | 0 — 59 | |||||
часы | 0x02 | SEB | SB | десятки часов | единицы часов | 0 — 23 | ||||
день | 0x03 | xxx | xxx | xxx | xxx | xxx | день недели | 1 — 7 | ||
день месяца | 0x04 | xxx | xxx | десятки дня | единицы дня | 1 — (28|29|30|31) | ||||
месяц | 0x05 | xxx | xxx | xxx | дес | единицы месяца | 1 — 12 | |||
год | 0x06 | десятки года | единицы года | 0 — 99 | ||||||
регистр управления | 0x07 | OUT | FT | S | величина коррекции | - |
Биты
x — после включения состояние бита может быть любым.
бит | после сброса | описание |
---|---|---|
ST | x | При записи 1 в этот бит генератор останавливается |
CEB | x | Когда бит CEB (Century Enable Bit) установлен, то при достижении нового века бит CB (Century Bit) поменяет значение на противоположное. |
CB | x | |
OUT | 1 | Когда биты OUT (OUTput level) и FT (Frequency Test) равны нулю, вывод FT/OUT прижимается к земле. При FT=1 на выводе FT/OUT 512 Гц и бит OUT не имеет значения. |
FT | 0 | |
S | x | Знак калибровки хода RTC. |
Различия начинаются в назначении битов 7, 6 и 5 регистра часов. В M41T56 биты 7 и 6 используются для индикации перехода в новое столетие, а биты 5 и 4 используются для счета десятков часов. Причем счет часов возможен только в режиме 24, режим AM/PM недоступен. В DS1307 бит 7 не используется, ноль в бите 6 указывает, что используется режим счета 24 и этом случае биты 5 и 4 содержат десятки часов. Если в бите 6 единица, то бит 5 становится флагом AM/PM, а бит 4 содержит десятки часов.
Существенные отличия есть в регистре управления, которой содержит слово коррекции хода.
Коррекция хода
M41T56 позволяет компенсировать погрешность кварцевого резонатора в диапазоне от -62 до +124 ppm, что дает отклонение не более чем ±5 секунд за месяц. За компенсацию отвечают шесть младших битов управляющего регистра. Биты 4-0 содержат целое число без знака величины коррекции, а бит 5 задает направление коррекции. Если бит 5 содержит ноль, то ход замедляется с шагом 2.034 ppm, в противном случае RTC ускоряется с шагом 4.068. Это неудобно, поэтому я набросал пару простых функций для преобразования из ppm в слово коррекции и обратно.
/* Маска для получения только значения калибровки без знака. */
#define MASK_CALIBR ((1 << 4) | (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0))
/* Маска для получения только значения калибровки без знака. */
#define MASK_CALIBR_SIGN (1 << 5)
/**
* Получение значения коррекции хода.
* @param caliber Калибровочное слово из RTC.
* @return Коррекция хода в ppm.
*/
int8_t caliber_to_ppm(uint8_t caliber)
{
int8_t result = caliber & MASK_CALIBR;
result = (uint8_t) result * 2;
if ((caliber & MASK_CALIBR_SIGN) != 0) {
result = -result;
} else {
result = (uint8_t) result * 2;
}
return result;
}
/**
* Получение калибровочного слова.
* @param ppm Коррекция хода в ppm.
* @return Калибровочное слово для RTC.
*/
uint8_t ppm_to_caliber(int8_t ppm)
{
uint8_t result;
if (ppm < 0) {
result = (uint8_t) (-ppm + 1) / 2;
result |= MASK_CALIBR_SIGN;
} else {
result = (uint8_t) (ppm + 2) / 4;
}
return result;
}
Детектирование сбоев
Ни DS1307, но M41T56 не умеют детектировать сбои генерации, но гарантируют, что при включении питания некоторые биты будут в определенном состоянии. M41T56 при включении в управляющем регистре будет 10xxxxxx. Для отслеживания сбоев в программе можно придерживаться следующего алгоритма. Если при включении микроконтроллера регистр управления RTC содержит 10xxxxxx, значит был сбой питания и в регистр нужно записать значение, старшие биты которого не равны 10. Самое простое — записать слово коррекции с битами 7 и 6 равными нулю.
Литература
Автор: u_235