Перейти к содержанию

TWI (Two-wire Serial Interface)

В даташите ATmega328P нет главы «I²C», зато есть «2-wire Serial Interface». Это тот же интерфейс: сам даташит называет модуль совместимым с протоколом I²C Philips. Разберём, как в AVR задаётся частота шины и чем модуль TWI отличается от голого I²C.

Обновлено Редакция GAW

TWI (Two-wire Serial Interface, «двухпроводной последовательный интерфейс») — название модуля I²C в микроконтроллерах AVR у Atmel и Microchip. В списке возможностей ATmega328P он описан как «Byte-oriented 2-wire Serial Interface (Philips I2C compatible)»: протокол и электрическая схема те же, что у I²C, отличается только название и набор регистров. Регистры модуля начинаются с TW: TWBR, TWSR, TWCR, TWDR, TWAR.

Что умеет модуль TWI ATmega328P

По разд. 22.1 даташита DS40002061B:

  • ведущий и ведомый режимы, передача и приём;
  • 7-битный адрес — до 128 ведомых, общий вызов по адресу 0000 000;
  • арбитраж нескольких ведущих;
  • скорость до 400 кГц;
  • выходы с ограничением крутизны фронтов и входы с подавлением помех короче 50 нс — подробнее в термине фильтр помех I²C;
  • пробуждение из сна по совпадению адреса.

У ATmega48/88/168/328 линии SDA и SCL — выводы PC4 и PC5 порта C; у других AVR TWI выведен на другие выводы, их берут из даташита конкретной модели. Число устройств на шине ограничено ёмкостью 400 пФ и адресным пространством (разд. 22.2).

Частота SCL

В режиме ведущего частоту задают регистр TWBR и биты предделителя TWPS1:0 в TWSR (разд. 22.5.2):

fSCL=fCPU16+2⋅TWBR⋅Pf_{SCL} = \frac{f_{CPU}}{16 + 2 \cdot TWBR \cdot P}

где P — значение предделителя: 1, 4, 16 или 64 при TWPS = 00, 01, 10, 11 (табл. 22-7). Обратная формула: TWBR = (f_CPU / f_SCL − 16) / (2 · P).

f_CPUНужная SCLPTWBRЧто получится
16 МГц100 кГц17216 000 000 / 160 = 100 кГц
16 МГц400 кГц11216 000 000 / 40 = 400 кГц
8 МГц100 кГц1328 000 000 / 80 = 100 кГц

Значения в таблице — свой расчёт по формуле даташита. Предделитель больше 1 нужен только для медленных шин: при TWBR до 255 и P = 1 нижняя частота при 16 МГц — 16 000 000 / 526 ≈ 30 кГц. Ведущий может тактировать шину медленнее, если ведомый растягивает низкий уровень SCL. Для работы в роли ведомого частота процессора должна быть не меньше 16 · f_SCL.

Подтяжки

Шине нужен один подтягивающий резистор на линию к плюсу питания (разд. 22.2). Даташит разрешает включить внутренние подтяжки выводов битами PORT и замечает, что иногда они заменяют внешние. Однако сопротивление внутренней подтяжки ATmega328P — 20–50 кОм (табл. 30-1), что на порядок больше обычного номинала для 100 кГц. Подобрать внешние резисторы под ёмкость шины и частоту поможет калькулятор подтяжек I²C, а о выводах и питании кристалла — в статье об ATmega328P.

Частые вопросы

TWI и I²C — это одно и то же?

По сути да. Atmel, а затем Microchip называют модуль 2-wire Serial Interface, а в списке возможностей ATmega328P прямо пишут «Philips I2C compatible». Шина та же: SDA и SCL с открытым стоком, подтяжки к питанию, 7-битные адреса, режимы до 400 кГц. Датчики и модули I²C подключают к выводам TWI без переделок.

Как рассчитать TWBR для нужной частоты SCL?

По формуле даташита SCL = F_CPU / (16 + 2 · TWBR · P), где P — предделитель 1, 4, 16 или 64. Отсюда TWBR = (F_CPU / SCL − 16) / (2 · P). При 16 МГц и P = 1 для 100 кГц получается TWBR = 72, для 400 кГц — TWBR = 12 (свой расчёт). Ведомому AVR нужна тактовая частота не меньше 16 · fSCL.

Хватит ли внутренних подтяжек AVR для TWI?

Иногда. Даташит ATmega328P разрешает включить их битами PORT и замечает, что в некоторых системах они заменяют внешние резисторы. Но их сопротивление 20–50 кОм, а по формуле UM10204 Rp(max) = tr / (0,8473 · Cb) для 100 кГц (tr = 1 000 нс) и шины 200 пФ подтяжка должна быть не больше 5,9 кОм, для 400 кГц (300 нс) — 1,8 кОм (свой расчёт). С несколькими модулями и длинными проводами ставят внешние резисторы.

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P megaAVR Data Sheet (DS40002061B, 2020) — Features: «Byte-oriented 2-wire Serial Interface (Philips I2C compatible)»; разд. 22.1: ведущий и ведомый, 7-битный адрес — до 128 ведомых, арбитраж нескольких ведущих, до 400 кГц, ограничение крутизны выходов, подавление помех, общий вызов, пробуждение по совпадению адреса; разд. 22.2: по одному подтягивающему резистору на линию, выходы с открытым стоком или коллектором, монтажное И; число устройств ограничено ёмкостью шины 400 пФ и адресным пространством; разд. 22.3: адрес 0000 000 — общий вызов, адреса 1111 xxx зарезервированы; разд. 22.5.1: входы с подавлением импульсов короче 50 нс, внутренние подтяжки включаются битами PORT; разд. 22.5.2: SCL = CPU Clock / (16 + 2·TWBR·PrescalerValue), частота ведомого — не меньше 16·fSCL; табл. 22-7: TWPS 00, 01, 10, 11 — предделитель 1, 4, 16, 64; разд. 22.9: TWBR (0xB8), TWSR (0xB9) с TWPS1:0; табл. 30-1 (Common DC characteristics, −40…105 °C): RPU вывода 20–50 кОм; табл. 29-14: требования к шине TWI; разд. 22.5.2: номинал подтяжек выбирают по частоте SCL и ёмкости шины
  2. NXP. UM10204 I2C-bus specification and user manual, Rev. 7.0, 1 October 2021 — Standard-mode до 100 кбит/с, Fast-mode до 400 кбит/с; табл. 10: время нарастания tr не больше 1 000 нс и 300 нс, ёмкость шины до 400 пФ; разд. 7.1, ур. 1: Rp(max) = tr / (0,8473 · Cb)

Нашли ошибку?