Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек 11 - Інтерфейс I2С.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
233.47 Кб
Скачать

Прием данных:

  • 0×38 — Потеря шины

  • 0×50 — Данные получены, ACK передан

  • 0×58 — Данные получены, ACK не передан<

Следует оговориться насчет ACK: В протоколе I2C после передачи каждого байта информации, предусмотрено окно в 1 такт, для того чтобы устройство, которое выполняет прием данных могло откликнуться. Этот сигнал назван ACK и для его передачи принимающее устройство должно прижать линию SDA к земле в этом такте. Иногда, так же рассматривают сигнал NACK: NOT ACK (принимающее устройство не прижало SDA к земле на 9м такте передачи). Но с моей скромной точки зрения, как сигнал NACK рассматривать нельзя: во-первых это путает, во-вторых если на шине нет никаких устройств из-за подтяжки SDA к питанию передающий, прочитав 9й такт примет его за сигнал NACK — хотя сигнала никакого не было. Проще ACK считать за отклик, а NACK — за отсутствие отклика. Мастер передал адрес в шину, если адресуемое устройство присутствует на линии — получили ACK (отклик), нет устройства — нет отклика. Так же ACK очень часто используется в передачи данных: например в случае для многобайтного чтения из 24CXX — хотим получить следующий байт формируем ACK, не хотим — не формируем.

P.S. все примеры рассчитаны на ATmega16A, но с небольшими изменениями (а возможно и без) заработают на остальных

P.P.S. Немного о граблях: Самые частонаступаемые грабли в TWI на AVR — это работа с регистром TWCR. И большинство ошибок состоит в том, что это не совсем регистр (как и многие другие в AVR). Это не просто именованная ячейка памяти, а скорее именованный 8-и битный интерфейс для работы с периферией. И работать с ним надо как с интерфейсом. При записи каких-то битов не нужно выполнять присваивание с логическим ИЛИ (|=), для правильной работы необходимо именно перезаписывать его значение.