Учебный курс AVR. Использования TWI модуля. Регистры. Ч2

29/10/2013 - 12:34 Павел Бобков

Для того чтобы дальше разбираться с TWI модулем, нужно ознакомиться с его регистрами, и сейчас нам придется проделать эту нудную работу. Разбор регистров будет вестись на примере микроконтроллера atmega16. В других микроконтроллерах возможны небольшие отличия. 

Регистр скорости передачи TWBR (TWI Bit Rate Register)


Любой аппаратный модуль, реализующий интерфейс (SPI, UART, TWI, USB), имеет регистры задающие скорость передачи данных. В TWI модуле эту функцию выполняет регистр TWBR и два младших разряда статусного регистра TWSR - TWPS1 и TWPS0.

Под скоростью передачи в данном случае подразумевается частота SCL сигнала, когда микроконтроллер работает в режиме ведущего устройства (мастера). В режиме ведомого (слейва) микроконтроллер "получает" SCL сигнал извне - от другого ведущего устройства. (Тактовая частота микроконтроллера в этом случае, должна быть больше частоты внешнего SCL сигнала минимум в 16 раз.)


Тактовая частота микроконтроллера, частота SCL сигнала и значение регистров TWBR и TWSR связаны следующим соотношением:

F_scl = F_cpu/(16 + 2* TWBR* 4^TWPS)

Здесь значок ^ это возведение в степень. TWPS - значение младших разрядов регистра TWSR, а TWBR- значение, содержащееся в этом регистре. 

Из этой формулы можно выразить значение TWBR:

TWBR = ((F_cpu/F_scl) - 16)/(2*4^TWPS)

Рассмотрим пример расчета.

Тактовая частота микроконтроллера 16 МГц, нужно задать частоту SCL сигнала 100 кГц. Допустим, мы выбрали нулевое значение для битов TWPS1 и TWPS0. Тогда значение для TWBR будет равно: 

TWBR = ((16000000/100000) - 16)/(2*4^0) = 72 

Довольно просто. 


Чем руководствоваться при выборе частоты SCL сигнала?

1. Возможностями устройства, с которым производится обмен по I2C. Например, микросхема часов реального времени DS1307 поддерживает частоту SCL сигнала только до 100 кГц.

2. Тактовой частотой микроконтроллера. Она накладывает естественное ограничение на возможность задания максимальной частоты. Это очевидно.

3. Электрическими характеристиками сети I2C. При большом количестве устройств и большой протяженности сети, передача данных на максимальной скорости может оказаться невозможной - сигналы будут искажаться из-за паразитной емкости сети или помех. Номиналы подтягивающих резисторов тоже влияют на максимальную частоту. Об этом можно прочитать в даташите atmega16 в разделе Two-wire Serial Interface Characteristics.

Регистр данных TWDR (TWI Data Register)

Функции регистра данных очевидны. В него мы помещаем то, что хотим передать и забираем то, что получили с шины. Когда все это нужно делать, будет понятно в практической части.

 




Регистр адреса TWAR (TWI Address Register)

Микроконтроллер может выполнять функции как ведущего, так и ведомого устройства. Естественно по очереди, а не одновременно.

Если микроконтроллер выступает в роли ведомого, ему необходим адрес, на который он будет "отзываться". Регистр TWAR и предназначен для хранения 7-и разрядного адреса. Младший разряд (TWGCE) этого регистра разрешает/запрещает микроконтроллеру отзываться на общие вызовы, то есть на пакеты с адресом 0x00.


Статусный регистр TWSR (TWI Status Register)

Статусный регистр TWSR отражает состояние TWI модуля и двухпроводной шины, а также содержит разряды, задающие коэффициент деления частоты SCL сигнала. В самом начале мы об этом говорили.

Биты TWS7.. TWS3 содержат статусный код. Биты доступны только для чтения, статусный код устанавливается TWI модулем аппаратно, после выполнения различных операций. Например, формирование состояния СТАРТ, передачи пакета данных и так далее. По значению статусного кода можно судить о результате операции. Выполнилась ли она успешно или нет.

Кодов много, поэтому будем рассматривать их в практической части. В топорном варианте работы с TWI модулем их можно игнорировать, но тогда надежность программы будет заведомо низкая.

 


Регистр управления TWCR (TWI Control Register)

TWCR - самый важный регистр TWI модуля. Много разрядов, каждый отвечает за отдельную функцию, поэтому я оставил его на десерт. 


TWINT(TWI Interrupt Flag) - флаг прерывания TWI модуля. Этот бит устанавливается аппаратно, когда TWI модуль завершает текущую операцию (формирование состояния СТАРТ, передачи адресного пакета и так далее). При этом если установлен бит глобального разрешения прерываний (бит I регистра SREG) и разрешены прерывания TWI модуля, то вызывается соответствующий обработчик.

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

Пока бит TWINT установлен, на линии SCL удерживается низкий уровень.

TWEA (TWI Enable Acknowledge Bit) - разрешение бита подтверждения. Если бит TWEA установлен в 1, TWI модуль формирует сигнал подтверждения (ACK), когда это требуется. А требуется это в трех случаях: ведущее или ведомое устройство получило байт данных, ведомое устройство получило общий вызов, ведомое устройство получило свой адрес.

TWSTA (TWI START Condition Bit) - флаг состояния СТАРТ. Когда этот бит устанавливается в 1, TWI модуль проверяет не занята ли шина и формирует состояние СТАРТ. Если шина занята, он будет ожидать появления на ней состояния СТОП и после этого выдаст состояние СТАРТ. Бит TWSTA должен быть очищен программно, когда состояние СТАРТ передано.

TWSTO (TWI STOP Condition Bit) - флаг состояния СТОП. Когда этот бит устанавливается в 1 в режиме ведущего, TWI модуль выдает на шину состояние СТОП и сбрасывает этот бит. В режиме ведомого установка этого бита может использоваться для восстановления после ошибки. При этом состояние СТОП не формируется, но TWI модуль возвращается к начальному не адресованному состоянию.

TWWC (TWI Write Collision Flag) - флаг конфликта записи. Этот флаг устанавливается аппаратно, когда выполняется запись в регистр данных (TWDR) при низком значении бита TWINT. То есть когда TWI модуль уже выполняет какие-то операции.
Флаг TWWC сбрасывается аппаратно, когда запись в регистр данных выполняется при установленном флаге прерывания TWINT.

TWEN (TWI Enable Bit) - бит разрешения работы TWI модуля. Когда бит TWEN устанавливается в 1, TWI модуль включается и берет на себя управление выводами SCL и SDA. Когда бит TWEN сбрасывается, TWI модуль выключается.

TWIE (TWI Interrupt Enable) - разрешение прерывания TWI модуля. Когда бит TWIE и бит I регистра SREG установлены в 1 - прерывания модуля TWI разрешены. Прерывания будут вызываться при установке бита TWINT.

На этом все. Продолжение следует. Вступаем в группу в контакте.


Comments   

# Вова 2013-10-29 14:01
Павел, ты офигенен. Если Будет время и желание, то пиши также про армы. Ты классный парень.
# Pashgan 2013-10-29 14:09
Я скорее всего про атмеловские АРМы буду материалы делать - SAM3, SAM4.
# FreshMan 2013-10-29 18:43
Quote:
Из этой формулы можно выразить значение TWBR:
почему, растолкуй пожалуйста :-)
# Pashgan 2013-10-29 18:49
В даташите приведена первая формула. Нужно рассчитать TWBR. Как это сделать? Выразить TWBR из этой формулы.
# Noone 2013-10-30 18:05
Павел, если не трудно опиши пожалуйста TWI для XMEGA. Я думаю ты зря обходишь эти контроллеры стороной. За ними будущее наверное
# Pashgan 2013-10-30 19:32
Ну как обхожу... я их просто нигде не применял. Все мое знакомство с Xmega ограничено сборкой макета и простейшими программами. Побаловался и бросил его.
# САБ 2013-10-31 10:55
Quoting Noone:
За ними будущее наверное
Не смешите. Чтобы конкурировать с Кортексами они должны стоить рупь за мешок. Принынешних ценах вообще удивительно, что кто-то их применяет.
# Всегда прав 2013-10-31 17:05
Так как не весь мир и окрестности пересел на всякие stm8s003, stm32f050 и остальной ультрадешевый "фуфел", то наверное стоимость МК не так важна и конкретно у него, вполне возможно, "за ними будущее" (может у него ICE3 завалялся)
# Noone 2013-10-31 17:22
Я имел будущее в восьми битном сегменте линейки AVR))) а ICE3 действительно есть. Просто я сторонник хорошо структурированн ого кода, особенно жалую С++, а в XMEGA все управляющие компоненты неплохо объеденены в структуры, причем онифицировано. А не как в MEGA - одна часть настроек модуля в одной части управляющего регистра, а другая почему то в другой. А если ты меняешь камень, во вообще много что переделывать придется. Так что пацаны, я не претендую на ваши чувства к разным камням, имел ввиду будушее в восьмибитном сегменте AVR. на смену 90S1200 пришли меги. И на смену меги придет xmega и так далее. Это естественно и от нас зависит не сильно. Старые линейки просто снимаются с производства
# GOST 2013-11-24 22:55
У вас ошибка в расчетах скорости передачи: при нулевых значениях битов TWPS1 и TWPS0 будет первая степень, следовательно TWBR = 0x14 или 20.
# Pashgan 2013-11-24 23:12
В расчете статьи нет ошибки.
# GOST 2013-11-25 06:20
То есть в таблице предварительног о делителя указывается не степень 4-ки, а уже пощитанное число?
# Pashgan 2013-11-25 11:35
О какой таблице идет речь?
# GOST 2013-11-25 12:05
В даташите к меге16 на странице 182.
# Pashgan 2013-11-25 12:18
Там указывается посчитанное значение выражения 4 в степени n, где n двухбитное число TWPS1:TWPS0.

4^0 = 1
4^1 = 4
4^2 = 16
4^3 = 64
# GOST 2013-11-25 13:40
Спасибо, просто не однозначно написано, я подумал, что там записаны степени 4, а не посчитанные значения.

У вас недостаточно прав для комментирования.