Передача данных по шине I2C

Документация

Устройство шины I2C достаточно простое. Она представляет собой 2-проводное соединение, которое может связывать множество устройтв для обменаданными. В самом простом случае оно связывает одно ведущее устройство (MASTER) с одним илинесколькими ведомыми устройствами (SLAVE). Все устройства подключаются к двум проводам шины I2C параллельно.Эти провода известны как линии SDA (вывод 4 порта "С" в Atmega8) и SCL (вывод 5 порта "С")SCL  - тактирующая линия, которая управляется ведущим устройством. SDA - двунаправленная линия данных.Для передачи данных ведущее устройство посылает ведомому

Для  управления  интерфейсом  TWI исаользуются регистры TWBR, TWCR, TWSR, TWDR,TWAR

Регистр TWBR

76543210
TWBR7 TWBR6
TWBR5
 TWBR4  TWBR3 TWBR2
TWBR1
 TWBR0

Регистр TWBR  устанавливает величину делителя для генератора такта.

Регистр TWCR

76543210
TWINT TWEA
TWSTA
 TWSTO  TWWC TWEN
-  TWIE

Регистр TWCR используется для управления работой TWI - включения TWI, отправки условия START, STOP, Receiver ACK. Он также показывает ошибки записи, если предпринимается попытка записи данных в  регистр TWDR, когда он недоступен.

TWINT - флаг разрешения прерываний по окончанию работы TWI. После обработки прерывания TWINT не сбрасывается в 0 автоматически, и это нужно сделать вручную. Сброс в 0 этого флага снова вулючает TWI.

Схема передачи данных

1. Отправка условия START. Отправка осуществляется записью в TWCR специального значения, указывающего оборудованию передать условие START. Какое значение записывается в TWCR будет описано позже. Для начала передачи данных необходимо сбросить бит TWINT регистра TWCR (обратите внимание, что бит TWINT сбрасывается записью в него лог.1)

2. После отправки условия START, бит TWINT снова выставляется, а в регистре TWSR будет содержаться специальный код статуса, сигнализирующий об успешности отправки START

3.  Послен проверки регистра TWSR на успешность отправки START необходимо записать SLA+W в TWDR, сбросить TWINT  и отправить SLA_W.

4. Когда адресный пакет SLA_W будет передан флаг TWINT будет автоматически установлен, и в регистре TWSR будет содержаться соответствующий статус. Статус будет также содержать информацию о том,  подтвердило ли принятие пакета ведомое устройство

5. Если статус в регистре TWSR подтверждает успешность отправки адресного пакета, а также бит ACK соответствует ожидаемому, записываем в регистр TWDR данные и передаём их.

6. Когда данные будут переданы флаг TWINT будет автоматически установлен, и в регистре TWSR будет содержаться соответствующий статус. Статус будет также содержать информацию о том,  подтвердило ли принятие пакета ведомое устройство

7. Если статус в регистре TWSR подтверждает успешность отправки данных, то в регистр TWCR записывается STOP условие

Режимы работы TWI

TWI может работать в 4 режимах - Master Transmitter, Master Receiver, Slave Transmitter, Slave Receiver

Master Transmitter

Для передачи условия START в этом режиме необходимо записать лог.1 в биты TWINT, TWSTA, TWENT регистра TWCR.

После передачи START значение регистра TWSR должно принять значение 0x08. Далее для входа в режим нужно передать команду SLA+W.

Для передачи команды SLA_W нужно записать её в регистр TWDR, и затем отправить её, установив лог.1 в битах TWINT и TWENT регистра TWCR. После того, как команда отправлена и получен бит подтверждения TWINT снова устанавливается (сбрасывается в лог.0) а значение регистра TWSR принимает одно из следующих значений  - 0x18, 0x20, или 0x38.

После этого можно отправлять пакет с данными, записав их в регистр TWDR. Записывать нужно когда TWINT установлен (TWINT=0). Если это условие не соблюдается, то будет установлен бит ошибки записи TWWC регистра TWDR. Отправка пакета данных осуществляется установкой лог.1 в битах TWINT и TWENT регистра TWCR. Эта схема повторяется до тех пор, пока все байты данных не переданы. Затем передачу данных нужно остановить отправив условия STOP или REPEATED START.

Для передачи условия STOP  необходимо записать лог.1 в биты TWINT, TWSTO, TWENT регистра TWCR.

Для передачи условия REPEATED START  необходимо записать лог.1 в биты TWINT, TWSTA, TWENT регистра TWCR. После успешной передачи REPEATED START в регистре состояния TWSR установится знаячение 0x10. Repeated START позволяет переключаться между ведомыми устройствами, а также между режимами работы ведущего устройства без потери управления шиной.

Возможные статусы в регистре TWSR для Master Transmitter

Код статуса Состояние шины To/From TWDR STA STO TWINT TWEA Следующее действие
0x08 Передано условие START SLA+W 0 0 1 X Отправка команды SLA+W. В ответ ожидается пакет ACK или NOT ACK
0x10 Передано условие REPETED START SLA+W 0 0 1 X Отправка команды SLA+W. В ответ ожидается бит ACK или NOT ACK
0x10 Передано условие REPETED START SLA+R 0 0 1 X Отправка команды SLA+R. Переключение в режим Master Receiver
0x18 Передана команда SLA+W, бит ACK получен Запись байта данных 0 0 1 X Отправка байта данных. В ответ ожидается бит ACK или NOT ACK
0x20 Передана команда SLA+W, бит NO ACK получен Запись байта данных 0 0 1 X Отправка байта данных. В ответ ожидается бит ACK или NOT ACK
0x28 Передан байт данных, бит ACK получен Запись байта данных 0 0 1 X Отправка байта данных. В ответ ожидается бит ACK или NOT ACK
0x30 Передан байт данных, бит NO ACK получен Запись байта данных 0 0 1 X Отправка байта данных. В ответ ожидается бит ACK или NOT ACK

Возможные статусы в регистре TWSR для Master Receiver

Код статуса Состояние шины To/From TWDR STA STO TWINT TWEA Следующее действие
0x08 Передано условие START SLA+R 0 0 1 X Отправка команды SLA+R. В ответ ожидается пакет ACK или NOT ACK
0x10 Передано условие REPETED START SLA+R 0 0 1 X Отправка команды SLA+R. В ответ ожидается бит ACK или NOT ACK
0x10 Передано условие REPETED START SLA+W 0 0 1 X Отправка команды SLA+W. Переключение в режим Master Transmitter
0x38 Бит ACK не  получен
       
0x40 Передана команда SLA+R, бит  ACK получен
0 0 1 0 Получение байта данных, возврат бита NOT ACK
0x40 Передана команда SLA+R, бит  ACK получен
0 0 1 1 Получение байта данных, возврат бита  ACK
0x48 Передана команда SLA+R, бит  NO ACK получен
1 0 1 X Будет передана команда Repeated Start
0x48 Передана команда SLA+R, бит  NO ACK получен
0 1 1 X Будет передана команда STOP и сброшен флаг TWSTO
0x48 Передана команда SLA+R, бит  NO ACK получен
1 1 1 X Будет передана команда STOP и последующая команда START и сброшен флаг TWSTO
0x50 Получен байт данных и отдан бит  ACK

0 0 1 0
Будет получен новый байт данных отдан бит NO ACK
0x50 Получен байт данных и отдан бит  ACK

0 0 1 1
Будет получен новый байт данных отдан бит ACK
0x58 Получен байт данных и отдан бит NO ACK

1 0 1 X Будет передана команда Repeated Start
0x58 Получен байт данных и отдан бит NO ACK

0 1 1 X Будет передана команда STOP и сброшен флаг TWSTO
0x58 Получен байт данных и отдан бит NO ACK

1 1 1 X Будет передана команда STOP и последующая команда START и сброшен флаг TWSTO

Режим Slave Receiver

В этом режиме ведомое устройство принимает данные от ведущего устройства. Для активации режима нужно  выставить биты TWAR и TWCR следующим образом.

Биты  1-7 регистра TWAR задают адрес ведомого устройства. Последний бит регистра TWAR отвечает за то, бкдет ли устройство доступно при обращении  по General Call адресу 0x00;

Регистр TWCR должен быть настроен следующим образом:

76543210
TWINT = 0
TWEA = 1
TWSTA  =  0
 TWSTO  = 0
 TWWC= 0 TWEN = 1
0  TWIE

Когда регистры TWAR и TWCR настроены, ведомое устройство  ждёт обращения по своему адресу (заданному в TWCR), за которым следует "бит  направления". Если бит направления = 0 (запись), то ведомое устройство будет работать  в режиме Slave Receiver. Если бит направления = 1 (запись), то ведомое устройство будет работать  в режиме Slave Transmitter.


Если у вас есть какие-то замечания по этому документу или что-то осталось непонятно, то вы можете оставить свой отзыв или вопрос

Комментарии (Ваш комментарий будет первым! :))

Анонимная отправка сообщений запрещена! Пожалуйста зарегистрируйтесь