Вопрос о замене одного из элементов в схеме [1] на более дешёвый и распространённый подсказал идею подключения периферии I2C к широко используемым микроконтроллерам Attiny2313, не имеющим такого интерфейса. Поскольку поиск готовых решений ничего не дал, кроме аппноты AVR310, то наиболее очевидным стало пойти по пути адаптирования этого решения к подключению часов RTC с интерфейсом I2C.
Представленная на рис. схема была реализована на беспаечной макетной плате. Микросхема RTC PCF2129AT, одна из наиболее интересных, на мой взгляд - была подключена через переходник SOIC-DIP. Ввод-вывод данных осуществлялся через интерфейс UART посредством распространённой платы на базе FTDI FT232RL, которую также можно использовать и в качестве bitbang-программатора. Светодиод необязателен, но весьма полезен при отладке, т.к. его мигание с частотой 1Гц будет говорить о том, что инициализация RTC прошла успешно.
Изменения в исходных файлах библиотеки "исходников" из App. Note AVR310 [2] минимальны: заголовок дополнен определениями для МК Attiny2313A и 4313 и определение частоты МК для функции задержки.
В AVR310 интерфейс I2C реализован «поверх» USI с программными дополнениями для старт-стоп последовательностей путём программного управления выводами SCA и SCL с соответствующими задержками, переназначения SDA с входа на выход, программного формирования очереди данных для передачи через интерфейс USI и собственно передачи сформированной последовательности или приёма данных. Приём и передача данных реализованы в универсальной функции USI_TWI_Start_Transceiver_With_Data(), причём, в общем случае они являются пакетными (bulk read/write). Чем я и воспользовался, благо, многие RTC это позволяют. Как это реализовано в данном случае, см. [3], с.6.
Ключевой момент работы интерфейса – подготовка данных для USI_TWI_Start_Transceiver_With_Data(). Начальным (0-вым) элементом очереди является адрес устройства на шине I2C. Адрес берётся «как есть», сдвигать его на 1 бит влево для освобождения младшего бита для атрибута чтения/записи, как это сделано в оригинальном примере использования [2], не нужно. Младший бит в адресе у нас уже свободен. Для операции записи этот бит должен быть сброшен, для чтения – установлен. В операции записи данных следующий элемент очереди — адрес регистра устройства, куда (откуда) будет осуществляться запись (или последующее чтение). Далее следует «полезная нагрузка» — байт данных, который необходимо передать. При чтении получаемые данные записываются, начиная с 1-го байта, следующего за адресом устройства, который остаётся неизменным и может использоваться для последующих операций.
Работа с RTC PCF2129AT строится следующим образом
Инициализация при включении. Состоит из 2-х этапов: запись 0 в регистр CLKOUT (0x0F), небольшой задержки и инициализации этого регистра значением, устанавливающим интервал измерения температуры, установкой бита OTP, который вызывает принудительное применение калибровочных параметров RTC, а также частоты на выводе CLKOUT, которая в моём примере выбрана 1Гц.
Установка времени. После получения всех 6 значений (дата и время) по UART и приведения их к формату BCD, данные записываются в RTC в 2 этапа: 4 значения, секунды, минуты, часы и день месяца — с адреса регистра секунд (0x03), и затем месяц и год — с адреса регистра месяцев (0x08). Таким образом, пропускается номер дня недели, который в данном примере не используется.
Получение данных. Операцией записи 2-х байт в RTC передаётся адрес регистра секунд, с которого будет осуществляться последующее чтение, затем устанавливается бит чтения в адресе устройства и USI_TWI_Start_Transceiver_With_Data() вызывается на чтение 8 байт данных. После разбора полученных данных, они выводятся в UART.
Строковые константы «убраны» во flash и читаются непосредственно оттуда (функция prtstr_P()), что несколько загромождает пример монструозными декларациями. Но, так это реализовано в AVR GCC. А иначе, эти константы переполнят оперативную память Attiny 2313 и прошивки не получится.
Аналогичным образом можно использовать данный метод и с другими RTC, такими, как DS1307, DS3231, DS3232,PCF8583, поменяв соотв. адреса согласно их даташитам.
Также хотел бы отметить выгодные отличия PCF2129 от других, с которыми приходилось иметь дело.
- Наличие контроля разряда батарейки
- Наличие функции timestamp — запоминание времени от внешнего прерывания.
- Наличие интерфейса SPI.
Недостаток — малая распространённость, в отличие от тех же DS3231.
Более детально про эту RTC с разными вариантами библиотек можно посмотреть в [4]. Там же указаны и адреса SPI для чтения/записи, которые отсутствуют в [3].
Порядок работы.
- После включения питания и подключения консоли (по UART), нажатие клавиши пробела выведет текущие дату и время в формате DD/MM/20YY HH/mm/SS.
- Клавишей S переходим к режиму ввода даты и времени, в том же порядке. Корректность введённых данных не проверяется. Ввод данных можно прервать в любой момент нажатием C.
Преимущества данного метода.
Очевидно, что он даёт возможность использования периферии I2C с микроконтроллерами, имеющими только USI, при достаточно компактном коде.
О недостатках.
- Как и в аппаратных реализациях I2C, выводы SDA и SCL не переназначаемы.
- USI, как это следует из даташита на Attiny2313, не является полноценной заменой I2C, т.к. в нём не предусмотрены ограничение скорости нарастания (slew rate limiting) сигнала на выводах и фильтрация шумов на входах (noise filtering).
Таким образом, данный метод предоставляет возможность использования периферии I2C с микроконтроллерами с USI, но при условии, что данные устройства не будут подвержены влиянию помех, способных повлиять на процесс обмена данными.
Проект в формате Atmel Studio 7.0 прилагается.
Фьюзы L:E4, H:DB, E:FF.
Ссылки:
- ”Часы/календарь на МК ATTiny2313 и RTC DS1305”, https://cxem.net/mc/mc93.php
- AVR310: Using the USI module as a TWI Master, https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en590897
- PCF2129 Accurate RTC with integrated quartz crystal for industrial applications , http://www.farnell.com/datasheets/1930046.pdf
- Работа с I2C и SPI на примере часов реального времени PCA2129T, https://cxem.net/mc/mc188.php
Прикрепленные файлы:
- USI_TWI_PCF2129.zip (38 Кб)
Комментарии (7) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
[Автор]
В данном случае, цель статьи - показать пример реализации I2C через USI интерфейс. RTC это просто какая-то периферия, в данном случае. Точно так же "прикрутил" EEPROMку по I2C к Attiny.
С STM не работаю (пока). посмотрел по диагонали - это совершенно другого класса устройство. Моя статья для него конечно неактуальна.
[Автор]