Передача данных по шине I2C
Устройство шины I2C достаточно простое. Она представляет собой 2-проводное соединение, которое может связывать множество устройтв для обменаданными. В самом простом случае оно связывает одно ведущее устройство (MASTER) с одним илинесколькими ведомыми устройствами (SLAVE). Все устройства подключаются к двум проводам шины I2C параллельно.Эти провода известны как линии SDA (вывод 4 порта "С" в Atmega8) и SCL (вывод 5 порта "С")SCL - тактирующая линия, которая управляется ведущим устройством. SDA - двунаправленная линия данных.Для передачи данных ведущее устройство посылает ведомому
Для управления интерфейсом TWI исаользуются регистры TWBR, TWCR, TWSR, TWDR,TWAR
Регистр TWBR
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
TWBR7 | TWBR6 |
TWBR5 |
TWBR4 | TWBR3 | TWBR2 |
TWBR1 |
TWBR0 |
Регистр TWBR устанавливает величину делителя для генератора такта.
Регистр TWCR
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
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 в этом режиме необходимо записать лог
Пиломатериалы цена. Звоните Огромный ассортимент пиломатериалов. Современные деревянные изделия lestorgstroy.com |
После передачи 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 должен быть настроен следующим образом:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
TWINT = 0 |
TWEA = 1 |
TWSTA = 0 |
TWSTO = 0 |
TWWC= 0 | TWEN = 1 |
0 | TWIE |
Когда регистры TWAR и TWCR настроены, ведомое устройство ждёт обращения по своему адресу (заданному в TWCR), за которым следует "бит направления". Если бит направления = 0 (запись), то ведомое устройство будет работать в режиме Slave Receiver. Если бит направления = 1 (запись), то ведомое устройство будет работать в режиме Slave Transmitter.
Если у вас есть какие-то замечания по этому документу или что-то осталось непонятно, то вы можете оставить свой отзыв или вопрос
Комментарии (Ваш комментарий будет первым! :))
Анонимная отправка сообщений запрещена! Пожалуйста зарегистрируйтесь
Изготовление раковин из искусственного камня камня от производителя под ключ. Гарантия synstone.ru |