Учебный курс 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.

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


Комментарии   

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

4^0 = 1
4^1 = 4
4^2 = 16
4^3 = 64
Ответить | Ответить с цитатой | Цитировать
# GOST 25.11.2013 13:40
Спасибо, просто не однозначно написано, я подумал, что там записаны степени 4, а не посчитанные значения.
Ответить | Ответить с цитатой | Цитировать

Добавить комментарий

Защитный код
Обновить