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

TWI (I²C) ATmega16A: регистры и биты

Аппаратный I²C, в документации Atmel и Microchip — TWI: ведущий и ведомый режимы. Частоту SCL задают TWBR и предделитель TWPS, каждый шаг обмена (START, адрес, байт данных, STOP) запускается записью в TWCR и заканчивается флагом TWINT, а код состояния шины читается из TWSR.

Данные: описание ATmega16A из пакета Microchip ATmega_DFP 3.6.299 (Apache-2.0), сверено со сводкой регистров даташита 8154C.

Регистры блока

РегистрАдресНазначениеПосле сброса
TWBR0x20 (I/O 0x00)Скорость TWI0x00
TWSR0x21 (I/O 0x01)Состояние TWI0xF8
TWAR0x22 (I/O 0x02)Собственный адрес TWI0xFE
TWDR0x23 (I/O 0x03)Данные TWI0xFF
TWCR0x56 (I/O 0x36)Управление TWI0x00

Конструктор значения

Выберите регистр и включите нужные биты — конструктор покажет значение и строку кода на C и ассемблере. Начальное значение — после сброса.

Исходные данные

Результат

Значение
0x00
Двоичное, биты 7…0
0000 0000

C (avr-gcc, avr/io.h)

TWCR = 0;

Ассемблер Microchip (m16adef.inc)

ldi r16, 0x00
out TWCR, r16

TWBR — скорость TWI

Адрес 0x20 (I/O 0x00), 8 бит, после сброса 0x00.

Регистр данных: все восемь битов — одно число.

TWSR — состояние TWI

Адрес 0x21 (I/O 0x01), 8 бит, после сброса 0xF8.

Бит76543210
ИмяTWS7TWS6TWS5TWS4TWS3—TWPS1TWPS0
ДоступRRRRRRR/WR/W
После сброса11111000
  • TWS7:3 (биты 7:3) — Код состояния TWI.
  • TWPS1:0 (биты 1:0) — Предделитель скорости TWI.
    TWPS1:0Значение
    00Деление на 1
    01Деление на 4
    10Деление на 16
    11Деление на 64

TWAR — собственный адрес TWI

Адрес 0x22 (I/O 0x02), 8 бит, после сброса 0xFE.

Бит76543210
ИмяTWA6TWA5TWA4TWA3TWA2TWA1TWA0TWGCE
ДоступR/WR/WR/WR/WR/WR/WR/WR/W
После сброса11111110
  • TWA6:0 (биты 7:1) — Собственный адрес в режиме ведомого.
  • TWGCE (бит 0) — Отвечать на общий вызов (адрес 0).

TWDR — данные TWI

Адрес 0x23 (I/O 0x03), 8 бит, после сброса 0xFF.

Регистр данных: все восемь битов — одно число.

TWCR — управление TWI

Адрес 0x56 (I/O 0x36), 8 бит, после сброса 0x00.

Бит76543210
ИмяTWINTTWEATWSTATWSTOTWWCTWEN—TWIE
ДоступR/WR/WR/WR/WRR/WRR/W
После сброса00000000
  • TWINT (бит 7) — Флаг TWI: шаг обмена завершён. Сбрасывается только записью единицы — при входе в обработчик прерывания сам не сбрасывается; запись единицы запускает следующий шаг обмена.
  • TWEA (бит 6) — Отвечать подтверждением (ACK).
  • TWSTA (бит 5) — Сформировать START.
  • TWSTO (бит 4) — Сформировать STOP.
  • TWWC (бит 3) — Конфликт записи в TWDR.
  • TWEN (бит 2) — TWI включён.
  • TWIE (бит 0) — Прерывание TWI.

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

Какими командами ассемблера обращаться к регистрам TWI ATmega16A?

Командами IN и OUT доступны TWBR (0x00), TWSR (0x01), TWAR (0x02), TWDR (0x03) и TWCR (0x36); из них TWBR, TWSR, TWAR и TWDR — ещё и командами SBI, CBI, SBIS и SBIC для отдельных битов. В программе на C разницы нет: компилятор сам выбирает команду по адресу из avr/io.h.

Какие значения у регистров TWI после сброса?

После сброса TWSR = 0xF8, TWAR = 0xFE и TWDR = 0xFF; остальные регистры блока обнулены. Значения — из диаграмм регистров в даташите 8154C.

Как установить биты TWCR на C?

Имена регистров и битов определены в avr/io.h, бит задаётся сдвигом единицы на его номер: TWCR = (1 << TWINT) | (1 << TWEA); записывает новое значение целиком, а TWCR |= (1 << TWINT); меняет только этот бит. Готовую строку для любого набора битов даёт конструктор на этой странице.

Источники

  1. Microchip. Atmel. ATmega16A datasheet (8154C) — сводка регистров, диаграммы битов и значения после сброса
  2. Microchip ATmega_DFP 3.6.299, описание ATmega16A (ATDF) — регистры, битовые поля и их значения, лицензия Apache-2.0

Нашли ошибку в регистрах?

Другие регистры ATmega16A

Калькуляторы и статьи