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.
Регистры блока
Конструктор значения
Выберите регистр и включите нужные биты — конструктор покажет значение и строку кода на C и ассемблере. Начальное значение — после сброса.
Исходные данные
Результат
- Значение
- 0x00
- Двоичное, биты 7…0
- 0000 0000
C (avr-gcc, avr/io.h)
TWCR = 0;Ассемблер Microchip (m16adef.inc)
ldi r16, 0x00
out TWCR, r16TWBR — скорость TWI
Адрес 0x20 (I/O 0x00), 8 бит, после сброса 0x00.
Регистр данных: все восемь битов — одно число.
TWSR — состояние TWI
Адрес 0x21 (I/O 0x01), 8 бит, после сброса 0xF8.
| Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| Имя | TWS7 | TWS6 | TWS5 | TWS4 | TWS3 | — | TWPS1 | TWPS0 |
| Доступ | R | R | R | R | R | R | R/W | R/W |
| После сброса | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
- 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.
| Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| Имя | TWA6 | TWA5 | TWA4 | TWA3 | TWA2 | TWA1 | TWA0 | TWGCE |
| Доступ | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
| После сброса | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
- TWA6:0 (биты 7:1) — Собственный адрес в режиме ведомого.
- TWGCE (бит 0) — Отвечать на общий вызов (адрес 0).
TWDR — данные TWI
Адрес 0x23 (I/O 0x03), 8 бит, после сброса 0xFF.
Регистр данных: все восемь битов — одно число.
TWCR — управление TWI
Адрес 0x56 (I/O 0x36), 8 бит, после сброса 0x00.
| Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| Имя | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | — | TWIE |
| Доступ | R/W | R/W | R/W | R/W | R | R/W | R | R/W |
| После сброса | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- 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); меняет только этот бит. Готовую строку для любого набора битов даёт конструктор на этой странице.
Источники
- Microchip. Atmel. ATmega16A datasheet (8154C) — сводка регистров, диаграммы битов и значения после сброса
- Microchip ATmega_DFP 3.6.299, описание ATmega16A (ATDF) — регистры, битовые поля и их значения, лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры ATmega16A
- Все регистры ATmega16AТаблица по адресам
- Таймер-счётчик 0 (8 бит)SFIOR, TCNT0, TCCR0, TIFR, TIMSK, OCR0
- Таймер-счётчик 1 (16 бит)ICR1, OCR1B, OCR1A, TCNT1, TCCR1B, TCCR1A
- Внешние прерыванияMCUCSR, MCUCR, GIFR, GICR
- EEPROMEECR, EEDR, EEAR
- Ядро и системные регистрыWDTCR, SFIOR, OSCCAL, OCDR, MCUCSR, MCUCR
- Таймер-счётчик 2 (8 бит, асинхронный)ASSR, OCR2, TCNT2, TCCR2, SFIOR, TIFR
- SPISPCR, SPSR, SPDR
- USARTUBRRL, UCSRB, UCSRA, UDR, UCSRC, UBRRH
- Аналоговый компараторACSR, SFIOR
- АЦПADC, ADCSRA, ADMUX, SFIOR
- Порты ввода-выводаPIND, DDRD, PORTD, PINC, DDRC, PORTC