Використання інтерфейсу USI для підключення периферії I2C до Attiny2313
Питання про заміну одного з елементів у схемі [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: Використання модуля USI як TWI Master, https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en590897
- PCF2129 Точний RTC з інтегрованим кварцовим кристалом для промислових застосувань , http://www.farnell.com/datasheets/1930046.pdf
- Робота з I2C і SPI на прикладі годинника реального часу PCA2129T, https://cxem.net/mc/mc188.php
Прикреплені файли:
- USI_TWI_PCF2129.zip (38 Кб)