Avr i2c: AVR. Учебный Курс. Использование AVR TWI для работы с шиной IIC (i2c)

Содержание

AVR Интерфейс TWI (I2C) | Программирование микроконтроллеров

&nbsp

&nbsp

&nbsp

 

Урок 16

Часть 1

 

 

 

Опыт нашей предыдущей работы с микроконтроллерами AVR показал то, что мы уже многому научились, в том числе общаться с внешними устройствами типа ПК. Теперь, я думаю, все понимают, что этого недостаточно. Есть масса устройств и датчиков, которые нам хочется подключить к микроконтроллера и, мало того, ещё ими и поуправлять, забрать у них какие-то данные. Только данные девайзы подключаются к МК с помощью проводов и существует несколько видов подключений. Один из таких видов — шина I2C. Данный интерфейс является авторской разработкой компании Phillips и поэтому Atmel, чтобы не нарушать авторские права, немного изменила наименование данной шины и назвала её TWI (Two-wire Serial Interface).

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

Как мы уже поняли, данный интерфейс предаёт данные по проводам. Причем именно по двум проводам

 

 

Как мы видим из данной блок-схемы, у нас есть два провода или контакта — SDA и SCL, подсоединённые к контроллеру к его соответствующим ножкам, а затем к этим проводам мы ещё подключаем какое-нибудь устройство или несколько устройств. Теоретически мы можем подключить до 127 устройств, впоследствии мы поймём, почему именно столько. Ножка SDA отвечает за передачу и приём данных по данной шине, а ножка SCL — это ножка тактирования, таким образом шина I2C является синхронной, что увеличивает стабильность и гарантированность передачи данных по ней. Также в данной блок-схеме мы наблюдаем то, что ещё к данным ножкам необходимо подтянуть резисторы на шину питания, причём как правило в каких-то модулях или устройствах данные резисторы уже подтянуты, и. если мы подключим их несколько, то у нас получится ряд параллельно подключенных подтягивающих резисторов, что будет очень нехорошо и придется оставить их в каком-то одном усторйстве, а в других выпаять. Всё это происходит потому, что есть ограничение на номинал данных резисторов в зависимости от определенных условия

 

 

Как показала практика, данные резисторы не должны быть сопротивлением более 10 килоом и менее 4,7 килоом.

Также, само собой, сигналы должны быть толерантными к логическим уровням нашего МК, поэтому подключенные устройства должны быть соответствующим образом запитаны, а также общий провод устройств и контроллера также должен быть объединён.

Хочу подчеркнуть, что данный интерфейс в микроконтроллрах AVR реализован на аппаратном уровне. Можно также организовывать его и программным способом, путём включение в определённое время двух любых ножек портов в определенные логические состояния, но само собой, аппаратная организация всегда лучше по всем показателям. Программная реализация как правило используется, если не хватит одной шины, но как правило хватает, так как мы выше уже видели, что устройств можно к одной шине подключить несколько. Таким образом, мы будем рассматривать именно аппаратную реализацию — на уровне регистров контроллера.

 

 

В сдедующей блок-схеме мы видим следующие регистры интерфейса TWI в контроллере Atmega8

 

 

Давайте с ними кратко ознакомимся.

Регистр TWBR — это регистр, в котором мы устанавливаем значения для обеспечения определённой скорости шины. Устройства, которые мы подключаем по I2C требуют определённой скорости ну или определённого диапазона скоростей. Расчитывается эта скорость или битрейт по следующей формуле

 

 

Как мы видим, в данной формуле для расчета частоты шины участвует частота тактирования контроллера, значение регистра TWBR, а также значение 

TWPS, судя по формуле представляющий собой предделитель, то есть, чем он больше, тем больше будет коэффициент деления, так как в степерь значения данного регистра мы возводим цифру 4.

Причем TWPS — это не отдельный регистр, а совокупность всего лишь двух битов статусного регистра TWSR, в котором помимо этих битов есть ещё и другие, посредством которых мы будем отслеживать определенные состояния или ошибки обмена данными. Есть перечень кодов статуса, по которым мы и будем узнавать, удачно ли прошла команда или что-то не так.

Также само собой существует ещё и управляющий регистр TWCR, с помощью установки в соответствующее состояния битов которого мы будем определённым образом настраивать нашу шину.

Есть ещё адресный регистр TWAR, с помощью которого, если мы настраиваем контроллер ведущим устройством, мы передаем ведомому устройству 7-битный адрес (отсюда и 127 максимально устройств на шине), по которому-то как раз и будет обращение именно к определённому устройству из всех навешанных на наши два провода. А восьмой бит к адресу будет добавляться для того, чтобы передать, читаем мы данные или пишем. А если у нас контроллер будет настроен как ведомое устройство, то в данном регистре мы будем получать от ведущего адрес и сравнивать его с определённым, чтобы понять, обратился ведущий именно к нам или к кому-то другому.

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

Вот, вообщем, вкратце о регистрах так.

В следующей части занятия мы продолжим подробнее заниматься с данной шиной.

 

Предыдущий урок Программирование МК AVR Следующая часть

 

Программатор и модуль RTC DS1307 с микросхемой памяти можно приобрести здесь:

Программатор (продавец надёжный) USBASP USBISP 2.0

Модуль RTC DS1307 с микросхемой памяти

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

Post Views: 19 279

ATMega8 / Передача данных по шине 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.

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

Avr i2c slave

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


Поиск данных по Вашему запросу:

Avr i2c slave

Схемы, справочники, даташиты:

Прайс-листы, цены:

Обсуждения, статьи, мануалы:

Дождитесь окончания поиска во всех базах.

По завершению появится ссылка для доступа к найденным материалам. ПОСМОТРИТЕ ВИДЕО ПО ТЕМЕ: I2C Slave Transmit demo with ARM and AVR boards

roboforum.ru


I remembered a little hardcore in Hardwar with TWI interface, which takes a few years ago. Who would not say, and Assembler perfectly cleanses the brain and develops an understanding of the algorithms. The most important thing I learned while working with AVR microcontrollers on Assembler, is the fact that all the operations, all directives, all functions must be written in a clear sequence. After all, if the write data in the register is not in the sequence, then your controller firmware does not work.

And when writing code in high-level languages, sometimes you can see a complete indifference to the sequence of calling functions and methods, though often in the instructions to the libraries can be read, in what order you need to initialize a particular functionality, to get everything working.

But who would read them carefully? Well, if you dear reader to read this paragraph instead skopipastit immediately imagine a software library of code that is shown below. This type of in-circuit is an analog interface I2C interface, which was developed by Philips in the s. This interface is used as a hardware module and a microcontroller Atmega thus easier I2C bus on which the other devices operate.

The name is different from I2C is a result of the impact of patent law. Address space in the classic version is addresses in the extended address standard. TWI bus operates on the principle of Master-Slave. Lead submits the starting premise, then begins transmitting a byte of information. As soon as the slave received the information, it sends an acknowledge bit. End of data is determined by stop sending.

This article presents a library to work with TWI interface, which is designed to Atmega48 microcontrollers, Atmega88, Atmega, Atmega Also, the library can be used for work and other microcontrollers Atmega, which have a TWI interface.

Also for the library you want to initialize the stack of the microcontroller. For example as follows:. By article asked 0 question s. Picture in database in Qt — Saving and Loading. Django — Tutorial How to add authentication through social networks. Заполнение TabBar. Скачивание файлов. Кроссплатформенная сборка qt приложений с использованием cmake. Select section. Register — Forgot your password? Share code Write article Ask a question Take the test Suggest a question.

TWI interface This type of in-circuit is an analog interface I2C interface, which was developed by Philips in the s. For projects on Django we recommend VDS hosting. Section subscription 6. Money PayPal. Only authorized users can post comments. Please, Log in or Sign up. Looking for a Job? For registered users on the site there is a minimum amount of advertising Register on the site. Back to top. Last passed tests Rating.

Enumerations Result: points, Rating points Structures and Classes Result: 83 points, Rating points 4. Pointers, Arrays and Loops Result: 90 points, Rating points 8. Last comments. Picture in database in Qt — Saving and Loading Может база не открылась в прошлый раз. Либо пересобрали проект.

Спасибо за пример, все понятно. Я подозреваю,…. Evgenij Legotskoj Django — Tutorial VKontakte Если честно то с авторизацией в мобильном приложении я не работал.

Знаю, что для таких вещей используют батарейку Django Rest Framework, с помощью которого можно получить токена для самого сайта…. VKontakte Спасибо за оперативный ответ! Я сейчас разрабатываю приложение на андроид и параллельно пытаюсь писать сервер на джанго, поэтому запуталась, как к чему подключаться Я правильно понимаю…. VKontakte Добрый день. В данном примере все url подключаются в корень сайта. Now discuss on the forum. Если так то это не помогло. Vadim Polshkov Скачивание файлов Здравствуйте.

Спасибо, я вас понял, сегодня чуть позже сделаю. Дерево из QDomElement я построить могу — это не является какой-то сложной задачей. Задача не тривиальная потому, что если текст разбит на …. Evgenij Legotskoj Кроссплатформенная сборка qt приложений с использованием cmake Ждёмс тогда. Надо вот так. Services For advertisers.


ATxmega256A3

Используется для соединения низкоскоростных периферийных компонентов. Название является аббревиатурой слов Inter-Integrated Circuit. I2C использует две двунаправленные линии, подтянутые к напряжению питания и управляемые через открытый коллектор или открытый сток — последовательная линия данных SDA, англ. Serial CLock. Классическая адресация включает 7-битный адресное пространство с 16 зарезервированными адресами. То есть свободных адресов для подключения периферии на одну шину.

all-audio.pro: Коммуникации — I2c Slave vs CodeVisionAVR, Страница 1 из 2. all-audio.pro all-audio.pro

I2C Slave. Пример для AVR микроконтроллера Atmega

Re: пассики для проигрывателей винила Re: Динамическая индикация на LCD дисплее Re: Пассик на пленочный магнитофон Re: Продам набор SMD конденсаторов в корпусе Re: ШИМ-регулятор на Attiny13 PCF содержит 8-битный порт ввода-вывода общего назначения, чтение или запись данных осуществляется любым микроконтроллером или другим устройством по шине I2C. Расширитель имеет низкий потребляемый ток и выходы с регистром-защелкой с высокими характеристиками по току для прямой передачи сигнала на светодиоды и т. Также в устройстве есть линия прерывания INT , которая может быть подключена к логике прерывания микроконтроллера. Посылая сигнал прерывания по этой линии, дистанционный ввод — вывод сообщает микроконтроллеру о поступающих на его порты данных, без необходимости поддерживать связь через I2C -шину. Это значит, что PCF может оставаться простым «подчиненным» устройством.

PIC Урок 22. MSSP. I2C. Slave. Соединяем два микроконтроллера. Часть 1

I remembered a little hardcore in Hardwar with TWI interface, which takes a few years ago. Who would not say, and Assembler perfectly cleanses the brain and develops an understanding of the algorithms. The most important thing I learned while working with AVR microcontrollers on Assembler, is the fact that all the operations, all directives, all functions must be written in a clear sequence. After all, if the write data in the register is not in the sequence, then your controller firmware does not work.

Arduino for Production!

AVR I2C Slave

Хабр Geektimes Тостер Мой круг Фрилансим. Михаил Inkvizitor В общем вопрос в заголовке, но есть пара нюансов. А больше я толком ничего не нашёл не исключаю, что искал плохо. Находил несколько мануалов как поднять без библиотек все, но оно слишком мудрено и писалось в годах, а некропостить как-то неправильно.

i2c (slave) расширитель на ATMega

Войдите , пожалуйста. Хабр Geektimes Тостер Мой круг Фрилансим. Войти Регистрация. Датчики там разные, в том числе на шине I2C. И как годится, обычно вначале, сделал все на флагах ожидания. Но путь настоящего джедая иной, и было решено все повесить на прерывания. Вот тут и начался геморрой.

Решено: AVR I2C Slave Atmega AVR микроконтроллер Ответ.

Программа для контроллера I2C-шлюза (режим I2C-slave из терминалки ПК)

Avr i2c slave

Вернуться в Коммуникации. Сейчас этот форум просматривают: Google [Bot] и гости: 0. Аппаратный уровень, протоколы.

I2C прекращает передачу через 7 запросов в Arduino

Switch Case. Сообщества Promt Translation Server. Attiny не работает после преобразования ADC avr adc. С помощью беспроводных технологий программа AVR с bluetooth-устройством и может использоваться для данных communicationtoo?

Subscribe to comments with RSS.

Некоторые современные микроконтроллеры серии ATmega аппаратно поддерживают подключение к стандартной двухпроводной шине I2C , которая часто используется в приборах и бытовой технике. Atmel называет эту шину two-wire interface, сокращенно TWI. Изначально эта шина получила название I2C от фирмы Philips, но это название избегают использовать в документации Atmel из-за патентных проблем. Примечание: полное описание протокола I2C см. Все устройства на шине соединены друг с другом параллельно, используя драйверы с открытым стоком для формирования на шине логических уровней сигналов 0 и 1. По этой причине на шине обязательно присутствуют два верхних нагрузочных подтягивающих резистора pull-up, на рисунке это резисторы R PU , подключенные к плюсу питания VDD. Нагрузочные резисторы должны иметь достаточно малый номинал для используемой тактовой частоты, чтобы быстро заряжать емкость сигналов SDA и SCL и давать короткие фронты нарастания уровня лог.

Вернуться в Коммуникации. Сейчас этот форум просматривают: Google [Bot] и гости: 0. Аппаратный уровень, протоколы.


Общаемся с дисплеем SSD1306 по i2c / Хабр

Все любители электронных самоделок когда-нибудь приходят к желанию отобразить работу своей поделки самоделки на экране в виде текста или графики. Самый бюджетный способ сделать это — обратиться к алфавитно-цифровому дисплею типа LCD1602 или LCD2004, общение с которыми происходит либо по параллельному интерфейсу, либо через переходник-конвертор в I2C. Второй способ — использовать графический дисплей, их множество, например SSD1306 с размером матрицы 128×64 пикселя. Он есть в двух вариантах, с интерфейсом SPI или I2C. Я буду взаимодействовать с таким дисплеем через I2C интерфейс (он же TWI).

Рисунок 1.- графический LCD дисплей SSD1306 с матрицей 128×64 пикселя
  1. Сначала подаем команду старт

  2. Передаем адрес дисплея SLA+W

  3. Дальше идет m слов содержащих всевозможные настройки дисплея

  4. Передается признак того, что дальше пойдут графические данные (1 байт) и собственно данные n байт.

Передача каждого байта устанавливает статус ACK.

Рисунок 2.- формат пакета данных для дисплея

Инициализация модуля

Вот последовательность действий для инициализации графического дисплея

  1. Отправляем дисплей в SLEEP MODE (команда 0xAE SSD1306_DISPLAYOFF)

  2. Установка делителя частоты (команда 0xD5 SSD1306_SETDISPLAYCLOCKDIV) параметр 0x80

  3. Устанавливает отношение мультиплексирования (команда A8 SSD1306_SETMULTIPLEX) параметр 0x3F

  4. Устанавливаем смещение дисплея (команда 0xD3 SSD1306_SETDISPLAYOFFSET) параметр 0x00

  5. устанавливаем начальную линию (команда 0x40 SSD1306_SETSTARTLINE|0x00)

  6. разрешаем charge pump (команда 0x8d SSD1306_CHARGEPUMP) параметр 0x14

  7. устанавливаем горизонтальный режим памяти (команда 0x20 SSD1306_MEMORYMODE) параметр 0x00.

  8. устанавливаем remapping столбцов seg0←→seg127 (команда 0xA0 SSD1306_SEGREMAP | 0x00)

  9. устанавливаем направление сканирования строк (команда 0xС8 SSD1306_COMSCANDEC)

  10. Устанавливаем конфигурацию выводов COM-сигналов в соответствии с компоновкой оборудования OLED — панели (команда 0xDA SSD1306_SETCOMPINS) параметр 0x12

  11. Устанавливаем контраст (команда 0x81 SSD1306_SETCONTRAST) параметр 0xCF

  12. Установка предзаряда (команда 0xD9 SSD1306_SETPRECHARGE) параметр 0xF1

  13. Установка Vcomp deselect level (команда 0xDB SSD1306_SETVCOMDETECT) параметр 0x40

  14. Возобновление отображения содержимого оперативной памяти (команда 0xA4 SSD1306_DISPLAYALLON_RESUME)

  15. Отображение в нормальном виде команда 0xA6 SSD1306_NORMALDISPLAY

  16. Включение дисплея в нормальном режиме команда 0xAF SSD1306_DISPLAYON

Ниже на рисунке 3 приведена ассемблерная подпрограмма инициализации дисплея

Рисунок 3.- Подпрограмма инициализации дисплея

LCD_Command — это макрос следующего вида:

Рисунок 4.- Исходный код макроса отправки коммады в LCD

Этот макрос сделан для удобства использования подпрограммы _LCD_Command. Дело в том, что параметры передаются в нее через регистры tmp1 и tmp2 и запись LCD_Command par1, par2 более естественна, чем три строчки из макроса. Стоит заметить, что и макрос и вызов подпрограммы с передачей параметров занимают одинаковое число тактов процессора и объем ROM.

Что же представляет собой подпрограмма _LCD_Command мы посмотрим на рисунке 5.

Рисунок 5.- код подпрограммы _LCD_Command

Как видно, это подпрограмма посылает управляющее слово (см рисунок 2) по I2C. Подпрограмма использует 3 регистра tmp0tmp1 и tmp2. В двух последних передаются параметры для подпрограммы ControlByte и DataByte.

Подпрограммы i2c_starti2c_stopi2c_send рассмотрены в этой статье.

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

Очистка экрана (заливка определенным паттерном)

Что такое очистка экрана — это всего лишь заполнение видеопамяти символами определенного качества, в нашем случае это заполнение каждого сегмента страницы видеопамяти графического модуля нулями. Нижеприведенный код подпрограммы будет актуален только при использовании MEMORY_MODE = 0x00 или 0x01.

Рисунок 6.- исходный код подпрограммы очистки экрана

Мы передаем по I2C DATA байты в количестве 128×64 = 8192. Каждый переданный байт определяет тип очистки. Если передается 0 — экран очищается, если 0xFF— заливается цветом. Подпрограмма состоит из двух вложенных циклов по страницам памяти (8) и по количеству сегментов (128).

Для удобства использования подпрограмма также была завернута в макрос (рисунок 7)

Рисунок 7.- Макрос очистки экрана.

Позиционирование

Рассмотрим теперь позиционирование на экране. Несмотря на то, что у нас дисплей 128×64 пикселя, адресовать номер страницы памяти и номер столбца. Каждая страница памяти это 8 строк. Поэтому, если мы хотим зажечь, допустим, 15 пиксель в 10 строке, мы должны выбрать 1 страницу памяти, в ней выбрать 15 сегмент и по этому адресу записать 4 (бинарное 0000 0100).

Выбор номера страницы памяти осуществляется командами B0-B7, или B0 | y.

Чтобы установить номер столбца, стачала нужно записать в шину последнюю (младшую) шестнадцатиричную цифру числа, затем первую (старшую).

Таким образом, позиционирование выльется в посылке 3 посылки по шине TWI (рисунок 8)

Рисунок 8.- Макрос позиционирования

В этом макросе мы устанавливаем маркер текущего положения курсора в позицию (x,y), а также присваиваем соответствующие значения переменным LCD_X, LCD_Y.

Еще один неопределенный макрос SETMEM как раз и занимается сохранением данных в памяти.

Рисунок 9.- макрос сохранения числа в память SRAM

Decada

Автор: WildCat

IIC (I2C) — это сокращение от Inter-IC. I2C — разработка компании Philips, начатая в 80-х годах. В наши дни бытовая техника сделала резкий скачок в сторону усложнения схемотехники. В одном устройстве встречается множество микросхем. Как следствие — запутанная разводка и плотный монтаж печатных плат. Philips решила, что неплохо было бы использовать простую последовательную шину. Вместо широких параллельных шин можно было бы использовать всего два проводника. В такой шине один провод отвечает за данные, а второй — за тактовые импульсы, SDA и SCL соответственно.
I2C стандарт 1992 года использует семибитные адреса, что позволяет одновременное подключение до 128 ИС к одной шине.
Более подробно про этот протокол можно почитать в спецификации I2C.

Адресация в I2C

Число микросхем на одной шине ограничено 128, потому что каждому чипу соответствует 7-битный адрес. Сравните это, например, с домами на одной улице. Если у нескольких домов будет один и тот же номер, то почтальон придет в замешательство, не зная, куда бросить извещение о посылке с деталями.
Адреса задаются частично аппаратно в микросхеме, частично их можно задавать вручную путем подключения соответствующих выводов к питанию/земле. Это позволяет независимо подключать несколько одинаковых микросхем к одной шине.
Для примера рассмотрим известную PCF8574P. Это восьмибитный расширитель портов общего назначения. В нем аппаратно установлен адрес 0100 A2 A1 A0. Часть 0100 уже прошита в чипе, а часть A2 A1 A0 можно задать вручную. Мы можем сделать это, подключая соответствующие выводы к + питания или земле:

Вот тут микросхема слева имеет адрес 0100100, а справа — 0100000.

Стандарты I2C

Изначально стандарт I2C работал с тактовой частотой до 100кГц. В 1992 году был добавлен Быстрый режим с максимальной частотой 400кГц. Также в этом варианте была реализована 10-битная адресация. В 1998 году появился Высокоскоростной режим с максимальной скоростью 3,4 Мбит/с. (вероятно, Philips сочла Мбит/с более удобной величиной, чем килогерцы) Быстрый и высокоскоростной режимы одинаково хорошо работают с частотой и 100кГц.

Подробнее про стандарт

Philips обладает патентом на I2C. Это значит, что любая компания, желающая выпускать микросхемы с поддержкой I2C должна заплатить за это и подписать соглашение.
Большинство микроконтроллеров AVR обладают двухпроводным интерфейсом (угадайте, что это), по крайней мере, так сказано в документации. Это, конечно же, пресловутый I2C. Видимо, эта терминология используется из жадности и нежелания платить деньги Philips за то, чем все и так прекрасно пользуются.

Стандарт I2C предусматривает подтягивающие резисторы на SDA и SCL. Это одна из наиболее распространенных ошибок. Забудьте про подтягивание, и ваша схема будет безупречно не работать. Как правило, хватает резистора в 10кОм. Иногда, при достижении максимальной скорости обмена, можно импользовать более низкие значения. Проверьте даташиты микроконтроллера и вашей микросхемы.

Иногда можно встретить резисторы 100-330 Ом в линиях. Это делается для уменьшения взаимного влияния.
Длина шины I2C не ограничена. Единственное, что общая емкость линии с подключенными устройствами не должны превышать 400 пФ.

Устройство, начинающее передачу, называется Ведущим (Master, мастер), а устройство, к которому оно обращается, — Ведомым (соответственно, Slave, мазохист раб). Во всех наших примерах AT90S2313 выступает в роли ведущего устройства. Ведомое устройство молчит всегда, пока его не спросит ведущее. Тактовые импульсы на SCL тоже обеспечивает ведущее устройство. Мастер отвечает за временные интервалы в передаче. Если ведомое устройство должно вернуть какие-то значения мастеру, он также должен отвечать за все временные интервалы. I2C позволяет работу нескольких ведущих устройств на одной шине, однако во всех наших примерах только один «мастер» и один или несколько «рабов».

Что можно учинить с I2C?

Главное преимущество стандарта — это использование всего двух ног контроллера, что актуально для небольших МК. Конечно, за такое удобство придется платить — передача одного байта займет время передачи 8 бит + время начала/окончания передачи. Поэтому I2C безусловно медленнее параллельной шины. Однако, если вы не гонитесь за мегибитами, I2C — идеальный вариант.

Многие изготовители выпускают занятные микросхемы с I2C. Philips, как изобретатель, лидирует в этом деле. Иногда можно встретить целые модули с I2C интерфейсом (ТВ-тюнеры, дисплеи…).

Что же делать?

Вот что мы решили препарировать:
— Philips PCF8574
— TI PCF8574
— On-Semi JLC1562B
— Philips PCF8591
— Natsem LM76
— Philips graphics display LPH7653
— Linear Technology LT6904

PCF8574 — это восьмибитный расширитель портов общего назначения. Он добавляет 8 дополнительных пинов ввода/вывода. Используйте его для подключения светодиодов, реле или клавиш/клавиатуры. У него есть выход прерывания, на котором появляется низкий уровень после любого изменения состояния входов. После чтения состояния портов его уровень автоматически возвращается в высокий. Это очень удобный способ вызова прерывания при вводе. Контроллер тут же читает что изменилось и принимает решение.

Заметка: Philips выпускает две модификации чипа: PCF8574 и PCF8574A. Они отличаются только адресом!

PCF8574: 0100. A2 A1 A0
PCF8574A: 0111. A2 A1 A0

Изучите эти мелочи подробнее в даташите.
Если вам нужно больше портов ввода/вывода, используйте PCF8575 той же Philips. Это уже 16-битный расширитель портов.
Texas Instruments выпускает одноименные чипы, одинаковые по характеристикам (и корпусам).

On-Semi JLC1562B так же восьмибитный расширитель общего назначения, но у него есть кое-что еще: 6-битный ЦАП и компаратор на младших пяти разрядах. Однако у него нет выхода прерывания. Компаратор совместно с ЦАП и некоторым программным кодом может таинственно превращаться в 6-битный АЦП.

PCF8591 от Philips имеет один 8-битный ЦАП и четыре 8-битных АЦП. Аналоговые входы можно настроить как одиночные, так и на сложение и вычитание сигналов. Вот вам датаshit для ковыряния.

Компания National Semiconductor выпускает микросхему термометра LM76. Сами они заявляют, что назначение этих чипов — ‘оценка’ температуры, так что не надейтесь на космическую точность. В общем, подробнее в очередном связанном документе. В чипе находится температурный датчик и 12-битный АЦП (+ знаковый разряд).

LPH7653 от Philips — это маленький графический дисплей, вероятно, выдранный из старого телефона. Даташита на него никто никогда не видел, но говорят, что кто-то знает, как управлять им.

LT6904 от Linear Technology — волшебный чип-синтезатор частоты от 1 кГц до 64 МГц.

Конечно, этот список — всего лишь маленький пример того, что нам доступно для экспериментирования. На самом деле в природе существует гораздо больше хороших микросхем, ищите их на сайтах ведущих производителей по запросу I2C.

Стандартные команды чтения/записи

Команды чтения и записи I2C работают с одним байтом за раз. Стандартная процедура записи такая:


I2cstart
I2cwbyte ICaddress
I2cwbyte Bytetosend
I2cwbyte ...
I2cstop
I2cstart производит сброс линии и заставляет все устроства внимательно слушать. Затем отправляется адрес интересующей нас микросхемы. Она начинает обмен, в это время остальные молчат. Теперь по I2cwbyte отправляются один или несколько байтов. Прием каждого байта подтверждается микросхемой. Наконец, I2cstop освобождает линию.

Стандартная процедура чтения:


I2cstart
I2cwbyte ICaddress
I2crbyte Bytetoread, Ack
I2crbyte Bytetoread, Nack
I2cstop
Так же, как и в первом случае, I2cstart сбрасывает линию. Все устройства начинают слушать. Затем опять передается адрес интересующей микросхемы. Теперь по I2crbyte принимаются один или несколько байтов. После переменной, в которую происходит считываение, стоит ключевое слово Ack или Nack. Ack сообщает, что нужно считать еще байт, Nack — что этот принятый байт был последним. Об этом подробнее рассказано в документации Philips по I2C, о которой говорилось выше.

Ошибки I2C

В BASCOM зарезервирована переменная Err типа Bit. Если происходит ошибка I2C, в нее помещается 1. Правда никому не известно, что с ней делать. На самом деле, что? Обычно ошибки возникают из-за аппаратных проблем, поэтому вряд ли пользователь сможет что-то сделать.

Простая светодиодная мигалка

Давайте забацаем простую мигалку, используя PCF8574. Соберите на макетной плате схедующую несложную схему:

Затем наберите такую программу:


$regfile = "2313def.dat"
$crystal = 4000000

Config Sda = Portd.5
Config Scl = Portd.4
Config I2cdelay = 10

Config Pind.6 = Output

Const Pcf8574write = &h50
Const Pcf8574read = &h51

Set Portd.6
Waitms 1000
Reset Portd.6
Waitms 1000

Do
  Set Portd.6
  I2cstart
  I2cwbyte Pcf8574write
  I2cwbyte 255
  I2cstop
  Waitms 500
  Reset Portd.6
  I2cstart
  I2cwbyte Pcf8574write
  I2cwbyte 0
  I2cstop
  Waitms 500
Loop

End
Две ножки порта D зарезервированы под I2C. I2Cdelay задает скорость шины в 200кГц. Pind.6 настроен на выход, к нему подключен светодиод.

Скомпилируйте код и загрузите в чип. Теперь светодиоды моргают как на контроллере, так и на расширителе портов. Но заметьте, что мигают они в противофазе, это потому диод на расширителе подключен катодом к выходу. Когда на выходе 1, то диод с обеих сторон видит напряжение питание, и гореть он не может. Когда на выходе 0, то ток течет через светодиод в лапку расширителя, и диод светится.

Если вы хотите использовать выводы PCF8574 на вход, вам нужно установить на них высокий уровень, записав 1. Затем, используя кнопку, дергать их на землю (и читать с них 0) или не дергать (и соответственно, читать 1). Но это мы рассмотрим позже.

Скорость I2C

Bascom использует стандартную частоту обмена для I2C в 200 кГц. С помощью параметра I2CDelay можно задать и другую.


Config I2Cdelay = 10
Этот код задаст частоту в 100 кГц. Используйте 5 для 200 кГц (по умолчанию). Соответственно, 2 задаст частоту в 500 кГц, а 1 в 1 МГц. Используйте значения 10 или более для низкоскоростных приложений. Иногда при использовании длинных проводов (большая емкость!) нужно понизить скорость обмена, чтобы избежать ошибок.
С другой стороны, большинство микросхем с I2C могут работать на гораздо больших скоростях, чем указано в даташите. Но нет гарантии, что они будут работать в таком режиме при любых условиях, так что несколько раз проверьте работу устройства.

Использование I2cinit

Лапки AVR, используемые с I2C, конфигурируются словами Config SDA/SCL. После подачи питания на контроллер, на них установится логический ноль. Но после команды Portx или после изменения направления input/output, на них могут оказаться непредсказуемые уровни. Поэтому нужно написать:


I2cinit
чтобы насильно установить на них низкий уровень перед началом или продолжением I2C обмена.

Считываем состояние выключателя через PCF8574

Соберем следующую схему:

И зальем в наш контроллер следующую программу:
i2c-pcf8574-switch.bas


$regfile = "2313def.dat"
$crystal = 4000000

Config Sda = Portd.5
Config Scl = Portd.4
Config I2cdelay = 10

Config Pind.6 = Output

Const Pcf8574write = &h50
Const Pcf8574read = &h51

Const Shortwait = 50
Const Longwait = 250

Const Switchbit = 0

Dim Ledwait As Byte
Dim Pcf8574port As Byte

'Поместим на все ножки PCF8574 единицу и будем проверять
I2cstart
I2cwbyte Pcf8574write
I2cwbyte 255
I2cstop

Do
  'Read Pcf8574 port
  I2cstart
  I2cwbyte Pcf8574read
  I2crbyte Pcf8574port , Nack
  I2cstop
  'Determine state of Switchbit bit
  If Pcf8574port.switchbit = 1 Then
    Ledwait = Shortwait
  Else
    Ledwait = Longwait
  End If

  Set Portd.6
  Waitms Ledwait
  Reset Portd.6
  Waitms Ledwait
Loop

End
Константы определяют длинную и короткую продолжительности вспышки светодиода.
Константа SwitchBit определяет состояние выключателя на Pin 0 (bit 0) PCF8574.
Две переменные типа Byte задают продолжительность вспышки светодиода и состояние порта PCF8574.
Программа начинается с установки всех ножек порта PCF8574 в высокий уровень, так что их можно использовать как входы.
В цикле Do Loop состояние порта PCF8574 определяется так: сначала отсылается I2cstart, затем PCF8574 читает адрес, а затем I2crbyte используется для получения текущего значения порта PCF8574. I2cstop прекращает обмен.

Скомпилируйте программу и отправьте в контроллер. Проследите за её работой — теперь, когда выключатель разомкнут, светодиод моргает часто, если замкнут — редко.

Использование прерываний PCF8574

Программа, описанная выше, достаточно глупая. Время опроса выключателя зависит от состояния переменной Ledwait (пока отрабатывается задержка, контроллер больше ничего не делает). Это плохой пример программирования. Но мы с вами умные и воспользуемся прерываниями от PCF8574. Если вы еще не знаете, что это такое, то срочно прочитайте статью о прерываниях перед тем, как мы продолжим.
Как было сказано ранее, PCF8574 будет генерировать сигнал прерывания (низкий уровень) каждый раз, когда поменяется состояние на его входах.
Соберем такую схему:

И запишем такую программу:
i2c-pcf8574-switch-int.bas


$regfile = "2313def.dat"
$crystal = 4000000

Config Sda = Portd.5
Config Scl = Portd.4
Config I2cdelay = 10

Config Pind.6 = Output
Config Pind.2 = Input
Config Int0 = Falling

Const Pcf8574write = &h50
Const Pcf8574read = &h51

Const Shortwait = 50
Const Longwait = 250

Const Switchbit = 0

Dim Ledwait As Byte
Dim Pcf8574port As Byte

Ledwait = Shortwait

On Int0 Pcfint

Enable Interrupts
Enable Int0

I2cstart
I2cwbyte Pcf8574write
I2cwbyte 255
I2cstop

Do
  Set Portd.6
  Waitms Ledwait
  Reset Portd.6
  Waitms Ledwait
Loop

'PCF8574 interrupt routine
Pcfint:
  'debounce wait time
  Waitms 10
  'read the input pins
  I2cstart
  I2cwbyte Pcf8574read
  I2crbyte Pcf8574port , Nack
  I2cstop
   'Determine state of Switchbit bit
  If Pcf8574port.switchbit = 1 Then
    Ledwait = Shortwait
  Else
    Ledwait = Longwait
  End If
  Gifr = 64
Return
End
Теперь у нас в конфигурации появилась новая строка: Config Int0 = Falling. Это означает, что только спады сигнала на входе Int0 будут вызывать прерывание программы
Также, Int0 на Portd.2 у нас настроен как вход.
В переменную Ledwait изначально кладется значение константы Shortwait.
Когда произойдет прерывание, программа перейдет на метку Pcfint.
Прерывания включены глобально, отдельно включено прерывание Int0.
Программа будет зацикленно моргать светодиодом, пока не случится прерывание. В подпрограмме обработки первым делом выполняется задержка 10 мс, чтобы исключить ложные срабатывания от дребезга контактов. После этого считывается состояние порта PCF8574, а точнее одного бита, помеченного как Switchbit. Если полученное значение — 1, то то переменную Ledwait приравниваем к Shortwait, иначе к Longwait.

Компилируем программу, загружаем в чип. Наблюдаем, что светодиод мигает часто. Замыкаем выключатель и видим, что он стал мигать медленнно. Вместо выключателя можно использовать кнопку.

Обработка данных с оптического энкодера через PCF8574

AVR можно научить читать значения напрямую с энкодера, об этом есть отдельная одноименная глава под номером 18. Но может случиться так, что вам будет не хватать свободных пинов. Тогда на помощь к нам приходит все тот же расширитель PCF8574.
Рассмотрим (значит, соберем на макетной плате!) схему:

И откроем в BASCOM следующую программу:
i2c-pcf8574-int-encoder.bas


$regfile = "2313def.dat"
$crystal = 4000000

Config Sda = Portd.5
Config Scl = Portd.4
'default I2C speed
Config I2cdelay = 5
Config Pind.6 = Output     'Тут будет светодиод
Config Pind.2 = Input      'Прерывание от PCF8574 на вход Int0
Config Int0 = Falling
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcdmode = Port

Const Pcf8574write = &h50
Const Pcf8574read = &h51
Const Optencmask = &B00000011   'Энкодер AB подключен к младшим двум битам
Const Optencbmask = &B000000001 'Удерживаем B-бит

Dim Pcf8574input As Byte
Dim Encoderval As Byte
Dim Encounter As Integer
Dim Oldbval As Byte

Encounter = 0
Oldbval = 0
Cls
Lcd "encounter:"

On Int0 Pcfint

'Настроим расширитель на вход
I2cstart
I2cwbyte Pcf8574write
I2cwbyte Optencmask
I2cstop

Enable Interrupts
Enable Int0


'Сообщим положение энкодера
'Следим за светодиодом на Portd.6 : Если он постоянно включен или выключен,
'то вероятно, срабатывает слишком много  прерываний
Do
  Set Portd.6
  Waitms 5
  Locate 1 , 12
  Lcd Encounter ; "      "
  Reset Portd.6
  Waitms 5
Loop

Pcfint:
  'read the input pins
  I2cstart
  I2cwbyte Pcf8574read
  I2crbyte Pcf8574input , Nack
  I2cstop
  Encoderval = Pcf8574input And Optencmask
  If Oldbval = 1 Then
    Encoderval = Encoderval + 4
  End If
  If Encoderval < 2 Then
    Decr Encounter
  Elseif Encoderval > 5 Then
    Decr Encounter
  Else
    Incr Encounter
  End If
  Oldbval = Pcf8574input And Optencbmask
Return

End
Config Lcdpin используется для задания портов для работы с ЖКИ (в данном случае они совпадают со значениями по умолчанию).
Optencmask используется для установки двух младших битов на энкодере. Optencbmask используется для задания только бита «B».
В основном цикле светодиод на Portd.6 мигает, а на экран выводится положение энкодера. В подпрограмме прерывания считывается байт с I2C порта, из него извлекаются состояния битов на энкодере и определяется его положение, которое обновляется.

Опять же, компилируем и загружаем прошивку в чип. Крутим ручку энкодера и видим, как меняется значение положения на ЖКИ. Если вам достался энкодер с высоким разрешением, вы можете заметить, как светодиод буде включен в течение всего времени, пока вы врашаете ручку. Число генерируемых прерываний настолько велико, что программе не остается времени для возврата в основной цикл. Очень вероятно, что некоторые прерывания будут пропушены, и отображаемое значение не будет меняться так часто, как вам хотелось бы. Вы можете улучшить программу, изменив значение I2cdelay на более низкое, тем самым получив меньшую задержку отклика. Но будьте осторожны при подключении нескольких устройств к одной шине.

Использование ON Semi JLC1562B вместо PCF8574

У JLC1562B нет выхода прерываний, однако есть 6-битный ЦАП, напряжение на нем можно изменять в 64 уровнях, от 0 до 4 вольт, с шагом 0,0625. На входах JLC1562B есть компаратор. На младших 5 битах можно установить порог компаратора («B») как на половину питающего напряжения, так и на выход ЦАП. Старшие три бита компаратора («A») всегда настоены на порог в половину питающего напряжения.
По сравнению с PCF8574, в JLC1562B DAC имеет другие режимы чтения и записи. Это нужно знать, чтобы использовать его вместо PCF8574, а также грамотно настроить ЦАП и управлять порогом компаратора. Если используется JLC1562B, как замена PCF8574, последовательность работы с I2C не изменится.
Если вы хотите настроить ЦАП:

— Отправьте JLC1562B адрес записи
— Отправьте байт состояния входов/выходов
— Отправьте 6-битное значение ЦАП (0-63) в младшие 6 бит
— В двух старших битах шестой задает порог компаратора: 0 задает порог в половину питающего напряжения,
1 задает порог значением выхода АЦП, 7 бит управляет «защелкой»,
0 защелкивает данные после команды чтения,
1 защелкивает данные, когда компаратор B переключается из 0 в 1

Чтобы использовать ЦАП, соберите следующую схему:

И наберите следующую программу:
i2c-jlc1562b-dac.bas


$regfile = "2313def.dat"
$crystal = 4000000

Config Sda = Portd.5
Config Scl = Portd.4
Config I2cdelay = 10
Config Pind.6 = Output

Const Jcl1562bwrite = &H70

Dim Dacval As Byte

Do
  Set Portd.6
  For Dacval = 0 To 63
    I2cstart
    I2cwbyte Jcl1562bwrite
    I2cwbyte 0
    I2cwbyte Dacval
    I2cstop
  Next Dacval
  Reset Portd.6
Loop

End
Адрес для записи в JLC1562B установлен в 70 (в шестнадцатеричной системе). Сверяйтесь с даташитом!
В цикле Do Loop включается светодиод, а в JLC1562B записывается 0 в первый байт, а во второй пишется значение счетчика от 0 до 63 для ЦАП. В этом втором байте старшие биты (порог компаратора и защелкивание) остаются равными 0.

Ловкими и отточенными движениями отправляем скомпилированную прошивку в контроллер. Наблюдаем на выходе ЦАП (13 нога) пилообразный сигнал:

JLC1562B в роли 6-битного АЦП

Вы можете настроить компаратор JLC1562 так, чтобы он использовал в качестве источника опорного напряжения выход ЦАП. Если мы установим выход ЦАП, скажем, в 2 вольта и приложим чуть меньшее напряжение к ногам D0..D4, то считанное значение будет равно 0. Если чуть поднять напряжение, то считываться будет уже 1. Так что любой из выводов D0..D4 можно заставить исполнять функции «сыроватого» 6-битного АЦП, если изменять напряжение на ЦАП за 64 шага и считывать значение компаратора после каждого шага.
Соберём следующую схему:

И, как обычно, наберем программу:
i2c-jlc1562b-adc.bas


$regfile = "2313def.dat"
$crystal = 4000000

Config Sda = Portd.5
Config Scl = Portd.4
Config I2cdelay = 10
Config Pind.6 = Output

Const Jcl1562bwrite = &H70
Const Jcl1562bread = &H71
'mask out all but the lower six dac bits
Const Jcl1562bcompon = &B11000000
'make this pin high to use it as input
Const Jclmask = &B00000001

Dim Dacval As Byte
Dim Dacwrite As Byte
Dim Jclinput As Byte

Cls
Do
  Reset Portd.6
  For Dacval = 0 To 63 Step 1
    Dacwrite = Dacval Or Jcl1562bcompon
    I2cstart
    I2cwbyte Jcl1562bwrite
    I2cwbyte Jclmask
    I2cwbyte Dacwrite
    I2cstop
    I2cstart
    I2cwbyte Jcl1562bread
    I2crbyte Jclinput , Nack
    I2cstop
    Jclinput = Jclinput And Jclmask
    If Jclinput = Jclmask Then
      Exit For
    End If
  Next Dacval
  Locate 1 , 1
  Lcd Dacval ; "    "
Loop

End
В данном примере производится операция ИЛИ: Dacwrite = Dacval Or Jcl1562bcompon, так что оба бита — бит выбора источника опорного напряжения для компаратора B и бит защелки — устанавливаются в 1.
Jlcmask используется, чтобы установить бит 0 на порту JLC1562B в единицу, чтобы он работал как вход.
В цикле Do Loop включается светодиод, в течение следующих шагов значение Dacval возрастает от 0 до своего максимума 63 (0..63 * 0.0625 = приблизительно 4 вольта). После каждого увеличения считывается значение компаратора. Если при этом оно изменилось (стало 1), считается что компаратор сработал. Тогда цикл прерывается, а значение Dacval выводится на ЖКИ.

АЦП/ЦАП Philips PCF8591

PCF8591 имеет на борту один 8-битный ЦАП и четыре 8-битных АЦП. Чтобы они заработали, вывод EXT нужно подключить к земле. Тогда на выводе OSC появится нечто, похожее на тактовые импульсы 1 МГц:

Вы можете также использовать внешний тактовый генератор (0.75 — 1.25 МГц), подключив его к выводу OSC. Тогда вывод чипа EXT нужно подключить к плюсу питания.

PCF8591 управляется тремя незамысловатыми байтами:
— байт адреса
— байт команды
— байт значения ЦАП
Байт управление выглядит следующим образом:

7 6 5 4 3 2 1 0 (позиция бита)
0 a p p 0 i c c (управляющие биты)

Где:
a = 1 для включения аналогового выхода (но также нужно включить, если планируется использование АЦП)
pp = конфигурация АЦП, нужно выставить 00 для 4 независимых входов A0, A1, A2, A3. Другие значения изучите в даташите самостоятельно!
i = 1 для включения автоувеличения каналов АЦП. Увеличивает значение сс после каждого чтения.
cc = номер канала АЦП, 0, 1, 2 или 3.

Соберём следующую схему:

Для проверки ЦАП введём следующую программу:
i2c-pcf8591-dac-triangle.bas


$regfile = "2313def.dat"
$crystal = 4000000

Config Sda = Portd.5
Config Scl = Portd.4
Config I2cdelay = 10

Config Pind.6 = Output

Const Pcf8591write = &H90
Const Pcf8591read = &H91

Const Pcf8591dacconfig = &B01000000
'                           |
'                           -------- включаем аналоговый выход
'                                    (также нужно и для АЦП)
Dim Dacout As Byte

Set Portd.6
Waitms 1000
Reset Portd.6
Waitms 1000

Do

  Set Portd.6
  For Dacout = 1 To 255 Step 1
    I2cstart
    I2cwbyte Pcf8591write
    I2cwbyte Pcf8591dacconfig
    I2cwbyte Dacout
    I2cstop
  Next Dacout
  Reset Portd.6
  For Dacout = 255 To 1 Step -1
    I2cstart
    I2cwbyte Pcf8591write
    I2cwbyte Pcf8591dacconfig
    I2cwbyte Dacout
    I2cstop
  Next Dacout

Loop

End
В константе Pcf8591dacconfig установлен 6 бит, включающий аналоговый выход.
В цикле Do Loop, For Next цикл меняет значение Dacout от 1 до 255 и отсылает Dacout как третий управляющий байт.
Затем For Next цикл меняет значение Dacout в обратном порядке, от 255 до 1.

На выводе 15 (Aout) можно наблюдать треугольный сигнал:

Изменение Config I2cdelay с 10 до 1 ускоряет процесс:

Конечно, все эти наши приколы ограничены частотой в 100 КГц, это максимальная частота, поддерживаемая PCF8591.
Но тем не менее, программу можно переделать, чтобы получать более высокие частоты:
i2c-pcf8591-triangle-faster.bas


$regfile = "2313def.dat"
$crystal = 4000000

Config Sda = Portd.5
Config Scl = Portd.4
Config I2cdelay = 10

Config Pind.6 = Output

Const Pcf8591write = &H90
Const Pcf8591read = &H91

Const Pcf8591dacconfig = &B01000000

Dim Dacout As Byte

Set Portd.6
Waitms 1000
Reset Portd.6
Waitms 1000

I2cstart
I2cwbyte Pcf8591write
I2cwbyte Pcf8591dacconfig

Do

  For Dacout = 1 To 255 Step 1
    I2cwbyte Dacout
  Next Dacout
  For Dacout = 255 To 1 Step -1
    I2cwbyte Dacout
  Next Dacout

Loop

End
Теперь первые два управляющий байта отсылаются перед циклом Do Loop.
В самом цикле лишь происходит запись значения Dacout в чип PCF8591.

Обратите внимание: в этой программе нет команды I2cstop! В реальной же программе такой поворот событий маловероятен, потому что наверняка будут происходить какие то другие процессы с шиной I2C.

Посмотрим на выходной сигнал теперь:

Но мы опять ускорим программу, заменив, как и обешано, I2cdelay на 1:

И по идее можно добиться ещё большего ускорения, установив в схему кварц на 10 МГц, благополучно не сказав об этом Bascom. Тогда результат будет таким:

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

Температурный сенсор National Semiconductor LM76

LM76 — это одна из кучи микросхем для измерения температуры, с I2C интерфейсом. У большинства крупных производителей такой чип непременно есть в «портфолио». LM76 не предполагает высокой точности, и поэтому позорно называется «оценщик температуры». На самом деле она дает точность измерений около одного градуса Цельсия. В общем, почитайте даташит на досуге.
В этом чипе 6 регистров. Регистр, из которого нужно читать температуру, выбирается по умолчанию после включения питания. Подробнее об этих регистрах я расскажу позже. LM76 меряет и запоминает температуру с точностью 0.0625oC. Температура хранится как 16-битное слово, считывается как два байта:

D0-D2 не определены. D15 — бит знака, само значение температуры лежит в D3-D14. Температура хранится в обычном двоичном представлении. Это значит, что положительные числа хранятся как есть, с битом знака равным 0. Отрицательные числа хранят 1 в бите знака, сам модуль числа записан в инвертированном виде и увеличен на 1. Если вы предполагаете использовать датчик для измерения только плюсовых температур, забудьте про эти махинации со знаками и просто считывайте биты D3-D14. Однако если вы из мест не столь отдаленных, вас наверняка заинтересует метод считывания отрицательных значений. Для этого я приготовил вам следующий код:


...
Dim Tempint as Word
Dim Tempbytelo as Byte
Dim Tempbytehi as Byte
...
'считаем два байта из lm76. Это просто, как два байта переслать =)
...
Tempint = Makeint(Tempbytelo, Tempbytehi)
Tempsign = Tempbytehi And &B1000000
If Tempsign = &B10000000 Then
  Tempint = Not Tempint
  Tempint = Tempint + 1
End If
Shift Tempint, Right, 3
...
Makeint объединяет принятые два байта в одно 16-битное слово и кладет в переменную Tempint. Затем, путем откусывания самого старшего (левого) бита, извлекается знак числа. Если бит равен 1, нам нужно инвертировать все биты в Tempint (убрав тем самым бит знака) и увеличить результат на 1. Наконец, все биты в Tempint нужно сдвинуть вправо на 3 разряда, убрав тем самым бесполезные биты D0-D2. Теперь в Tempint хранится модуль температуры с точностью 0.0625oC, а в Tempsign лежит знак температуры. Все проще некуда.
Посему соберем следующую интересную схему:

И введём следующую интересную программу:
i2c-lm76.bas


$regfile = "2313def.dat"
$crystal = 4000000

Config Sda = Portd.5
Config Scl = Portd.4
Config I2cdelay = 100
Config Pind.6 = Output

Const Lm76write = &H90
Const Lm76read = &H91

Dim Tempint As Integer At $80
Dim Tempbytelo As Byte At $80 Overlay
Dim Tempbytehi As Byte At $81 Overlay
Dim Templong As Long

Cls

Do
  Set Portd.6
  I2cstart
  I2cwbyte Lm76write
  'указатель на регистр температуры.
  'хоть и установлен по умолчанию, он здесь просто для примера.
  I2cwbyte 0
  I2cstart
  I2cwbyte Lm76read
  I2crbyte Tempbytehi , Ack
  I2crbyte Tempbytelo , Nack
  I2cstop
  Cls
  Lcd Tempbytehi ; " " ; Tempbytelo
  Lowerline
  Shift Tempint , Right , 3
  Templong = Tempint * 65
  Lcd Tempint ; " " ; Templong
  Reset Portd.0.6
  Wait 1
Loop

End
В этом примере игнорируется знак температуры. Поэтому нужно привести еще один, более продвинутый пример, который будет показывать нам температуру сразу в градусах Цельсия:
i2c-lm76-fusing.bas

$regfile = "2313def.dat"
$crystal = 4000000

Config Sda = Portd.5
Config Scl = Portd.4
Config I2cdelay = 100
Config Pind.6 = Output

Const Lm76write = &H90
Const Lm76read = &H91
Const Lm76resolution = 0.0625

Dim Tempint As Word
Dim Tempbytelo As Byte
Dim Tempbytehi As Byte
Dim Temperature As Single
Dim Tempstring As String * 4
Dim Tempsign As Byte
Dim Flashnumber As Byte
Dim Flashloop As Byte
Dim Flashtime As Word

Do
  Set Portd.6
  Wait 1
  Cls
  I2cstart
  I2cwbyte Lm76read
  I2crbyte Tempbytehi , Ack
  I2crbyte Tempbytelo , Nack
  I2cstop
  Lcd Tempbytehi ; " " ; Tempbytelo ; " "
  Tempint = Makeint(tempbytelo , Tempbytehi)
  Tempsign = Tempbytehi And 128
  If Tempsign = 128 Then
    Tempint = Not Tempint
    Tempint = Tempint + 1
   End If
  Shift Tempint , Right , 3
  Lcd Tempint ; " "
  Temperature = Tempint * Lm76resolution
  Lowerline
  Lcd Temperature ; " "
  Tempstring = Fusing(temperature , "##.#")
  If Tempsign = 128 Then Lcd "-"
  Lcd Tempstring
  Reset Portd.6
  Wait 1
Loop

End
Эта программа использует операции с плавающей точкой. Для этого подгружаются специальные библиотеки. Хоть программа и очень маленькая, она займет 99% памяти в вашем AT90S2313 (а в ATTINY2313 даже не влезет)!
При работе с маленькими контроллерами следует избегать операций с плавающими точками, где это возможно. Следующая программа покажет, как сделать это, используя переменные типа Integer. Она также будет работать намного быстрее:
i2c-lm76-usingintegers.bas

$regfile = "2313def.dat"
$crystal = 4000000

Config Sda = Portd.5
Config Scl = Portd.4
Config I2cdelay = 100
Config Pind.6 = Output

Const Lm76write = &H90
Const Lm76read = &H91
Const Lm76resolution = 625

Dim Tempint As Word
Dim Tempbytelo As Byte
Dim Tempbytehi As Byte
Dim Tempall As Long
Dim Temprem As Long
Dim Temptemp As Long
Dim Tempdeg As Long
Dim Tempsign As Byte
Dim Tempdigit As Integer

Do
  Cls
  Set Portd.6
  I2cstart
  I2cwbyte Lm76read
  I2crbyte Tempbytehi , Ack
  I2crbyte Tempbytelo , Nack
  I2cstop
  Lcd Tempbytehi ; Tempbytelo ; " "
  Tempint = Makeint(tempbytelo , Tempbytehi)
  Tempsign = Tempbytehi And 128
  If Tempsign = 128 Then
    Tempint = Not Tempint
    Tempint = Tempint + 1
   End If
  Shift Tempint , Right , 3
  Lcd Tempint ; " "
  Tempall = Tempint * Lm76resolution
  Lcd Tempall ; " "
  Tempdeg = Tempall / 10000
  Temptemp = Tempdeg * 10000
  Temprem = Tempall - Temptemp
  Lowerline
  Lcd Tempdeg ; " " ; Temprem ; " "

  Tempdigit = Temprem / 1000
  Temptemp = Tempdigit * 1000
  Temprem = Temprem - Temptemp

  If Temprem > 499 Then Tempdigit = Tempdigit + 1
  If Tempdigit > 9 Then
    Tempdigit = 0
    Tempdeg = Tempdeg + 1
  End If

  If Tempsign = 128 Then Lcd "-"
  Lcd Tempdeg ; "." ; Tempdigit

Loop

End
В этой программе больше строк, но, как ни странно, она занимает всего 85% в памяти контроллера, оставляя место для некоторых других функций.

Управление графическим дисплеем Philips LPH7653

Дисплей Philips LPH7653 вероятно был разработан для мобильных телефонов ранних поколений. Он имеет разрешение 97×35 пикселей.
Информацию по нему можно найти тут.
Прочитайте это описание (хоть оно и на английском, просто посмотрите картинки)! Наверняка вам придется подбирать напряжения питания и регулировки контрастности, чтобы суметь что-то прочитать на нем. Светодиодную подсветку можно питать стандартным напряжением +5 вольт.

LP7653 — чисто графический дисплей. Он не имеет знакогенератора, это значит, что вам придется самим рисовать символы, если вы хотите выводить текст. Но это не так сложно, как может показаться.
Дисплей имеет ширину в 97 пикселей, однако судя по всему, видеопамять у него рассчитана на 101 пиксель. Каждая строка из 8 пикселей имеет индивидуальную адресацию:

В программном плане это выглядит так:


I2cstart
I2cwbyte lph7653writeaddress '(7Ahex)
I2cwbyte linenumber          '(60, 61, 62, 63 or 64hex для строк 0, 1, 2, 3 и 4)
I2cwbyte pixelcolumn         '(00...60hex для столбцов 0...97)
I2cwbyte pixelbyte           '(младший бит - сверху)
I2cwbyte pixelbyte           '(pixelcolumn/linenumber идёт pixelcolumn 64hex)
I2cwbyte ...
I2cstop
Для очистки экрана вы можете записать 5×101 нулевых байтов начиная с первой строки и первого столбца. Если вы планируете использовать дисплей только для вывода текста, разумно было бы использовать его как четырёхстрочный. Тогда вы можете использовать символы высотой в 8 пикселей. Вы можете выводить стандартные символы 7×5 как символы 7×6. Таким образом, нижний ряд пикселей будет пустым, создавая отступ между строками текста. Пятая строка доступна для вывода, но отображаться будут только верхние три ряда пикселей (35 — (4 x 8)).
Для проверки соберём следующую схему:

И введём следующую программу:
i2c-lph7653-75.bas для символов 7×5
или i2c-lph7653-75prop.bas для символов 7×6
(листинги здесь не приводятся, так как там много скучных и неинтересных строк)

Программа i2c-lph7653-76prop.bas использует символы 7×6, поэтому каждая строка Data хранит 6 байтов.

Если вы хотите использовать дисплей для вывода графики, вам нужно представить изображение в виде 8-битных столбцов пикселей. Это немного отличается от метода вывода на дисплей Toshiba T6963, для которого в Bascom есть утилита конвертирования изображений.
Если вы просто хотите «слить» изображение на дисплей, лучше всего привести его к разрешению 101×35 и выводить видимую часть 97×32 начиная с левого верхнего края. Конечно, вы можете выводить и меньшие изображения, но тогда внимательно следите за тем, как меняется адресация.
Для преобразования изображений в блок данных есть небольшая утилита на Delphi. Она считывает черно-белое изображение BMP и выводит в виде текста, который вы можете скопировать и вставить в программу. Исходные коды прилагаются!
Вот вам пример работы:

Загружаем первый битмап в утилиту и видим следующее:

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

Управление синтезатором частоты Linear Technology LT6904

LT6904 — это чип от Linear Technology, выполняющий функцию синтезатора частоты. Его собрат LT6903 имеет SPI интерфейс, но LT6904 использует I2C. Еще есть чипы LT1799, LT6900, LT6902 и LT6905, в которых частота задается внешним переменным резистором.
LT6904 управляется следующим путем (согласно даташиту):

где OCT — четырёхбитное и DAC — десятибитные слова. Также еще два бита применяются для конфигурирования выходов. Убедитесь, что вы отключили неиспользуемый выход (читайте даташит!) В итоге мы отсылаем 16 бит в таком порядке:
Oct3, Oct2, Oct1, Oct0, DAC9, DAC8…DAC0, Cfg1, Cfg0.
Соберём такую схему:

Обратите внимание, даташит утверждает, что напряжение питание может быть от 2.7 до 5.5 вольт. Однако была замечена неприятная вещь — при питании 5 вольт, выход сигнала LT6904 «пропадает». Такая особенность поведения пропала после понижения питания до 3.3 вольта.
Загрузим для самостоятельного изучения следующую программу:
i2c-lt6904.bas Автор оригинала не предоставил код. Пусть это будет на его совести!

У нас возникает небольшая проблема: Bascom говорит, что программа займет 162% программной памяти. Очевидно, что эта программа жирновата для AT90S2313. Пора обратиться к более мощным контроллерам. Об этом будет рассказано в следующих главах.

 

101 применение шлюза UART-to-I2C/SPI/1W (RH-0004). Часть 10. USB-программатор для последовательного программирования микроконтроллеров AVR на базе шлюза UART-to-I2C/SPI/1W

У большинства микроконтроллеров AVR имеется возможность заливать прошивку через последовательный интерфейс SPI. А раз так, — значит для этих целей вполне можно использовать шлюз RH-0004, нужно только написать соответствующее ПО. Именно этим я занимался весь последний месяц и сегодня, наконец, могу выложить на сайт программу, превращающую шлюз, помимо всего прочего, ещё и в USB-программатор микроконтроллеров AVR.

Параметры используемого для последовательного программирования SPI-интерфейса довольно подробно описаны в даташитах, я тезисно напомню только основные моменты:

  • используется SPI Mode0
  • размер пакетов SPI 4 байта (для некоторых AT89… — 3 байта)
  • данные передаются старшим битом вперёд
  • сигнал SS (slave select) передаётся через ногу RESET

Аппаратная часть программатора, как обычно, состоит из, собственно, UART-to-I2C/SPI/1W шлюза и USB-to-UART преобразователя:

Джампер выбора питания должен быть установлен в положение +5 Вольт.

Ниже показано главное окно программы:

В самом верху программы располагается строка меню. Через меню можно загрузить или сохранить в файл данные flash- или EEPROM-памяти (в форматах bin, hex или eep), сохранить в файл данные лога (в формате txt) или выбрать чип для работы. Кроме того, через пункт меню Edit->Lock & Fuses… открывается форма для чтения / записи Lock- и Fuse-битов микроконтроллера.

Под строкой меню, слева располагается выпадающий список для выбора com-порта и кнопки для подключения к выбранному порту или отключения от него (при подключении к ПК наш программатор будет определяться в системе как виртуальный com-порт).

Чуть правее располагается кнопка Autosearch Chip, при нажатии на которую программатор попытается автоматически определить подключенный к нему чип, прочитав байты сигнатуры. Стоит учесть, что процедура автоматического определения чипа не всегда возможна, поскольку некоторые контроллеры в залоченном состоянии байты сигнатуры не выдают. Для работы с такими контроллерами придётся выбрать их через верхнее меню.

Правее кнопки автоматического определения чипа расположены текстовые поля, содержащие название (Chip name) и байты сигнатуры (ID bytes) выбранного чипа.

Чуть ниже расположен трек-бар Delays value, предназначенный для выбора величины используемых в программе задержек. Дело в том, что нельзя передавать в шлюз новые команды, не дождавшись выполнения старых. Время, необходимое микроконтроллеру на выполнение различных команд и операций программирования (запись / чтение / стирание…), прописано в даташитах. Для обеспечения достаточного времени выполнения операций в программе используются задержки между передачами различных команд. Чаще всего менять значение по-умолчанию не требуется, но в случае возникновения сбоев можно попробовать увеличить величину задержек.

Ещё ниже располагаются основные функциональные кнопки для работы с контроллером, позволяющие читать (Read Program / Read Data), записывать (Write Program / Write Data) или проверять (Verify Program / Verify Data) данные программы или памяти EEPROM (при проверке данные в программе сравниваются с данными в чипе, при обнаружении различий адрес первого несоответствия выводится в лог). Кнопка Read Calibration позволяет прочитать записанные в чипе байты калибровки (результат выводится в лог), а кнопка Chip Erase стереть записанные во flash и EEPROM данные (при этом также происходит сброс Lock-битов).

Обратите внимание, что перед записью программы выполняется команда Chip Erase (так положено по даташиту), которая стирает данные не только во флеш, но и в EEPROM (если не запрограммирован специальный фьюз EESAVE). Так что если вы перезаписываете программу и у вас не запрограммирован фьюз EESAVE, то данные в EEPROM пропадут! Избежать этого можно либо предварительно считав данные EEPROM, а потом перезаписав их заново, либо запрограммировав фьюз-бит EESAVE перед программированием флеш.

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

Переход в режим последовательного программирования осуществляется при низком уровне на ноге RESET. При высоком уровне на ноге RESET контроллер просто запускается в нормальном режиме работы, при этом используемые для программирования выводы могут оказаться запрограммированы как выходы с любым состоянием. Поскольку программатору при программировании приходится периодически переключать состояние ноги RESET, то возникает риск КЗ подключенных сигналов от шлюза. Чтобы избежать этого риска следует все сигналы шлюза (кроме питания и земли) подключать к микроконтроллеру через резисторы 1 кОм (это отражено на схемах подключения).

Работа с фьюзами и lock-битами происходит через отдельную форму, которую (как уже упоминалось выше) можно вызвать через пункт меню Edit->Lock & Fuses… При этом для всех чипов бит SPIEN будет защищён от изменения, поскольку переключив его в незапрограммированное состояние, мы потеряем возможность программировать чип через последовательный интерфейс.

Вот в общем-то и всё. Ниже выкладываю программу с исходниками, а также список поддерживаемых этой программой чипов:

Программа Исходники Описание (поддерживаемые чипы, изменения в коде и т.д.) Поддерживаемые ОС
AVR Serial SPI Programmer v3.0b v.3.0b sources AT90S1200, AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90CAN32, AT90CAN64, AT90CAN128
ATtiny12, ATtiny13, ATtiny15, ATtiny22, ATtiny2313, ATtiny25, ATtiny26, ATtiny261, ATtiny45, ATtiny461, ATtiny85, ATtiny861
Windows XP, Windows Vista, Windows 7, Windows 8
AVR Serial SPI Programmer v3.1f v.3.1f sources + ATmega103, ATmega128, ATmega1280, ATmega1281, ATmega16, ATmega161, ATmega162, ATmega163, ATmega164, ATmega168, ATmega169, ATmega2560, ATmega2561, ATmega32, ATmega323, ATmega324, ATmega48, ATmega603, ATmega64, ATmega640, ATmega644, ATmega8, ATmega8515, ATmega8535, ATmega88 Windows XP, Windows Vista, Windows 7, Windows 8

P.S. Пока что это бета-версия программы. В неё добавлены только чипы серий AT90 и ATtiny, серию ATmega и, возможно, какие-нибудь другие чипы планируется добавить позже. Работоспособность программы пока проверена только для чипов ATtiny2313. Я конечно протестирую её со всеми чипами AVR, которые смогу найти, но было бы здорово, если бы и другие обладатели шлюзов подключились к этому процессу, протестировали работоспособность программы с другими чипами и отписались в комментариях о результатах. Все обнаруженные в процессе тестирования косяки и глюки можно выкладывать в комменты, на форум или на почту (желательно с логами).

Update 04.12.2021 Выпущена версия программы 3.1f. В эту версию добавлена возможность программирования микроконтроллеров серии ATmega (+25 чипов). Протестировано с чипами ATmega8 и ATmega88.

  1. Часть 1. USB программатор микросхем EPROM с интерфейсом I2C
  2. Часть 2. USB программатор микросхем EPROM с интерфейсом SPI
  3. Часть 3. USB-термометр на DS18B20 с передачей данных по сети
  4. Часть 4. USB программатор микросхем EPROM DS2430
  5. Часть 5. USB-программатор микросхем EPROM DS24B33
  6. Часть 6. Подключение 3-осевого гироскопа/акселерометра MPU6050 к компьютеру
  7. Часть 7. USB-программатор микросхем EPROM DS2431
  8. Часть 8. USB-программатор микросхем 1-Wire
  9. Часть 9. USB программатор SPI-flash серии W25Qxx
  10. Часть 10. USB программатор для микроконтроллеров AVR (последовательное программирование через SPI)

Аппаратный i2c в avr пример

19 Mar 15 — 19:39

Аппаратный i2c в avr пример

Скачать Аппаратный i2c в avr пример

Информация о файле:
Добавлен: 20.03.2015
Скачали: 307
Рейтинг: 367 из 1167
Скорость загрузки: 28 Mbit/s
Файлов в категории: 482

15 марта 2014 г. — Пример приема данных по UART » варианта передачи данных по протоколу I2c — использование аппаратного модуля TWI(two wire

Тэги: i2c в пример avr аппаратный

Недавние поисковые запросы:

агентский договор на организацию оценки

агентские договора корреспонденция счетов

акта разногласий к договору

7 нояб. 2014 г. — I2C — последовательная шина данных для связи интегральных схем, такое как микроконтроллер без встроенных аппаратных цепей I2C или Пример реализации I2C Slave на AVR микроконтроллере Atmega8 Аппаратный Twi (I2C) Атмеги — опубликовано в AVR: Доброго дня. примеры кода для программной и аппаратной реализации TWI 15 окт. 2011 г. — Использование аппаратной реализации протокола I2C/TWI на уделяется именно AVR, но в качестве примеров используется RTOS,


29 окт. 2013 г. — Разбор регистров будет вестись на примере микроконтроллера atmega16 Любой аппаратный модуль, реализующий интерфейс (SPI, Аппаратный модуль TWI входит в состав многих микроконтроллеров AVR. TWI в виде полнофункционального драйвера и приведен пример использования данного драйвера. Структура модуля TWI в микроконтроллерах AVR. 6 июля 2010 г. — Поскольку на шине i2c могут быть сразу несколько устройств, то для того чтобы Пример: Нужно записать байт 0xFA по адресу 0?101.Делаю аппаратный I2C по апноутам с сайта Атмела. Там есть i2c . Пример в апноуте очень не прозрачный, я не сразу понял.AVR + I2C • roboforum.ruСообщений: 1530 май 2009SERVO — управление по i2c через ATmega8 Сообщений: 1523 апр 2008Другие результаты с сайта roboforum.ruAVR: РАБОТАЕМ С ВНЕШНЕЙ ПАМЯТЬЮ I2C EEPROM https://nagits.wordpress.com/2010/12/18/avr_i2c_eeprom/Сохраненнаякопия18 дек. 2010 г. — I. Кратко теория Аппаратный модуль TWI и протокол I2C В Ведущее устройство (Контроллер AVR в нашем примере), которое хочет 25 февр. 2010 г. — Вначале было описание протокола, потом пример работы в лоб, с аппаратным модулем TWI, встроенным во все контроллеры серии


аннотация фильма без тормозов, аннотация амбробене скачать
Резюме примеры бухгалтера, Сумма накладной вместе с долгом, Ксерокопирование документов а3, Образец справки ф 11 а, Wisl 86 инструкция.

Inter-Integrated Circuits — Основы I2C » maxEmbedded

Привет, ребята, пришло время для I2C! В настоящее время, что касается последовательной связи, maxEmbedded поддерживает связь через RS232 и SPI. Пришло время выйти за рамки! В этом посте мы обсудим все теоретические концепции, которые вам необходимо знать об I2C, прежде чем программировать/тестировать его на реальных устройствах. О том, как программировать TWI/I2C микроконтроллеров (AVR), мы поговорим в следующем посте.

Как следует из названия, Inter-IC (или Inter-Integrated Circuit), часто сокращаемый как I2C (произносится как глаз-два-см. ), или IIC , был разработан как коммуникационный протокол для взаимодействия между различными ИС на материнской плате, простая внутренняя система шин.Это революционная технология, разработанная Philips Semiconductor (теперь NXP Semiconductors) в 1982 году и используемая для подключения низкоскоростных периферийных устройств (таких как клавиатура, мышь, память, порты ввода/вывода/последовательные/параллельные порты и т. д.) к материнской плате (содержащей ЦП). ) работает на гораздо более высокой скорости.

В наши дни вы можете найти множество устройств, совместимых с I2C, производства различных компаний (таких как Intel, TI, Freescale, STMicroelectronics и т. д.). Где-то в середине 1990-х Intel разработала протокол SMBus, подмножество I2C со строгими протоколами.Большинство современных устройств I2C поддерживают как I2C, так и SMBus с небольшой реконфигурацией.

Самое привлекательное в интерфейсе I2C то, что устройства подключаются к шине I2C всего двумя контактами (поэтому его иногда называют двухпроводным интерфейсом или TWI ). Конечно, нам нужны еще два контакта для Vcc и земли, но это само собой разумеется.

Интерфейс шины I2C (Источник изображения eeweb.com)

Как вы можете видеть на диаграмме выше (взято из eeweb.com), все устройства подключены к одной и той же шине I2C всего двумя контактами. Этими устройствами могут быть ЦП, устройства ввода-вывода, АЦП или любое другое устройство, поддерживающее протокол I2C. Все устройства, подключенные к шине, классифицируются как Master или Slave (точно так же, как SPI). Мы обсудим это через некоторое время.

А пока давайте побольше узнаем о самом автобусе. Шина I2C состоит из двух двунаправленных линий с открытым стоком — SDA и SCL — с резисторами, как показано ниже.

Интерфейс шины I2C

Последовательная линия передачи данных (SDA)

Последовательная линия передачи данных (SDA) — это линия передачи данных (конечно же!). Вся передача данных между устройствами происходит через эту линию.

Последовательная тактовая линия (SCL)

Serial Clock Line (SCL) — последовательные часы (очевидно!). I2C — это синхронный протокол, поэтому SCL используется для синхронизации всех устройств и передачи данных вместе. Мы узнаем, как это работает, чуть позже в этом посте.

Линии открытого дренажа

Некоторое время назад (чуть выше предыдущего изображения) я упомянул, что SDA и SCL представляют собой линии с открытым стоком (также называемые с открытым коллектором ), соединенные резисторами. Что это значит? Это означает, что устройства, подключенные к шине I2C, способны тянуть любую из этих двух линий по низкому уровню, но не могут подавать на них высокий уровень. Если какое-либо из устройств когда-либо захочет установить высокий уровень на линии, ему просто нужно будет отпустить этой линии, и она будет переведена на высокий уровень с помощью подтягивающих резисторов (R1 и R2 на предыдущем изображении или Rp на предыдущем изображении). следующее изображение).

Кому интересно, давайте посмотрим поближе. Другие, пожалуйста, пропустите этот раздел и перейдите к следующему разделу (уровни напряжения и номиналы резисторов).

Шинный интерфейс I2C — более пристальный взгляд (Источник изображения: infoindustrielle.free.fr)

На изображении выше хорошо видны транзисторы NMOS внутри устройств. Чтобы устройство потянуло любую из двух линий в низкий уровень, ему необходимо подать высокое напряжение на затвор транзистора (именно так работает NMOS-транзистор, верно?).Если напряжение затвора низкое, NMOS-транзистор не активируется, и соответствующая линия находится в состоянии высокого уровня.

I

2 C Достоверность данных

Чтобы данные в строке SDA были действительными, они не должны изменяться, пока SCL находится на высоком уровне. Данные на линии SDA должны изменяться только и только тогда, когда линия SCL переходит в низкий уровень. Если этот стандарт не соблюдается, передача данных становится ошибочной, и в этом случае она превращается в последовательность запуска/остановки (обсуждается далее в этом посте). Следующее изображение иллюстрирует то же самое.

Достоверность данных I2C (Источник изображения: infoindustrielle.free.fr)

Уровни напряжения и номиналы резисторов

I2C поддерживает широкий диапазон уровней напряжения, поэтому вы можете легко обеспечить +5 вольт или +3,3 вольта как Vcc, а также другие более низкие / более высокие напряжения. Это дает нам широкий выбор номиналов подтягивающих резисторов (R1 и R2). Все в диапазоне от 1k до 47k должно быть в порядке, однако обычно предпочтительны значения ниже 10k.

Концепция Master и Slave в I2C очень похожа на концепцию SPI.Как и в случае с SPI, все устройства имеют номер Master или Slave . Master — это устройство, которое инициирует передачу и управляет SCL тактовой линии. На одной шине I2C обычно имеется несколько подчиненных устройств , подключенных к одному ведущему устройству .

Однако, как и в случае с SPI, к одной шине I2C может быть подключено несколько мастеров . Поскольку мы хотим, чтобы наша жизнь была немного проще, мы обычно избегаем таких случаев, но, тем не менее, I2C поддерживает обнаружение коллизий и арбитраж нескольких шинных мастеров для таких случаев (не имеет смысла? Забудем об этом пока!).

I2C поддерживает последовательную 8-битную двунаправленную передачу данных со скоростью до 100 кбит/с, что является стандартной тактовой частотой SCL. Однако I2C может работать и на более высоких скоростях — Fast Mode (400 кбит/с) и High Speed ​​Mode (3,4 Мбит/с). Большинство устройств предназначены для работы на скоростях до 100 кбит/с (помните, мы обсуждали, что I2C используется для подключения низкоскоростных устройств?).

Хорошо, теперь, когда мы знакомы с интерфейсом шины I2C, давайте посмотрим, как на самом деле происходит передача данных через этот интерфейс.I2C поддерживает как однонаправленную, так и двунаправленную передачу данных, как указано ниже. О них мы подробно поговорим ближе к концу поста.

  • Однонаправленная передача данных
    • Ведущий-передатчик Ведомый-приемник (Вариант 1)
    • Ведомый-передатчик Ведущий-приемник (Вариант 2)
  • Двунаправленная передача данных
    • Ведущий Ведомый и Ведомый Ведущий (Вариант 3)

Последовательность пуска/останова

Чтобы Master начал общаться с Slave(ами) , он должен уведомить об этом Slave(s) .Это делается с помощью специальной последовательности запуска. Помните, недавно мы обсуждали достоверность данных I2C — SDA не должен изменяться при высоком уровне вероятности нежелательной почты? Что ж, это не относится к последовательности старт/стоп, поэтому делает их особыми последовательностями!

Когда уровень вероятности нежелательной почты высокий, а SDA изменяется от высокого к низкому (как показано на следующей диаграмме), это отмечает начало транзакции Master с Slave(s) .

Стартовая последовательность I2C

И когда SDA переходит от низкого уровня к высокому, в то время как SCL все еще высокий (как показано на следующей диаграмме), это отмечает конец транзакции этого Master с Slave(s) .

Последовательность остановки I2C

ПРИМЕЧАНИЕ. Между последовательностями запуска и остановки шина занята, и никакие другие ведущие устройства (если таковые имеются) не должны пытаться инициировать передачу.

Схема подтверждения

Как упоминалось ранее, I2C передает 8 бит (1 байт) данных за раз. После завершения передачи каждого байта получатель должен подтвердить это. Для подтверждения приемник отправляет бит ACK обратно передатчику. Вот как это происходит –

  • Передатчик (может быть либо Master , либо Slave ) передает 1 байт данных (сначала MSB) приемнику в течение 8 тактовых импульсов SCL, после чего он освобождает линию SDA, т.е.е. линия SDA становится ВЫСОКОЙ для тактового импульса ACK.
  • Получатель (может быть либо Master , либо Slave , в зависимости от ситуации) обязан генерировать подтверждение после каждого байта, отправленного передатчиком, переводя линию SDA в НИЗКИЙ уровень для тактового импульса ACK (9-й тактовый импульс) SCL.
  • Таким образом, всего для передачи байта данных требуется 9 тактовых импульсов SCL. Это показано на диаграмме ниже в предположении, что Master является передатчиком.

Схема подтверждения I2C (Предположение: ведущим является передатчик)
Примечание. Обозначения, показанные внизу, относятся только к SDA. SCL всегда генерируется Мастером (будь то передатчик или приемник).

Пока все хорошо. Но что, если получатель не подтвердит (или не сможет) отправить ему данные? Что происходит тогда? Вся система ломается?

В этой ситуации есть два случая.

Случай 1: Ведомый находится на стороне получателя

Даже в этом случае возможны два случая –

  • СЛУЧАЙ 1A: Подчиненный-получатель не подтверждает адрес Подчиненный (эй, подождите, что такое адрес? Мы скоро до него доберемся).В этом случае он просто оставляет линию SDA ВЫСОКОЙ. Теперь Master-передатчик либо генерирует последовательность Stop, либо пытается повторить последовательность Start.
  • СЛУЧАЙ 1B: Подчиненный-приемник подтверждает адрес Подчиненный , но через некоторое время он не может получить какие-либо данные и оставляет линию SDA ВЫСОКОЙ во время импульса ACK. Даже в этом случае Master-передатчик делает то же самое – либо генерирует последовательность Stop, либо пытается повторить последовательность Start.

Случай 2: Мастер находится на стороне получателя

Вот это сложная ситуация. В этом случае Master генерирует ACK, а также отвечает за генерацию последовательности Start/Stop. Как это работает, особенно когда транзакция заканчивается?

В этом случае, чтобы сигнализировать Подчиненный-передатчик об окончании данных, Главный-приемник НЕ формирует ACK на последний байт, переданный из Подчиненный-передатчик .В этом случае Подчиненный-передатчик должен отсоединить линию SDA, чтобы позволить Ведущему генерировать стоп или повторяющуюся последовательность запуска.

Имеет смысл? Если это сбивает с толку, надеюсь, это будет иметь больше смысла, когда мы на самом деле запрограммируем его по-настоящему.

Где-то в начале урока я упомянул, что мы можем подключить множество устройств к шине I2C. Но Master может разговаривать только с одним из Slave одновременно. Теперь, как это происходит?

Это очень похоже на ситуацию в классе.Есть один учитель ( Мастер ) и смешное количество учеников ( Раб ). Учитель хочет задать вопрос одному из учеников. Как она это делает? Ну, у нас есть имя, верно? У всех учеников есть уникальное имя (адрес), и учитель называет имя первым, верно? Привет, Макс, не могли бы вы объяснить, зачем нам нужны операторы casex в Verilog? Звучит знакомо? Старые добрые школьные времена, а? 😀

Именно это и происходит в случае транзакции шины I2C.Каждое устройство, подключенное к шине, имеет уникальный адрес. Согласно спецификациям I2C, этот адрес имеет длину 7 или 10 бит. 10-битные адреса встречаются редко, и, поскольку я ленив, я пока пропущу это.

Когда у нас есть 7-битный адрес, мы можем иметь максимум 2 7 = 128 устройств, подключенных к шине I2C, с адресами от 0 до 127. Теперь, когда Master вызывает Slave( s) , ему все еще нужно отправить 8 бит данных. В этом случае Master добавляет дополнительный бит чтения/записи (R/W’) к 7 битам адреса (обратите внимание, что W’ означает запись с дополнением).Таким образом, бит R/W’ добавляется к младшему биту байта данных. Итак, теперь отправленные данные выглядят примерно так:

.

Адресация устройств I2C
Примечание. Легенда, показанная внизу, относится только к SDA. SCL всегда генерируется Мастером (будь то передатчик или приемник).

Зачем мне об этом беспокоиться?

Я ожидаю, что этот вопрос зададут все новички. К сожалению, большинство из них этого не делают, а затем в конечном итоге разочаровываются. Какого черта мой I2C не работает?!

Возьмем сценарий.У вас есть внешняя EEPROM, которую вы хотите связать с вашим процессором с помощью I2C. Вы знаете, что адрес EEPROM 0x50 . Вы отправляете этот адрес на шину, ожидая подтверждения от устройства EEPROM. Признает? Черт, НЕТ!

Так в чем тут проблема? Да, вы правильно догадались (надеюсь). Вы забыли про бит R/W! Адрес 0x50 на самом деле является 7-битным адресом ( 0b1010000 ).

Давайте сделаем это правильно.Скажем, вы хотите выполнить операцию записи страницы на устройстве EEPROM. Это означает, что вы хотите записать на устройство и, следовательно, бит R/W’ должен быть установлен на 0 . Почему ты спрашиваешь? Потому что запись дополняется. Для чтения R/W' = 1 , тогда как для записи R/W' = 0 . Имеет смысл?

Так каким же должен быть правильный (измененный) адрес?

0x50 << 1 + 0x0 = 0xA0
0b1010000 << 1 + 0b0 = 0b10100000
(Примечание: << относится к операции сдвига влево)
 

Если вы хотите выполнить операцию последовательного чтения на том же устройстве EEPROM, каким будет ваш (измененный) адрес?

0x50 << 1 + 0x1 = 0xA1
0b1010000 << 1 + 0b1 = 0b10100001
(Примечание: << относится к операции сдвига влево)
 

Таким образом, мы можем обобщить, что для операций записи 8-битный адрес является четным, тогда как для операций чтения 8-битный адрес является нечетным.

Теперь, когда мы знакомы с транзакциями на шине I2C и адресацией устройств, давайте посмотрим, как передавать данные с использованием протокола I2C, и посмотрим на всю транзакцию на шине с высоты 10 000 футов.

Временная диаграмма

Давайте посмотрим на временную диаграмму всей транзакции — от начала до конца!

Временная диаграмма передачи данных (Источник изображения: infoindustrielle.free.fr)

Давайте сначала проанализируем это. Прежде чем мы начнем, мы все знаем, что означают эти наклонные линии, верно? Наклонные линии отображают скорость нарастания устройства/шины/системы.В идеале всякий раз, когда сигнал меняет свое состояние (с высокого на низкий или наоборот), он должен делать это немедленно. Но в реальном сценарии почти невозможно, чтобы это произошло без временной задержки. Наклонные линии относятся к этим временным задержкам, также известным как поворот.

Хорошо, вернемся туда, где мы были.

  • Транзакция начинается с последовательности START.
  • После последовательности START ведущий должен отправить адрес ведомого , с которым он хочет поговорить.Это 7-битный АДРЕС (сначала MSB), за которым следует бит R/W’, определяющий, хотите ли вы читать с устройства или записывать в него.
  • Подчиненный отвечает, подтверждая адрес. Ура! Если он не отправляет ACK, мы знаем, что делает Master , верно?
  • Как только Slave подтвердит адрес, это означает, что теперь он готов отправлять/получать данные на/от Master . Так начинается передача данных. DATA всегда состоит из 8 бит (сначала MSB), и получатель должен отправлять сигнал ACK после каждого полученного байта данных.
  • Когда транзакция завершена, Master завершает ее, генерируя последовательность STOP. В качестве альтернативы, Master также может начинаться с повторного START.

Возможны три случая передачи данных –

  • Вариант 1: Ведущий-передатчик Ведомый-приемник
  • Вариант 2:  Ведомый-передатчик Главный-приемник
  • Случай 3: двунаправленный (R/W) при передаче одних и тех же данных

Случай 1: Передача данных от ведущего (передатчика) к ведомому (приемнику)

Давайте сначала посмотрим на всю транзакцию, а затем проанализируем ее.

Передача данных от ведущего к ведомому (Источник изображения: infoindustrielle.free.fr)

  • Мастер отправляет последовательность START, чтобы начать транзакцию.
  • За ним следует Master , отправляющий 7-битный адрес Slave и бит R/W’, установленный в ноль. Мы установили его равным нулю, потому что Master — это , записывающий в Slave .
  • Подчиненное устройство подтверждает получение низкого бита ACK.
  • Как только Slave подтвердит адрес, Master теперь может отправлять данные Slave побайтно.Подчиненное устройство   должно отправлять бит ACK после каждого полученного им байта.
  • Это продолжается до Подчиненное устройство больше не может получать данные и НЕ отправляет бит ACK.
  • Это когда Master понимает, что Slave сошел с ума (больше не принимает), и затем останавливает транзакцию (или перезапускает).

Мы видим, что передача данных никогда не меняет своего направления. Данные всегда передаются от Master к Slave , что упрощает настройку.

Примером этого случая может быть выполнение операций записи страницы на микросхеме EEPROM.

Случай 2: Передача данных от ведомого (передатчика) к ведущему (приемнику)

Давайте еще раз посмотрим на всю транзакцию.

Передача данных с подчиненного устройства на основное (Источник изображения: infoindustrielle.free.fr)

  • Ведущее устройство отправляет последовательность START, за которой следует 7-битный адрес подчиненного устройства и бит R/W’, установленный в 1.
  • Мы устанавливаем бит R/W’ в 1, потому что Master — это , считывающий с Slave .
  • Подчиненное устройство подтверждает адрес и, таким образом, готово к отправке данных.
  • Slave продолжает отправлять данные Master , а Master продолжает отправлять ACK Slave после каждого байта, пока он больше не сможет принимать данные.
  • Когда Master чувствует, что хочет завершить транзакцию, он не отправляет ACK, таким образом заканчивая последовательностью STOP.

Примером этого случая может быть аналого-цифровой преобразователь (АЦП), непрерывно отправляющий данные на микроконтроллер.Микроконтроллер принимает данные столько, сколько хочет, после чего останавливает/завершает выполнение.

Случай 3: двунаправленное чтение и запись в одной и той же передаче данных

Еще раз, давайте сначала посмотрим на всю транзакцию!

Двунаправленная передача данных (Источник изображения: infoindustrielle.free.fr)

  • Ведущее устройство отправляет последовательность START, за которой следует 7-битный адрес подчиненного устройства и бит R/W’.
  • Подчиненное устройство подтверждает адрес.
  • В зависимости от значения бита R/W’ выполняются операции чтения/записи (как в двух предыдущих случаях).
  • В любом случае это всегда заканчивается тем, что получатель , а не отправляет ACK.
  • До сих пор в двух предыдущих случаях мы видели, что Мастер закрывал соединение. Но в этом случае Мастер пытается повторить СТАРТ.
  • И весь процесс повторяется снова, пока Мастер не решит ОСТАНОВИТЬСЯ.

Как мы видим, изменение направления передачи данных может произойти в зависимости от битов R/W’ во всей транзакции.

Примером этого случая может быть выполнение последовательного чтения из микросхемы EEPROM. Он двунаправленный, потому что ЦП сначала записывает адрес, с которого он хотел бы начать чтение, а затем считывает с устройства. Это похоже на то, что если вы не сообщите устройству, откуда вы хотите начать чтение, как оно начнет отправлять вам данные?

Пока все хорошо.Теперь давайте рассмотрим очень правдоподобное осложнение. Предположим, что Master считывает данные с Slave . Все идет хорошо, пока Slave возвращает данные. Что, если… что, если Slave еще не готов? Это проблема не таких устройств, как АЦП или EEPROM, а таких устройств, как микроконтроллер. Что, если Slave является микроконтроллером, а Master запрашивает данные, которых нет в его кеше. Для этого микроконтроллеру потребуется выполнить переключение контекста, заставить его искать его в ОЗУ, сохранить его обратно в кэш, а затем отправить на Master .Это могло бы (и определенно должно было бы) занять гораздо больше времени, чем тактовые импульсы SCL, и все просто пошло бы не так!

К счастью, есть способ, который называется Растяжка часов . Подчиненному устройству разрешено удерживать линию синхронизации на низком уровне до тех пор, пока он не будет готов выдать результат. Мастер должен дождаться, пока часы вернутся к высокому уровню, прежде чем продолжить свою работу.

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

Теперь, когда мы почти закончили с основами связи I2C, давайте уделим немного времени, чтобы записать некоторые преимущества I2C.

  • I2C требует наименьшего количества контактов (всего два контакта) для выполнения последовательной передачи данных.
  • Приемник всегда отправляет ответную информацию передатчику (ACK), сообщая об успешной передаче, что также приводит к повышению помехозащищенности.
  • Несмотря на низкую стандартную скорость 100 кГц, современные спецификации I2C поддерживают тактовую частоту до 3,4 МГц.
  • I2C — это 8-битный двунаправленный протокол синхронной последовательной связи, для работы которого требуется всего два провода.
  • Шина I2C состоит из двух линий с открытым стоком — SDA (данные) и SCL (часы).
  • К шине можно подключить несколько устройств, таких как Master или Slave . Устройство Master должно инициировать передачу и управлять линией синхронизации (SCL).
  • I2C поддерживает стандартную скорость 100 кбит/с, до максимальной скорости 3,4 Мбит/с.
  • Мастер должен генерировать уникальные условия запуска и остановки, чтобы отметить начало и конец транзакции.
  • Получатель должен отправлять бит ACK после каждого полученного им байта, в противном случае Мастер может либо остановить транзакцию, либо попытаться повторить запуск.
  • Каждое устройство, подключенное к шине I2C, имеет либо 7-битный, либо 10-битный адрес.Дополнительный бит R/W’ добавляется к адресу мастером , чтобы определить, хочет ли он читать или записывать с/на устройство.
  • Передача данных может быть однонаправленной ( Master в Slave ИЛИ наоборот) или двунаправленной.
  • Подчиненное устройство может удерживать линию синхронизации на низком уровне до тех пор, пока она не будет готова, а результат будет отправлен на ведущее устройство , что называется "Растягиванием тактовой частоты".

Вот и все, ребята! В следующем посте мы узнаем, как запрограммировать TWI (I2C) микроконтроллера AVR. И, пожалуйста, не ждите, пока ваши друзья и соседи сообщат вам о новых сообщениях, публикуемых на maxEmbedded, сделайте это сами, подписавшись по электронной почте или RSS! И, конечно же, не стесняйтесь изливать свое сердце в комментариях ниже. Спасибо.

Каталожные номера

  • http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html
  • http://en.wikipedia.org/wiki/I%C2%B2C
  • http://infoindustrielle.free.fr/Les_r%C3%A9seaux/Reseaux_htm/22N-I2C.хтм
  • Курс CSE325 в Университете штата Аризона

Автор –
Маянк Прасад
[email protected]
Университет штата Аризона

33.42551-111.940005

Нравится:

Нравится Загрузка...

Родственные

Мультимастер Atmel AVR TWI I2C Проблема

Примечание: Эта тема достаточно сложна и будет интересна только разработчикам, хорошо разбирающимся в микроконтроллерах Atmel AVR и последовательной шине TWI.

Я успешно использовал двухпроводной интерфейс Atmel (TWI) в течение многих лет для связи между многими микроконтроллерами и другими микросхемами. TWI — это аналог последовательной шины Philips I2C под торговой маркой.

Простейшая конфигурация шины I2C состоит в том, чтобы иметь один микроконтроллер, который инициирует связь со всеми остальными микросхемами. Мастер выводит адрес желаемого целевого устройства (ведомого) и указывает, записывает оно или читает.Это прекрасно работает для большинства проектов.

Ограничение с одним ведущим устройством заключается в том, что подчиненные устройства не могут предоставлять данные до тех пор, пока мастер не запросит информацию. Мастер должен регулярно опрашивать устройства (так называемый «опрос»), есть ли ожидающие данные. В качестве альтернативы к ведущему устройству можно подключить дополнительные провода, чтобы ведомые устройства могли указывать, когда им требуется внимание.

Чтобы преодолеть это ограничение, спецификация I2C позволяет любому устройству отправлять и получать сообщения, переключаясь с ведущего на ведомое по мере необходимости.Протокол включает в себя индикатор стартового сообщения и индикатор стоп-сообщения, так что несколько мастеров могут отслеживать, когда шина занята, даже если они не понимают содержание каждого сообщения. Более того, если два мастера отправляют сообщение одновременно, спецификация I2C предписывает, как обнаружить первый отличающийся бит в их сообщениях, а проигравшему мастеру следует отступить и повторить попытку отправки сообщения позже. Эти методы позволяют нескольким мастерам безопасно читать и записывать в шину, не испортив сообщения друг друга.

Большинство производителей микроконтроллеров реализуют большую часть протокола I2C непосредственно в аппаратной части микросхемы, что экономит разработчику программного обеспечения много работы. Программное обеспечение совершенно не загружено, когда другие устройства используют шину. Программное обеспечение прерывается только тогда, когда что-то связывается с этим конкретным микроконтроллером.

Мультимастер Проблема

В документации Atmel AVR указано, что он поддерживает несколько мастеров.И действительно, в большинстве случаев это работает просто отлично. Однако недавно я столкнулся с очень сложной ситуацией, на диагностику которой ушло пять дней кропотливой работы.

Схема трех ведущих микроконтроллеров AVR на двухпроводной интерфейсной (TWI, она же I2C) последовательной шине.

У меня есть три микроконтроллера в этой конкретной конфигурации, хотя проблема может возникнуть даже с двумя мастерами. Микроконтроллеры имеют адреса 21, 22 и 23 в шестнадцатеричном формате.(Поскольку младший бит на шине предназначен для чтения/записи, некоторые люди могут предпочесть думать об адресе как 42, 44 и 46.) Фактические адреса не имеют значения для возникновения этой проблемы.

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

Связь работает нормально большую часть времени, но всегда зависает на определенной последовательности.Вот как последовательность должна работать с :

  1. Мастер №21: Уважаемый Мастер №22, вот пять байтов, которые могут вас заинтересовать.
  2. Мастер №21: Уважаемый Мастер №23, вот пять байтов, которые могут вас заинтересовать.
  3. Мастер №22: Уважаемый Мастер №21, спасибо за пять байтов. Я подумал об этом и приготовил для вас следующие пять байтов.
  4. Мастер №23: Уважаемый Мастер №21, спасибо за пять байтов.Я подумал об этом и приготовил для вас следующие пять байтов.

Иными словами, Мастер № 21 отправляет сообщение № 22, а затем № 23. Эти мастера могут (или не могут) в конечном итоге отправить ответ.

Вот что происходит:

Трассировка логического анализатора поврежденного обмена данными по шине I2C с участием трех мастеров AVR.

Первые два сообщения в порядке, но мастер №22 начинает отвечать слишком быстро, а последний байт повторяется бесконечно (остановка никогда не происходит).Четвертое сообщение (от Мастер № 23 в Мастер № 21) никогда не происходит.

Вот как я бы описал сообщения между мастерами:

  1. Мастер №21: Уважаемый Мастер №22, вот пять байтов, которые могут вас заинтересовать.
  2. Мастер №21: Уважаемый Мастер №23, вот пять байтов, которые могут вас заинтересовать. Мастер №22: Уважаемый Мастер №21, спасибо за пять байтов. Я подумал об этом и получил следующие пять байтов для тебя ты ты ты ты ты ты ты ты ты ты ты ты ты ты ты ты ты ты [ad nauseum]

Обратите внимание, что ширина тактовых импульсов на последних байтах шире, чем более ранние тактовые импульсы.Это связано с тем, что более ранние импульсы правильно генерируются байтовыми часами чтения/записи аппаратного обеспечения TWI. Но более поздние импульсы фактически генерируются борьбой между аппаратными средствами остановки и запуска TWI мастеров 22 и 23. Данные — это не что иное, как эхо последнего действительного бита.

Поскольку шина становится постоянно занятой, никакая другая связь невозможна. В конце концов, другие устройства застревают в ожидании автобуса.

Я пробовал всевозможные подходы, чтобы найти основную причину этого.

  • Проверил подтягивающие резисторы.
  • Проверил кабели.
  • Сравнил каждое состояние состояния и ответ программного обеспечения с руководством.
  • Переписал процедуру прерывания, чтобы оптимизировать ее.
  • Ответы буферизованы, чтобы шина освобождалась быстрее.
  • Написан код для обнаружения заблокированной шины и сброса части чипа TWI.
  • Записан код в байты NAK, которые превышают размер буфера.
  • Проверены ошибки маски для ATMega168 и ATMega644 на наличие дефектов TWI.
  • Искал в Интернете все, что связано с проблемами TWI.
  • Просмотрел открытый исходный код, чтобы узнать, делают ли другие люди что-то по-другому.

Наконец, я наткнулся на неполную ветку, где кто-то уже нашел проблему, но не указал ее так, чтобы я узнал ее. Вот что происходит на самом деле.

  1. Мастер №21 успешно отправляет сообщение Мастеру №22.
  2. Мастер № 22 успешно получает прерывание, когда регистр состояния (TWSR) указывает на остановку или перезапуск (0xA0). Это позволяет чипу узнать, что сообщение получено и теперь может быть обработано.
  3. Мастер № 21 успешно выжидает соответствующее количество времени, прежде чем отправить сообщение мастеру № 23.
  4. (Проблема) Мастер №22 все еще обслуживает запрос на прерывание, а аппаратура AVR не обращает внимания на то, что шина снова стала занятой.
  5. Из-за удачного выбора времени Мастеру №23 посчастливилось получить все сообщение от Мастера №21. Он получает прерывание для обработки сообщения.
  6. (Проблема) Мастер № 22 сообщает аппаратному обеспечению AVR начать отправку сообщения на № 21. Поскольку аппаратное обеспечение AVR не следило за шиной, оно сразу начинает говорить. В этом примере он нарушил протокол, который требует немного больше времени между сообщениями.
  7. (Проблема) Мастер №23 обслуживает запрос на прерывание, а аппаратное обеспечение AVR не обращает внимания на то, что шина снова стала занятой.
  8. Прежде чем Мастер №22 успевает закончить свое сообщение, Мастер №23 начинает посылать ответ Мастеру №21, тем самым полностью перегружая шину.

Говоря более кратко, аппаратное обеспечение AVR TWI не отслеживает состояние шины, когда оно передает программному прерыванию остановку, и, следовательно, может перезаписать сообщение другого чипа, которое было запущено в это время. Событие остановки - особенно плохое место для такой проблемы. Протокол I2C не допускает растягивания шины при остановке/перезагрузке, однако принимающему чипу, скорее всего, потребуется дополнительное время для обработки только что полученного сообщения.

Возможные программные обходные пути

AVR TWI имеет только одну точку входа прерывания для всех операций TWI. Это означает, что вам нужно написать большую длинную неприятную серию операторов switch/case или вложенных операторов «if» для обработки различных состояний состояния. Это также означает, что многие регистры должны быть объединены в стек для выполнения всей этой обработки. Это занимает много времени. Количество времени обычно превышает минимально необходимый промежуток между остановкой и запуском протокола I2C.

Я решил использовать таблицу поиска, чтобы быстро перейти к конкретному коду, необходимому для обработки каждого значения состояния в регистре состояния TWI (TWSR). К сожалению, компилятор C будет складывать почти каждый регистр, когда вы выходите за пределы процедуры обработки прерывания.

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

Поскольку AVR не включает программное прерывание, я даже не могу попытаться получить лучшее из обоих миров, буферизируя данные, публикуя программное прерывание, выход из процедуры прерывания TWI, а затем обработка данных с помощью программного прерывания (которое стекировало бы гораздо больше регистров, чем первое прерывание).Да, я могу использовать контакты PCINT для генерации прерывания, но у кого есть запасные контакты?

Я значительно оптимизировал процедуру обработки прерывания, чтобы как можно быстрее обработать стоп-сообщение, немедленно активировав бит TWINT в TWCR (регистре условий). Тем не менее, время для срабатывания прерывания и стоимость стека общего регистра по-прежнему не позволяли оборудованию TWI повторно включаться в течение периода остановки и запуска протокола I2C. Кроме того, это не подходит для случая, когда процедура прерывания TWI задерживается из-за того, что микроконтроллер уже находится в процессе обслуживания другого прерывания.

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

Программное решение

Вот что я придумал в качестве решения.Пока что это работает очень хорошо.

// Добавьте это в начало файла .c вашей библиотеки TWI.
#ifndef I2C_HOW_MANY_BUSY_CHECKS_AFTER_STOP
#define I2C_HOW_MANY_BUSY_CHECKS_AFTER_STOP     4
/* Значение 0 отключает эту функцию. */
/* Большие значения медленнее, но надежнее. */
#endif

символ без знака gI2CCheckBusyAfterStop = 0; /* глобальный */

...

// Добавьте это в оператор переключения состояния подпрограммы прерывания TWI.
case I2C_STATUS_SR_RD_STOP_OR_RESTART: // Определено как 0xA0
gI2CCheckBusyAfterStop = I2C_HOW_MANY_BUSY_CHECKS_AFTER_STOP;

...

// Ручная проверка шины: добавьте это в свой код простоя и перед выдачей команды запуска.
if ( gI2CCheckBusyAfterStop != 0 ) // Многократный вызов while(gI2CCheckBusyAfterStop>0)
{
если (    PinIsLow(I2C_DATA_PORTIN, I2C_DATA_PIN)
|| PinIsLow (I2C_CLOCK_PORTIN, I2C_CLOCK_PIN))
{
gI2CCheckBusyAfterStop = I2C_HOW_MANY_BUSY_CHECKS_AFTER_STOP;
// Автобус занят.Начните обратный отсчет заново.
}
еще
{
gI2CCheckBusyAfterStop--; // Хорошо. Автобус тихий. Обратный отсчет!
}
}

Прерывание TWI загружает счетчик (gI2CCheckBusyAfterStop). когда он получает сигнал остановки/перезапуска ведомого TWI. Это напоминает программе проверить шину вручную. в следующий раз, когда он хочет начать сообщение.

Официально шина I2C простаивает, когда вывод данных поднимается после вывода часов.К сожалению, программному обеспечению трудно обнаружить это. Тем не менее, шина определенно занята, если на выводах данных или синхронизации низкий уровень. Поэтому мы просто перезапускаем обратный отсчет, если на каком-либо из выводов низкий уровень. (У меня есть макрос, определенный для PinIsLow. Вместо этого используйте то, что вы обычно предпочитаете.)

Я вызываю код проверки шины в своем основном цикле бездействия и перед попыткой запустить сообщение. Таким образом, если прошло много времени с тех пор, как я получил остановку, основной цикл ожидания уже обнаружит тихую шину, и мы будем готовы к отправке сразу же после этого.Если код должен отправить сообщение немедленно, он может постоянно проверять шину и выполнять обратный отсчет в процедуре запуска TWI.

Обратите внимание, что этот код почти не влияет на микроконтроллеры, которые никогда не получают сообщения в ведомом режиме. Единственным негативным последствием является небольшое снижение максимальной пропускной способности шины для мастеров, которые часто принимают сообщения как слейвы.

Трассировка логического анализатора обмена данными по шине I2C с участием трех ведущих устройств с интеллектуальным программным обеспечением, делающим паузы между сообщениями во избежание конфликтов с микроконтроллерами Atmel AVR.

Как видите, те же самые сообщения, показанные ранее, теперь успешно доставляются, не наступая друг на друга. Для очень медленных шин с очень быстрыми микроконтроллерами (обычно это не так) следует увеличить значение I2C_HOW_MANY_BUSY_CHECKS_AFTER_STOP.

Желаемое исправление

Очевидно, что желаемое исправление от Atmel будет состоять в том, чтобы аппаратное обеспечение TWI продолжало наблюдать за шиной во время события остановки/перезапуска на принимающем ведомом устройстве.

Более того, Atmel может сделать условие остановки/перезапуска TWI отдельным прерыванием. Таким образом, микросхема TWI может продолжать наблюдать за шиной без необходимости замораживания своих регистров перед вызовом прерывания. (Программное обеспечение уже знало бы, что это условие остановки, без необходимости чтения TWSR, потому что был вызван этот специальный вектор прерывания.) Это также позволило бы стекировать меньшее количество регистров общего назначения во время основного прерывания TWI.

Оба этих предложения будут обратно совместимы с существующим кодом.

Хотя я потратил много времени на анализ этого вопроса, я уважаю возможность того, что где-то мог допустить ошибку. Если у кого-то есть более элегантное решение или кто-то может указать, что я ошибаюсь в отношении чипов Atmel, сообщите мне, чтобы я мог опубликовать эту информацию.

ВОПРОС ЧИТАТЕЛЯ

Какова максимальная пропускная способность шины I2C 100 кГц при опросе шести устройств?

Официальная спецификация здесь:
http://www.nxp.com/acrobat_download/literature/9398/39340011.pdf
На странице 32 рассматриваются паузы (время ожидания) между сообщениями.

1/100 000 Гц = 10 мкс. Идеальные часы прямоугольной формы будут повышаться на 5 мкс и опускаться на 5 мкс. Меня не удивляет указанное время удержания и низкие высокие периоды около 4 мкс. Это просто означает, что время работы и время простоя ваших часов могут немного отличаться от идеальных «5 мкс».

Каждое полное сообщение включает в себя минимальное начало (4 мкс), остановку (4 мкс) и паузу (4.7 мкс) перед следующим сообщением. Это 12,7 мкс служебных данных. Если один бит занимает 10 мкс, давайте просто назовем это требуемым старт/стоп/пауза 2 битами (20 мкс), чтобы упростить вычисления.

Каждый пакет имеет длину 9 бит (8 битов, за которыми следует ack/nak). Предполагая, что вы отправляете запрос адреса, за которым следует чтение 1 байта, это займет 18 бит (9 адресов + 9 чтения) + 2 бита для запуска/остановки/паузы.

100 000 Гц / 20 бит = 5 000 сообщений * 1 прочитанный байт = 5 000 байт в секунду.

Если вы хотите опросить 6 устройств и предполагаете, что им нужен только их адрес (без командного байта), и они вернут один байт, тогда у вас будет максимально возможная пропускная способность 5000 байт в секунду.

Если бы вы считывали 2 байта с ведомого устройства, это было бы 1 адрес + 2 байта:

100 000 Гц / 29 бит = 3448 сообщений * 2 прочитанных байта = 6896 байт в секунду. Это увеличение пропускной способности, поскольку соотношение между служебными данными (адрес + начало/стоп/пауза) и данными (2 байта) улучшилось.

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

100 000 Гц / 9 бит = 11 111 байт в секунду

К сожалению, если вам нужно сообщить ведомому устройству, что вы хотите прочитать, это будет 1 адрес + 1 команда (что вы хотите прочитать), за которой следует 1 прочитанный байт.

100 000 Гц / 29 бит = 3448 сообщений * 1 прочитанный байт = 3448 байт в секунду. Это уменьшение пропускной способности, поскольку ухудшилось соотношение между накладными расходами (адрес + команда) и данными (1 байт).

Максимальный протокол по сравнению с паузами, необходимыми для программного обеспечения и устройств

Предположим, вы считаете, что скорость 5000 байт в секунду (1 адрес + 1 прочитанный байт) приемлема. Нам все еще нужно учитывать время, необходимое этим устройствам для выполнения своей работы.

Например, если вы используете микроконтроллер в качестве мастера, то микроконтроллер захочет что-то сделать с прочитанными им байтами. Это время не будет потрачено на чтение автобуса. Таким образом, он действительно не будет полностью использовать потенциальную скорость 5000 байт в секунду.

  • Большинство аппаратных чипов могут считываться непрерывно на частоте 100 кГц без дополнительного времени между сообщениями.
  • Некоторым аппаратным чипам требуется некоторое время между операциями записи, так как у них есть работа.Например, микросхеме EEPROM потребуется некоторое время для хранения данных (обычно им требуется время только для каждых 32 или 255 записей или любого другого размера их буфера).
  • Большинству микроконтроллеров (микроконтроллеров) требуется некоторое время между сообщениями, независимо от того, читаются они или пишутся, чтобы сработать и выполнить функцию. Доске для преобразования текста в речь может потребоваться много времени (время, чтобы фактически произнести сообщение, которое вы только что предоставили).

Глядя на изображения логического анализатора ранее на этой странице, вы заметили паузы после стартового бита и между пакетами из 9 тактов? Микросхема Atmel создает прерывание, сохраняет регистры и вызывает мою процедуру обработки I2C для обработки следующего байта.Эти паузы не требуются протоколом I2C. Эти паузы — это просто количество времени, которое требуется моему программному обеспечению для предоставления следующего фрагмента данных аппаратному обеспечению Atmel I2C. Чем быстрее часы моего процессора и чем быстрее мои программные процедуры, тем короче будут эти паузы (до определенного момента).

Оказывается, это добавляет около 30% накладных расходов. Теперь пропускная способность 5000 байт на самом деле составляет около 3800 байтов в секунду.

Подводя итог, если вам нужна большая скорость, выберите более высокую скорость шины (> 100 кГц) или считывайте больше байтов на сообщение.В противном случае предположим, что скорость около 3800 байт в секунду является реалистичной при чтении 1 байта с шести разных устройств с использованием шины I2C с частотой 100 кГц. Уменьшите скорость, если шина шумная/подвержена ошибкам.


Инструменты I2C, SPI, USB для разработчиков AVR

Total Phase предлагает гибкие, мощные и доступные инструменты I2C, SPI и USB, которые идеально подходят для разработчиков AVR. Используя эти инструменты и бесплатный API, предлагаемый Total Phase, разработчики AVR могут свободно создавать собственные утилиты, графические пользовательские интерфейсы и многое другое.Кроссплатформенная поддержка обеспечивает гибкость разработки на платформах Windows, Linux или Mac OS X. Независимо от того, разрабатываете ли вы творческие проекты в свободное время или создаете мощные устройства на работе, разработчики AVR могут положиться на инструменты отладки Total Phase, которые обеспечивают идеальное сочетание гибкости, низкой стоимости и мощности.

 

Последовательные шины на AVR и AVR32

Все микроконтроллеры AVR и AVR32 имеют несколько шин I2C (TWI) и SPI для взаимодействия с периферийными устройствами, такими как EEPROM, микросхемы флэш-памяти, датчики, АЦП/ЦАП и т. д.Total Phase предлагает широкий спектр инструментов I2C и SPI, которые могут быстро имитировать, программировать, тестировать и пассивно контролировать эти последовательные шины.

Инструменты для I2C (TWI) и SPI


Хост-адаптер Aardvark I2C/SPI

Хост-адаптер Aardvark I2C/SPI — это недорогой USB-интерфейс, который позволяет разработчикам отправлять и получать данные в качестве ведущего или подчиненного устройства I2C/SPI с ПК под управлением Windows, Linux или Mac OS X. Этот универсальный инструмент незаменим для отладки встроенных систем.Адаптер Aardvark можно использовать для эмуляции ведущих или ведомых устройств, внутрисистемного программирования, настройки периферийных устройств I2C или SPI, автоматических тестовых приспособлений и многого другого.

Анализатор протокола Beagle I2C/SPI

Анализатор протокола Beagle I2C/SPI — это недорогой, ненавязчивый USB-монитор шины для I2C и SPI. Этот анализатор может отображать трафик шины I2C с частотой до 4 МГц и трафик шины SPI с частотой до 24 МГц в режиме реального времени с временным разрешением на уровне битов 20 нс.Анализатор полностью поддерживает Windows, Linux и Mac OS X и является отличным дополнением к хост-адаптерам Aardvark и Cheetah.

Хост-адаптер Cheetah SPI

Хост-адаптер Cheetah SPI — это эффективный высокоскоростной адаптер SPI через USB. Достигая скорости до 40+ МГц без пропусков, адаптер Cheetah является отличным инструментом для внутрисистемного программирования последовательной флэш-памяти, приложений потоковой передачи данных и многого другого.


USB на AVR и AVR32

АВР32 АР7

Микроконтроллер AVR32 AP7 имеет встроенный USB PHY со скоростью 480 Мбит/с, что позволяет разработчикам разрабатывать высокоскоростные встроенные хосты или устройства на основе USB.

АВР32 UC3

Микроконтроллер AVR32 UC3 обеспечивает полноскоростной порт USB (12 Мбит/с) и возможность работы в режиме On-The-Go для создания следующего поколения устройств plug-and-play.


Инструменты для USB

Анализаторы USB-протокола Beagle

USB-анализаторы Beagle обеспечивают непревзойденную видимость USB-трафика в режиме реального времени. Анализатор протокола Beagle USB 480 — это высоко-/полно-/низкоскоростной USB-анализатор с поддержкой OTG.Он может отслеживать и отображать USB-трафик со скоростью до 480 Мбит/с в режиме реального времени, включая низкоуровневые события шины, такие как OTG HNP и SRP, звуковые сигналы K и J и многое другое.

Анализатор протокола USB 12 Beagle — недорогой полноскоростной/низкоскоростной USB-анализатор, который также может отслеживать и отображать USB-трафик со скоростью до 12 Мбит/с в режиме реального времени. Это один из самых доступных аппаратных USB-анализаторов на рынке.


Дополнительные функции и преимущества

  • Гибкость - Простой интерфейс API дает пользователям гибкость для интеграции оборудования Total Phase в индивидуальные программные решения.
  • Совместимость — Полная совместимость с Windows, Linux и Mac OS X.
  • Комплекты разработчика — Заинтересованы как в хост-адаптере, так и в анализаторе протоколов? Купите комплект разработчика I2C, комплект разработчика SPI или комплект программирования, который включает в себя несколько устройств, дополнительные кабели и тестовые платы.
  • Без дополнительных затрат — Бесплатное программное обеспечение, бесплатный API, бесплатные обновления прошивки/программного обеспечения и бесплатная техническая поддержка.

Названия и логотипы Atmel, AVR, AVR32 являются товарными знаками корпорации Atmel.

Любой порт, любой контакт: Мастер TWI для Attiny, Atmega

TWI, I2C, SMBus, 2-проводная. . . это бесценный способ добраться до датчиков в проектах микроконтроллеров. Хотя существует множество примеров использования I2C и других двухпроводных протоколов на назначенных контактах чипа Atmel, как разработать мастер I2C на нестандартных контактах?

Питер Флери написал здесь большую основную библиотеку I2C.Библиотеку можно скачать здесь и адаптировать как для чипов Attiny, так и для Atmega.

Нам пришлось адаптировать эту библиотеку для использования в проекте, где мы хотели использовать Attiny и Atmega. Ниже мы шаг за шагом расскажем вам, что мы сделали, чтобы эта библиотека работала для Attiny и Atmega.

Чтобы адаптировать это к вашему проекту, выполните два шага: измените определения выводов и портов и установите тактовую частоту задержки.

Замена контактов:

Мы будем использовать Attiny88 в качестве примера.Распиновка для нормального использования показана на картинке справа. SDA и SCL обычно определяются стандартными библиотеками TWI как PB2 и PB0. Для нашего проекта мы хотели переместить линии SCL и SDA на контакты PB3 и PB4.

Выводы выбираются в файле i2Cmaster.S, полученном из исходного кода. Откройте этот файл в текстовом редакторе или AVR Studio, и вы найдете следующее:

#define SDA                        4            // SDA, порт D, контакт 4
#define SCL                         5            // Порт SCL D, контакт 5
#define SDA_PORT          PORTD           // Порт SDA D
#define SCL_PORT          PORTD           // Порт SCL D

Теперь просто переназначьте контакты там, где они вам нужны.Опять же, в нашем примере мы перемещаем мастер I2C на PB3 и PB4.

#define SDA                                4            //
#define SCL                                 3            //
#define SDA_PORT                    PORTB           //
#define SCL_PORT                     PORTB           //
Как вы можете видеть выше, мы переопределили порты и контакты.

Изменение процедуры задержки:

Второй шаг — изменение процедуры задержки.Поскольку I2C является двухпроводным протоколом, ему не нужны точные часы (точные, но не точные). Однако для некоторых датчиков требуется как точность, так и точность (например, для многих датчиков SMBus требуется тактовая частота меньше или равная 100 кГц).

Файлы Fleury написаны на AVR Assembler, который не является невероятно удобным или простым в использовании языком. Мы покопались и нашли здесь некоторую информацию о задержках в AVR, по крайней мере, достаточную, чтобы помочь нам изменить задержку.

Давайте начнем с исходного кода ниже.Он предполагает кварц 4 МГц. :

;****************************************************** *************************
;половина периода задержки
;Для I2C в обычном режиме (100 кГц) используйте T/2 > 5us
; Для I2C в быстром режиме (400 кГц) используйте T/2 > 1,3 мкс
.
;****************************************************** *************************
.stabs "",100,0,0,i2c_delay_T2
.stabs «i2cmaster.S», 100,0,0,i2c_delay_T2
.func i2c_delay_T2 ; задержка 5.0 мкс с кварцем 4 МГц
i2c_delay_T2:        ; 4 цикла
rjmp 1f      ;2   "
1: rjmp 2f      ; 2 "
2: rjmp 3f      ; 2 "
3: rjmp 4f      ; 2 "
4: rjmp 5f      ; 2 "
5: rjmp 6f      ; 2 "
6: нет          ; 1    
возврат          ; 3     
.endfunc     ; всего 20 циклов = 5,0 мкс с кристаллом 4 МГц

Изменение этого раздела программы направлено на корректность подсчета.В нашем примере мы используем внешние часы с частотой 16 МГц, что в 4 раза быстрее, чем исходная программа. На странице ассемблера мы видим, что функция «nop» задерживает 1 отсчет или цикл. Чтобы получить 100 кГц, Флери изначально записал 20 тактов, чтобы получить задержку в 5,0 микросекунд. В нашем примере мы просто добавим 80 отсчетов, чтобы увеличить задержку в 4 раза. Мы можем сделать это с помощью «nop», и мы вставим это ниже.

;****************************************************** *************************

;половина периода задержки
;Для I2C в обычном режиме (100 кГц) используйте T/2 > 5us
; Для I2C в быстром режиме (400 кГц) используйте T/2 > 1.3 нас
;****************************************************** *************************
.stabs "",100,0,0,i2c_delay_T2
.stabs «i2cmaster.S», 100,0,0,i2c_delay_T2
.func i2c_delay_T2 ; задержка 5,0 мкс с кварцем 4 МГц
i2c_delay_T2:    ; 4 цикла
; nop задерживает 1 счет.
; вы должны выровнять это до тактовой частоты процессора.
; Чтобы получить 5,0 микросекунд с кристаллом 16 МГц, вам нужно
; иметь 80 задержек счета.Без этого не получится.
нет ; задержки 1 счет
нет; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (5)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (10)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (15)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (20)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (25)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (30)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (35)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (40)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (45)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (50)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (55)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (60)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (65)
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет
нет ; задержки 1 счет (70)
нет ; 1
нет ; 1    
нет ; 1    
возврат          ; 3     
.конечная функция     ; всего 80 циклов = 5,0 мкс с кристаллом 16 МГц;

Получите модифицированный файл i2Cmaster.S здесь.

Есть вопросы?

Библиотека Elegant TWI/I2C для MCU серии AVR Mega

Любитель электроники Джин Чжу из Сан-Франциско запустил кампанию на Kickstarter, чтобы создать новую элегантную библиотеку TWI/I2C для микроконтроллеров серии AVR Mega, которая доступна всего за 5 долларов и, как ожидается, будет доставлена ​​где-то в мае 2020 года.Чжу рассказал немного больше о вдохновении, стоящем за проектом, и его целях.

«Я не хочу этого говорить, но большинство, если не все библиотеки TWI/I2C для микроконтроллеров AVR, гуляющие по интернету, содержат огромный язык программирования Python, и как человек, работающий на C++, для меня это плюс плюс неприемлемо, но это что это такое, и я хочу это изменить, и вы можете помочь. I2C настолько важен, потому что он так хорошо принят во многих интегральных схемах, но мы буквально живем в мире с отличным оборудованием, но дерьмовым программным обеспечением для его управления.Если 100 человек согласятся со мной и у них будет лишних 5 долларов, то приведенное выше утверждение больше не будет верным, по крайней мере, не для части утверждения AVR TWI, и я могу гарантировать вам, что это лучшие пять долларов, которые вы можете получить. никогда не потратит ни на что».

Элементы, которые библиотека TWI предложит пользователям, включают:

— Простота в использовании (Ваш 8-летний ребенок сможет с легкостью им пользоваться. Самое главное!)
— Без сбоев (Вы должны сосредоточить свое время и творческий потенциал на своих проектах.8=256 байт для комбинированного ролевого режима. (Например, в режиме MT вы можете отправлять только 16 байт за раз; в MT+ST вы можете сначала отправить до 16 байт, а затем получить до 256 байт от ведомого устройства.)
— Оба прерывания и/ или на основе опроса! Если есть плюсы и минусы для обоих, то почему бы не включить их обоих в библиотеку?
— совместимый с AVR-C и Arduino
— выбираемая частота последовательной синхронизации от 244 Гц до 500 кГц с системными часами 8 МГц (Примечание: в большинстве случаев SCL не имеет смысла, а растяжка часов от ведомого устройства значительно замедлит их, поэтому мы на самом деле не нужно так сильно возиться с SCL, если только ведомое устройство не слишком медленное, и тогда нам также нужно будет замедлить ведущее устройство.Техническая максимальная скорость 500 кГц достижима только тогда, когда и ведущий, и ведомый могут обрабатывать данные TWI BUS в течение 16 тактовых циклов. На самом деле драйвер, написанный на C, будет иметь половину этой максимальной скорости, поэтому 500 кГц все еще может быть достижимо с более высокой тактовой частотой процессора 16 МГц, но, поскольку наша библиотека будет включать полную реализацию TWI, 100 кГц — единственная гарантированная самая высокая тактовая частота. Вы все еще можете выбрать 500 кГц, но он не будет выводиться на частоте 500 кГц. Чтобы увеличить код и повысить эффективность этой библиотеки, мы также должны использовать самые медленные часы около 15 кГц.Таким образом, в действительности используемый диапазон тактовой частоты составляет от 15 кГц до 100 кГц. Вероятно, может подняться до 200 кГц, но это не обещание. )

Источник: Kickstarter

Рубрики: Проекты своими руками, Главные новости

Последние предложения Geeky Gadgets


Как вы используете I2C в AVR? - Первый законкомик

Как вы используете I2C в AVR?

Шаги программирования в ведущем устройстве

  1. Инициализировать I2C.
  2. Создать условие СТАРТ.
  3. Запись устройства Запишите адрес (SLA+W) и проверьте наличие подтверждения.
  4. После подтверждения записать данные в ведомое устройство.
  5. Создать условие ПОВТОРНЫЙ ЗАПУСК с помощью SLA+R.
  6. Получение данных от ведомого устройства.

Какой микромод поддерживает протокол I2C?

Микроконтроллер PIC184550 имеет модуль Master Synchronous Serial Port (MSSP). MSSP поддерживает связь SPI и I2C. Модуль MAAP можно использовать в режимах SPI или I2C или в обоих режимах.

Последовательный интерфейс I2C?

I2C использует последовательную передачу для передачи данных.Используется для низкоскоростной связи.

Является ли I2C синхронным или асинхронным?

I2C (Inter-Integrated Circuit, Eye-Squared-C), также известный как I2C или IIC, представляет собой синхронную, многоконтроллерную/многоцелевую, одностороннюю последовательную шину с коммутацией пакетов, изобретенную в 1982 году компанией Philips Semiconductors. .

Какие контакты Atmega32 используются для I2C?

Протокол связи I2C Протокол I2C использует только 2 контакта, один для часов (SCL) и один для данных (SDA).В Atmega32 это контакты 22 (SCL) и 23 (SDA). Они мультиплексируются через контакты 0 и 1 порта ввода-вывода C соответственно.

Как кодировать I2C?

Базовая последовательность чтения или записи от ведущего к ведомому для I2C следует следующему порядку:

  1. Отправить бит СТАРТ (S).
  2. Отправить адрес подчиненного устройства (ADDR).
  3. Отправить бит Read(R)-1 / Write(W)-0.
  4. Ожидание/отправка бита подтверждения (A).
  5. Отправка/получение байта данных (8 бит) (DATA).
  6. Бит подтверждения ожидания/отправки (A).
  7. Отправьте STOP-бит (P).

Является ли I2C быстрее, чем SPI?

I2C используется только два провода для связи, один провод используется для данных, а второй провод используется для часов. SPI требует трех- или четырехпроводного соединения для связи ((в зависимости от требований), MOSI, MISO, SCL и контакта выбора микросхемы. I2C медленнее, чем SPI. По сравнению с I2C, SPI быстрее.

В чем разница между I2C и can?

Большинство микроконтроллеров с шинами i2c могут работать только на частоте до 400 кГц.CAN является дифференциальным и более устойчивым к шуму. CAN позволяет отправлять только 8 байтов за раз, i2c практически неограничен (это может быть хорошо или плохо, в зависимости от того, как вы на это смотрите). Вы можете транслировать с помощью i2c, хотя i2c использует адреса узлов для большинства сообщений.

Как вы используете ATtiny?

2. Запрограммируйте ATtiny85 с помощью Arduino

.
  1. Войдите в свою среду разработки Arduino в меню Инструменты > Плата.
  2. Выберите вариант под надписью ATtiny25/45/85.
  3. В разделе Инструменты выберите Процессор: ATtiny85 и Часы: Внутренние 1 МГц.
  4. Измените настройку программатора на USBtinyISP.
  5. Когда вы будете готовы к загрузке, подключите ATtiny85 к специальному разъему.

Что такое ATtiny IC?

ATtiny (также известный как TinyAVR) — это подсемейство популярных 8-битных микроконтроллеров AVR, которые обычно имеют меньше функций, меньше контактов ввода-вывода и меньше памяти, чем другие чипы серии AVR. Первые члены этого семейства были выпущены в 1999 году компанией Atmel (позже приобретенной компанией Microchip Technology в 2016 году).

Могу ли я использовать ATtiny в качестве моста UART-I2C?

Большинство встроенных приемников GPS имеют интерфейс UART, но, к сожалению, это не удобный сенсорный интерфейс для роботов, интегрирующих множество функций. В этой статье объясняется, как создать интерфейс I2C для вашего GPS, используя ATtiny в качестве моста UART-to-I2C.

Что такое введение ATtiny USI I2C?

ATTiny USI I2C Introduction — мощный, быстрый и удобный коммуникационный интерфейс для ваших проектов ATTiny! Введение: Введение в ATTiny USI I2C — мощный, быстрый и удобный коммуникационный интерфейс для ваших проектов ATTiny!

В чем разница между драйверами I2C ATmega168 и attiny2313?

ATmega168 имеет специальное оборудование для шины I2C, известной как двухпроводной интерфейс (TWI).После того, как драйверы написаны, эти различия в основном прозрачны для пользователя. Одно существенное отличие заключается в программном обеспечении: драйвер I2C ATmega168 управляется прерываниями, а драйвер ATtiny2313 — нет.

Могу ли я создать интерфейс I2C для моего GPS с помощью ATtiny?

В этой статье объясняется, как создать интерфейс I2C для вашего GPS, используя ATtiny в качестве моста UART-to-I2C. Справочные материалы по взаимодействию модуля GPS на основе UART с ATtiny см. в статье об интерфейсе GPS с SPI.

[I2C] I2C ATmega128

 

Двухпроводной последовательный интерфейс

참조: техническое описание ATmega128, протокол I2C и т. д., данные блога. 

 

I2C: 어떤 СК 들간 에도 공통적 으로 통할 있는 버스 (2 가닥 )

오늘 의 주제 주제 : Atmega128 에서 의 사용법 사용법 대해서 ... 

 

 

ПД1 INT1/SDA(1) (вход внешнего прерывания 1 или серийные данные TWI)

 

ПД0 INT0/SCL(1) (вход внешнего прерывания0 или серийные часы TWI)

 

 

 

• INT1/SDA — порт D, бит 1

INT1, внешний источник прерывания 1.

Вывод PD1 может служить внешним источником прерывания

в MCU.

SDA, двухпроводной последовательный Данные интерфейса : Когда бит TWEN в TWCR установлен (один) для включения двухпроводного последовательного Интерфейс, пин PD1 отключен от порта и

становится контактом ввода-вывода последовательных данных для двухпроводного последовательного интерфейса. В этом режим, на штырьке имеется фильтр спайков для подавления спайков короче 50 нс на входной сигнал, а вывод управляется драйвером с открытым стоком с ограничение скорости нарастания.

 

 

 

 

 

• INT0/SCL — порт D, бит 0

INT0, источник внешнего прерывания 0.Вывод PD0 может служить внешним источник прерывания к MCU.

SCL , двухпроводной последовательный интерфейс Часы : Когда бит TWEN TWCR установлен (один) для включения двухпроводного последовательного интерфейса, контакт PD0 отключается от порта и становится контактом ввода/вывода Serial Clock для Двухпроводной последовательный интерфейс. В этом режиме на штырьке имеется фильтр шипов, подавить всплески во входном сигнале короче 50 нс, и штифт приводится в действие драйвером с открытым стоком с ограничением скорости нарастания.Таблица 37 и Таблица 38 связывает альтернативные функции порта D с приоритетными сигналами.

 

 

 

Характеристики

 

Простой, но мощный и гибкий коммуникационный интерфейс, требуется только две линии шины

Главный и ведомый Операция поддерживается

Устройство может работать как Передатчик или приемник

7-битное адресное пространство позволяет использовать до 128 различных адресов ведомых устройств

Мультимастер Арбитражная поддержка

До 400 кГц Данные Скорость передачи

Ограниченная скорость нарастания Выходные драйверы

Шумоподавление Схема отклоняет пики на шинных линиях

Полностью программируемый Адрес подчиненного устройства с общей поддержкой вызовов

Распознавание адреса Вызывает пробуждение, когда AVR находится в спящем режиме

 

간단히 설명을 풀자면..

I2C 는 필립 필립으로 에서 처음 개발 하였으며, 특징 으로 는 오직 2 가닥 의 의 만 필요 하며 / шина 에 연결 되어 소프트웨어 적 으로 주소지정이 가능 값 마과 마장치들 / 슬레이브 관계 의 가진다 과과 . (보통마터 는 Mcu 가 되며, 슬레이브 는 각종 센서류나 메모리, 출력 장치가 된다)

다수 의의의터 가 Bus 에 연결 되어 있어도 장치간 충돌 마을을 를 있으며 개이상 데이터 마마 변조변조 않으며 통신이 가능하다. (이는이는. MODE만 제공한다.

단일 칩 필터링으로 노이즈를 제거한다.

버스의 커패시턴스가 400pF 을 넘지않는 한도안에서 IC연결이 가능하며 아트메가매 128가맜. 이는 주소비트가 7bit이기 때문이다.

Определение шины двухпроводного последовательного интерфейса

 

Двухпроводной последовательный интерфейс (TWI) идеально подходит для типичных микроконтроллерные приложения.

Протокол TWI позволяет разработчику системы соединять до 128 разные устройства, использующие только две двунаправленные линии шины, одна для синхронизации (SCL) и один для данных (SDA).Единственное внешнее оборудование, необходимое для реализации шины представляет собой одиночный подтягивающий резистор для каждой из линий шины TWI. Все устройства подключенные к шине имеют индивидуальные адреса и механизмы разрешения конфликты на шине присущи протоколу TWI.

 

 

>Подтягивание 저항은 필요한가 ? (R1, R2)

신호가 없으면 항상 High 값 을 유지 하기 때문 에 에 Высочайшее 가 상태 라면 현재 통신 이 가능 뜻 이 되며 이는 장치간 의 을 미연 방지 이 역할 을 하게하게

 

Как показано на рис. 86, обе линии шины подключены к положительному напряжение питания через подтягивающие резисторы. Драйверы шин всех TWI-совместимых устройства бывают с открытым стоком или открытым коллектором. Это реализует функцию проводного И что необходимо для работы интерфейса. Низкий уровень на автобусе TWI линия генерируется, когда одно или несколько устройств TWI выводят ноль. Высокий уровень выход, когда все устройства TWI переключают свои выходы в тройное состояние, что позволяет подтягивать резисторы, чтобы тянуть линию вверх.Обратите внимание, что все устройства AVR, подключенные к TWI шина должна быть запитана, чтобы разрешить любую операцию шины.

Количество устройств, которые можно подключить к шине, ограничено только предел емкости шины 400 пФ и 7-битное адресное пространство ведомого устройства. А подробная спецификация электрических характеристик TWI приведена в «Характеристики двухпроводного последовательного интерфейса» на стр. 324 . Представлены два разных набора спецификаций там один

относится к скорости шины ниже 100 кГц, а один действителен для скорости шины до 400 кГц

 

 

Передача данных и формат кадра

 

Перенос битов

 

 

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

 

데이터의 유효성 : SCL이 High이면 SDA신호는 일정값을 유지해야한다. (DATA값)

                                SCL이 LOW이면 SDA신호는 변경이 가능하다.

Условия ПУСК и СТОП

 

앞서 SCL이 HIGH일때 SDA신호는 일정해야 한다고 하였다.

만약 값이 변한다면?? 그때가 바로 시작과 중단신호를 의미한다. (참 잘만든 프로토콜인듯..)

SCL = HIGH상태  -> SDA가 Спадающий фронт = условие START

SCL = HIGH상태  -> SDA가 Нарастающий фронт   = STOP условие

 

그래서 DATA는 시작신호 이후에 입력될수있다.

Формат пакета адресов

 

Формат пакета данных  

 

시작조건이 발생되면 ( SCL = HIGH상태  -> SDA가 Falling Edge ) 만약 SLAVE가 데이터를 다 받지 못했다면 SLAVE는 SCL신호를 LOW로 잡아둠으로써 나머지 DATA를 모두 모두 전송 술술술술.(풀업설계의 장점이기도 하다)

Подтверждение

 

Передача данных с подтверждением обязательный. Тактовый импульс, связанный с подтверждением, генерируется мастером. То Передатчик освобождает линию SDA (HIGH) во время тактового импульса подтверждения.

Ресивер должен стянуть ПДД линии во время тактового импульса подтверждения, чтобы он оставался стабильным НИЗКИМ во время ВЫСОКИЙ период этого тактового импульса (см. фиг.7). Конечно, настроить и держать раз )

тоже надо учитывать.

Обычно приемник, address обязан генерировать подтверждение после получения каждого байта, за исключением случаев, когда сообщение начинается с адреса CBUS

.

Когда ведомое устройство не подтверждает подчиненный адрес

 (например, невозможно получить или передавать, потому что он выполняет какую-то функцию в реальном времени),

линия данных должна быть оставлена ​​ВЫСОКОЙ на раб. Затем мастер может сгенерировать либо условие STOP, чтобы прервать передача или повторное условие СТАРТ, чтобы начать новую передачу.

Если ведомый приемник подтверждает подчиненный адрес, но через некоторое время при передаче больше не может получать байтов данных мастер должен снова прервать передачу. На это указывает ведомое устройство, генерирующее неподтверждение для первого последующего байта. Раб уходит линия данных HIGH, и мастер генерирует STOP или повторяющийся START условие.

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

подтверждение последнего байта, был тактирован из раб.Ведомый-передатчик должен освободить линию данных

, чтобы мастер мог генерировать СТОП или повторный СТАРТ.

 

요약하면, DATA전송이 끝나면 SLAVE는 의무적으로 ACK를 발생시켜야 한다. 또한 이를 위해서 MASTER는 8번째 비트까지 DATA전송을 끝내고 9번재는 그냥 클럭신호만 보내줘야한다. 그래서 SLAVE는 DATA선을 LOW로 유지하여 (신호선이 풀업상태라서 LOW로 유지된다면 ACK가 전송됐다ꂳ 판륨 볥다 ACK. ACK를 확인할수가 있다.

만약 MASTER가 전달하면 DATA를 SLAVE에서 놓치게 된다면??

MASTER는 전송하던 DATA를 무시하고 다시 STOP,START condition을 발생시켜야한다.

이는 ACK를 통해서 알수있는 SLAVE 쪽에서 주소값이 일치하지 않으면 SDA를 HIGH로 만들면 된다.

(이는 MASTER가 송신, SLAVE가 수신하는 경우를 예로 든것이다)

   

 

 

Объединение пакетов адреса и данных в передачу

 

* 출처: 유명환 강사님 자료

위 의 그림 은 데이터 송신 에 일련 것 의 과정 과정 을 을 의 으로 것 것 의것 자세한 소스는 맨아래의 "AVR STUDIO용 C언어 예제"소스라는 그림을 참조하길 바란다.

 

Обзор модуля TWI

Модуль TWI состоит из нескольких подмодулей, как показано на рис. 94. Все регистры, нарисованные жирной линией, доступны через шину данных AVR.

 

Контакты Scl и SDA

Эти контакты соединяют AVR TWI с остальной частью системы MCU. То выходные драйверы содержат ограничитель скорости нарастания для соответствия TWI Технические характеристики. Входные каскады содержат блок подавления пиков, удаляющий спайки короче 50 нс.Обратите внимание, что внутренние подтяжки в подушечках AVR могут можно включить, установив биты PORT, соответствующие

контакты SCL и SDA, как описано в разделе «Порт ввода-вывода». внутренний подтягивания могут в некоторых системах устранить необходимость во внешних.

 

Генератор битрейта

 

마스터모드에서 SCL의 주기를 조절할때 사용한다. 이는 TWBR레지스터를 통해서 설정할수가 있다.

Этот блок управляет периодом SCL при работе в ведущем режиме.То Период SCL управляется настройками в регистре скорости передачи данных TWI (TWBR) и биты предварительного делителя в регистре состояния TWI (TWSR). Ведомая операция не зависит от настроек Bit Rate или Prescaler, но тактовая частота CPU в раб должен быть как минимум в 16 раз выше

, чем частота SCL. Обратите внимание, что ведомые устройства могут продлить низкий период SCL, тем самым уменьшая средний период синхронизации шины TWI. Частота SCL генерируется по следующему уравнению:

 

 

• TWBR = значение регистра скорости передачи данных TWI

• TWPS = значение битов предварительного делителя в регистре состояния TWI

Примечание: TWBR должен быть равен 10 или выше, если TWI работает в режиме Master.Если ТВБР ниже 10, мастер может выдавать неверный вывод на SDA и SCL для напоминание о байте. Проблема возникает при работе TWI в Master режиме, отправляя Start + SLA  + R/W на ведомый (ведомый не должен быть подключен к шине для условия до

бывает).

 

 

 

 

 

Блок интерфейса шины

 

Этот блок содержит регистр сдвига данных и адреса (TWDR), START/STOP Аппаратное обеспечение контроллера и обнаружения арбитража.TWDR содержит адрес или байты данных, которые должны быть переданы, или адрес или полученные байты данных. В В дополнение к 8-битному TWDR, модуль интерфейса шины также содержит регистр содержащий бит (N)ACK для передачи или приема. Этот регистр (N)ACK прикладное программное обеспечение не имеет прямого доступа. Однако, когда приема, его можно установить или очистить, манипулируя регистром управления TWI. (ТВКР). В режиме передатчика значение принятого бита (N)ACK может быть определяется значением в TWSR.

 Контроллер СТАРТ/СТОП не работает. отвечает за генерацию и обнаружение СТАРТ, ПОВТОРНЫЙ СТАРТ и СТОП условия. Контроллер СТАРТ/СТОП способен обнаруживать СТАРТ и СТОП. условиях, даже когда микроконтроллер AVR находится в одном из спящих режимов, что позволяет микроконтроллеру просыпаться, если к нему обращается мастер.

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

 

Блок сопоставления адресов: НЕ требуется в ГЛАВНОМ РЕЖИМЕ

 

главный режим mutil

Блок Address Match проверяет, совпадают ли полученные байты адреса с 7-битным адрес в регистре адресов TWI (TWAR). Если TWI General Call Recognition Бит включения (TWGCE) в TWAR записывается в единицу, все биты входящего адреса также будет сравниваться с адресом общего вызова.При совпадении адресов Блок управления информируется,

, что позволяет предпринять правильные действия. TWI может подтвердить или не подтвердить его адрес, в зависимости от настроек в TWCR. Модуль Address Match может для сравнения адресов, даже когда MCU AVR находится в спящем режиме, что позволяет MCU просыпаться, если к нему обращается мастер. Если происходит другое прерывание (например, INT0) во время отключения питания TWI

совпадает с адресом и пробуждает ЦП, TWI прерывает работу и возвращается в исходное состояние. это состояние бездействия.Если это вызывает какие-либо проблемы, убедитесь, что TWI Address Match установлен. единственное разрешенное прерывание при входе в Power-down.

 

 

Блок управления

 

Блок управления контролирует шину TWI и формирует ответы соответствующие настройкам в регистре управления TWI (TWCR). Когда событие требующее внимания приложения происходит на шине TWI, TWI Установлен флаг прерывания (TWINT). В следующем такте статус TWI Регистр (TWSR) обновляется кодом состояния, идентифицирующим

.

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

, прежде чем разрешить продолжение передачи TWI. Флаг TWINT устанавливается в следующем ситуаций:

 

 

• После того, как TWI передал условие СТАРТ/ПОВТОРНЫЙ СТАРТ

• После того, как TWI передал SLA+R/W

• После того, как TWI передал адресный байт

• После проигрыша TWI в арбитраже

• После обращения к TWI по собственному подчиненному адресу или общему вызову

• После того, как TWI получил байт данных

• После получения команды STOP или REPEATED START, пока еще адресовано как раб

• При возникновении ошибки шины из-за недопустимого условия START или STOP

 

  

Описание регистра TWI

 

Если установлено, этот бит разрешает распознавание общего Вызов по двухпроводной последовательной шине

 

  

. Использование TWI

 

이부분은 인터럽트방식으로 TWI통신을 사용할때를 설명한것이다. 보통 인터럽트로 통신을 많이 사용하며, 앞서 설명한 부분들과 C언어예제들은 모두 폴링방식읝. 혼동하지 않길 바란다.

TWI AVR ориентирован на байты и основан на прерываниях. Прерывания выдаются после всех событий шины, таких как прием байта или передача START условие. Поскольку TWI основан на прерываниях, прикладное программное обеспечение является бесплатным. для выполнения других операций во время передачи байта TWI. Обратите внимание, что TWI Бит разрешения прерывания (TWIE) в TWCR вместе с

Бит разрешения глобального прерывания в SREG позволяет приложению должно ли утверждение флага TWINT генерировать прерывание запрос.Если бит TWIE сброшен, приложение должно опросить флаг TWINT. для обнаружения действий на шине TWI.

 Если установлен флаг TWINT, TWI завершил операцию и ожидает ответа приложения. В этом случае регистр состояния TWI (TWSR) содержит значение, указывающее текущий состояние шины TWI. После этого прикладное программное обеспечение может решить, как должен работать TWI. вести себя в следующем цикле шины TWI, манипулируя регистрами TWCR и TWDR.

 

На рис. 95 показан простой пример того, как приложение может взаимодействовать с Оборудование ТВИ.В этом примере мастер хочет передать один байт данных на раб. Это описание довольно абстрактно, более подробное объяснение следует далее в этом разделе. Простой пример кода, реализующий желаемое также представлено поведение.

  

1. Первым шагом в передаче TWI является передача условия START. Это делается путем записи определенного значения в TWCR, указывающего TWI оборудование для передачи условия СТАРТ. Какое значение записывать описано далее на.Однако важно, чтобы бит TWINT был установлен в записываемом значении. Запись единицы в TWINT снимает флаг. TWI не начнет какую-либо операцию, т.к. пока установлен бит TWINT в TWCR. Сразу после подачи заявки очищенный TWINT, TWI инициирует передачу условия START

 

2. Когда условие START было передано, флаг TWINT в TWCR установлен, и TWSR обновляется кодом состояния, указывающим, что START состояние успешно отправлено.

 

3. Теперь прикладное программное обеспечение должно проверить значение TWSR, чтобы сделать убедитесь, что условие СТАРТ было успешно передано. Если TWSR указывает в противном случае прикладное программное обеспечение может предпринять некоторые специальные действия, например вызов подпрограммы обработки ошибок. Предполагая, что код состояния соответствует ожидаемому, приложение должно загрузить SLA+W в TWDR. Помните, что TWDR используется как для адрес и данные. После того, как TWDR был загружен с желаемым SLA+W, значение должно быть записано в TWCR, предписывая аппаратному обеспечению TWI передать SLA+W присутствует в TWDR.Какое значение записывать, будет описано позже. Однако это важно, чтобы бит TWINT был установлен в записываемом значении. Написание одного для ТВИНТ очищает флаг. TWI не начнет никаких операций, пока Бит TWINT в TWCR установлен. Сразу после того, как приложение очистит TWINT, TWI инициирует передачу адресного пакета.

 

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

 

 

5. Теперь прикладное программное обеспечение должно проверять значение TWSR, чтобы убедитесь, что адресный пакет был успешно передан, и что значение бита ACK было, как и ожидалось. Если TWSR указывает иное, приложение программное обеспечение может предпринять некоторые специальные действия, например, вызвать программу обработки ошибок. Предполагая, что код состояния соответствует ожидаемому, приложение должно загрузить данные пакет в TWDR.Впоследствии в TWCR должно быть записано конкретное значение, указание аппаратному обеспечению TWI передать пакет данных, присутствующий в TWDR. Который значение для записи описано ниже. Однако важно, чтобы TWINT бит устанавливается в записанном значении. Запись единицы в TWINT снимает флаг. То TWI не начнет никаких операций, пока установлен бит TWINT в TWCR. Сразу же после того, как приложение очистит TWINT, TWI инициирует передача пакета данных.

 

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

 

7. Теперь прикладное программное обеспечение должно проверять значение TWSR, чтобы уверен, что пакет данных был

успешно передано, и что значение бита ACK было как ожидал. Если TWSR указывает иное, прикладному программному обеспечению может потребоваться некоторое время. специальное действие, например вызов подпрограммы обработки ошибок.Предположим, что код состояния как и ожидалось, приложение должно записать определенное значение в TWCR, оборудование TWI для передачи условия STOP. Какое значение писать описано позже. Однако важно, чтобы бит TWINT был установлен в значении написано. Запись единицы в TWINT снимает флаг. TWI не запускает никаких операций пока установлен бит TWINT в TWCR. Сразу после подачи заявки очищен TWINT, TWI инициирует передачу STOP

Состояние

.Обратите внимание, что TWINT НЕ устанавливается после выполнения условия STOP. послал.

 

 

Несмотря на то, что этот пример прост, он показывает принципы, лежащие в основе все передачи TWI.

 

Их можно резюмировать следующим образом:

• Когда TWI завершил операцию и ожидает ответа приложения, установлен флаг TWINT. На линии SCL устанавливается низкий уровень до тех пор, пока TWINT не будет очищен.

 

• Когда установлен флаг TWINT, пользователь должен обновить все регистры TWI с помощью значение, относящееся к следующему циклу шины TWI.Например, TWDR должен быть загружается значением, которое будет передано в следующем цикле шины.

 

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

Ниже приведена сборка и реализация примера на C.Обратите внимание, что в приведенном ниже коде предполагается, что для например, с помощью include-файлов.

 

  

 

Студия AVR 용 C언어 예제소스 

 

 

 

 

.

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

Ваш адрес email не будет опубликован.