TWI (I²C) ATmega328P: регистры и биты
Аппаратный I²C, в документации Atmel и Microchip — TWI: ведущий и ведомый режимы. Частоту SCL задают TWBR и предделитель TWPS, каждый шаг обмена (START, адрес, байт данных, STOP) запускается записью в TWCR и заканчивается флагом TWINT, а код состояния шины читается из TWSR.
Данные: описание ATmega328P из пакета Microchip ATmega_DFP 3.6.299 (Apache-2.0), сверено со сводкой регистров даташита DS40002061B.
Регистры блока
Конструктор значения
Выберите регистр и включите нужные биты — конструктор покажет значение и строку кода на C и ассемблере. Начальное значение — после сброса.
Исходные данные
Результат
- Значение
- 0x00
- Двоичное, биты 7…0
- 0000 0000
C (avr-gcc, avr/io.h)
TWCR = 0;Ассемблер Microchip (m328Pdef.inc)
ldi r16, 0x00
sts TWCR, r16TWBR — скорость TWI
Адрес 0xB8, 8 бит, после сброса 0x00.
Регистр данных: все восемь битов — одно число.
TWSR — состояние TWI
Адрес 0xB9, 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
Адрес 0xBA, 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
Адрес 0xBB, 8 бит, после сброса 0xFF.
Регистр данных: все восемь битов — одно число.
TWCR — управление TWI
Адрес 0xBC, 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.
TWAMR — маска адреса TWI
Адрес 0xBD, 8 бит, после сброса 0x00.
| Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| Имя | TWAM6 | TWAM5 | TWAM4 | TWAM3 | TWAM2 | TWAM1 | TWAM0 | — |
| Доступ | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R |
| После сброса | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- TWAM6:0 (биты 7:1) — Маска сравнения адреса.
Частые вопросы
Какими командами ассемблера обращаться к регистрам TWI ATmega328P?
TWBR, TWSR, TWAR, TWDR, TWCR и TWAMR лежат за пределами области ввода-вывода, их читают и пишут командами LDS и STS (или LD и ST) по адресу в пространстве данных. В программе на C разницы нет: компилятор сам выбирает команду по адресу из avr/io.h.
Какие значения у регистров TWI после сброса?
После сброса TWSR = 0xF8, TWAR = 0xFE и TWDR = 0xFF; остальные регистры блока обнулены. Значения — из диаграмм регистров в даташите DS40002061B.
Как установить биты TWCR на C?
Имена регистров и битов определены в avr/io.h, бит задаётся сдвигом единицы на его номер: TWCR = (1 << TWINT) | (1 << TWEA); записывает новое значение целиком, а TWCR |= (1 << TWINT); меняет только этот бит. Готовую строку для любого набора битов даёт конструктор на этой странице.
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — сводка регистров, диаграммы битов и значения после сброса
- Microchip ATmega_DFP 3.6.299, описание ATmega328P (ATDF) — регистры, битовые поля и их значения, лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры ATmega328P
- Все регистры ATmega328PТаблица по адресам
- USART0UCSR0A, UCSR0B, UCSR0C, UBRR0, UDR0
- Таймер-счётчик 1 (16 бит)TIFR1, GTCCR, TIMSK1, TCCR1A, TCCR1B, TCCR1C
- Таймер-счётчик 2 (8 бит, асинхронный)TIFR2, GTCCR, TIMSK2, TCCR2A, TCCR2B, TCNT2
- АЦПADC, ADCSRA, ADCSRB, ADMUX, DIDR0
- Аналоговый компараторACSR, DIDR1
- Порты ввода-выводаPINB, DDRB, PORTB, PINC, DDRC, PORTC
- Таймер-счётчик 0 (8 бит)TIFR0, GTCCR, TCCR0A, TCCR0B, TCNT0, OCR0A
- Внешние прерыванияPCIFR, EIFR, EIMSK, PCICR, EICRA, PCMSK0
- SPISPCR, SPSR, SPDR
- EEPROMEECR, EEDR, EEAR
- Ядро и системные регистрыGPIOR0, GPIOR1, GPIOR2, SMCR, MCUSR, MCUCR