Evgenii Legotckoi
Evgenii Legotckoi26 серпня 2015 р. 21:00

USI в Attiny24 - налаштування двопровідного режиму

USI - Universal Serial Interface (Універсальний послідовний інтерфейс) є фактично заготівлею для апаратних послідовних передачі та прийому даних. Даний інтерфейс не є готовим рішенням для якогось певного протоколу передачі даних, але дозволяє реалізувати більш зручний спосіб передачі даних, ніж у випадку з програмним рішенням.

Суть даного інтерфейсу у тому, що він пропонує апаратний рівень передачі та прийому послідовної інформації, а логіка роботи протоколу вже доручається програмну реалізацію.


Опис регістрів інтерфейсу USI

Цей інтерфейс містить всього чотири регістри, які відповідають за його роботу:

  • USIDR - Реєстр даних
  • USIBR - Реєстр для буферизації даних
  • USISR - Реєстр статусу інтерфейсу
  • USICR - Реєстр контролю та налаштування інтерфейсу

USIDR - Реєстр даних USI

Дані цього регістру доступні безпосередньо, при цьому копія даних може бути знайдена регістрі USIBR . Цей регістр використовується одночасно для прийому та передачі інформації.

USIBR – буфер даних USI

Даний регістр доступний тільки для читання, на відміну від USIDR. У даному регістрі копіюються дані, які потрапляють у регістр USIDR при отриманні інформації ззовні. Це дозволяє мінімізувати втрати інформації при підвищеному навантаженні на систему прийому та передачі інформації, а також дати час процесору мікроконтролера встигнути виконати попередні завдання, якими він зайнятий.

USISR – Реєстр статусу USI

Регістр статусу інтерфейсу USI містить прапори переривань, прапори статусу ліній передачі даних, а також лічильник, який відраховує кількість бітів, які необхідно передати до лінії передачі даних.

  • Біт 7 - USISIF : Start Condition Interrupt Flag - Прапор визначення стартової посилки. Використовується як Two-wire. Очищується записом одиниці.
  • Біт 6 - USIOIF : Counter Overflow Interrupt Flag - Прапор переривання з переповнення лічильника. Цей прапор піднімається тоді, коли всі біти передані до лінії передачі. Очищується записом одиниці.
  • Біт 5 - USIPF: Stop Condition Flag - Прапор визначення стопою посилки, який також використовується в режимі Two-Wire. Примітно, що цей прапор не є прапором переривання. Очищується записом одиниці.
  • Біт 4 - USIDC : Data Output Collision - Даний біт використовується при арбітражі ведучого в режимі Two-wire.
  • Біти 3:0 - USICNT3:0 : Counter Value - Біти лічильника. Лічильник приймається від 0 до 15 для передачі 8 біт. Лічильник може інкрементуватися за зовнішнім впливом, таймером або програмним перемикачем, а саме установкою біта USITC у регістрі USICR . Що використовується у цій статті.

USICR – Регістр керування USI

Регістр контролю та налаштування, включає біти включення переривання, установки режиму роботи, вибір джерела стробування лічильника для передачі даних.

  • Біт 7 - USISIE : Start Condition Interrupt Enable - включення переривання по стартовій посилці.
  • Біт 6 - USIOIE : Counter Overflow Interrupt Enable - включення переривання з переповнення лічильника.
  • Біт 5:4 - USIWM1, USIWM0 : Wire Mode - налаштування режиму передачі даних.
  • Біт 3:2 - USICS1, USICS0 : Clock Source Select - Біти установки джерела стробування лічильника.
  • Біт 1 - USICLK : Clock Strobe - Біт стробуючого сигналу для просування даних у лінію зв'язку.
  • Біт 0 - USITC : Toggle Clock Port Pin - При установці цього біта в одиницю відбувається зміна стану вибраного піна з 0 на 1 або з 1 на 0 (який в режимі Two-Wire працює як лінія SCL).

Робота з інтерфейсом USI

У цій статті наведено варіант передачі байта інформації в цільовий пристрій. Просування біта інформації здійснюється за зміни стану лінії SCL з 0 на 1. Сам інтерфейс працює в режимі Two-Wire. Дані передаються лінією SDA. Враховуючи, що лічильник інкрементується при кожній установці біта USITC, для передачі 8-ми біт інформації потрібно 16 разів встановити біт USITC, оскільки в налаштуванні нижче наведений варіант, при якому біт передається в лінію даних лише при зміні стану лінії з 0 на 1.

;======= Процедура инициализации USI в режиме TWO-wire mode =============================
 usi_init:
     sbi    PORTA,4       ; Устанавливаем в исходное состояние PORT SCL
     sbi    PORTA,6       ; Устанавливаем в исходное состояние PORT SDA
     sbi    DDRA,4        ; Устанавливаем в исходное состояние DDR SCL
     sbi    DDRA,6        ; Устанавливаем в исходное состояние DDR SDA
     ldi    r16,0xFF
     out    USIDR,r16
     ldi    r16,(0<<USISIE)|(0<<USIOIE)|(1<<USIWM1)|(0<<USIWM0)|(1<<USICS1)|(0<<USICS0)|(1<<USICLK)|(0<<USITC)  
                ; (0<<USISIE)|(0<<USIOIE) Запрещаем прерывания по счетчику и СТАРТу
                ; (1<<USIWM1)|(0<<USIWM0) Устанавливаем двухпроводной режим работы
                ; (1<<USICS1)|(0<<USICS0)|(1<<USICLK) настройка режима работы счетчика
                ; бит передаётся по смене состояния линии SCL с 0 до 1
                ; (0<<USITC) исходное состояние выхода тактового сигнала
     out    USICR,r16       ; Посылаем полученный байт в USICR
     ldi    r16,(1<<USISIF)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|(0x0<<USICNT0) ; Очистка флагов и обнуляем счетчик
     out    USISR,r16       ; Посылаем полученный байт в USISR
     ret
 ;======= Посылка байта информации через интерфейс USI ===================================
 usi_send:
     out    USIDR,r16       ; Загружаем данные в USIDR
     ldi    r16,0xF0        ; Установка счетчика USISR для передачи 8 бит информации
     out    USISR,r16       ; Посылаем полученный байт в USISR
     ldi    r16,(0<<USISIE)|(0<<USIOIE)|(1<<USIWM1)|(0<<USIWM0)|(1<<USICS1)|(0<<USICS0)|(1<<USICLK)|(1<<USITC)  
                ; (0<<USISIE)|(0<<USIOIE) Запрещаем прерывания по счетчику и СТАРТу
                ; (1<<USIWM1)|(0<<USIWM0) Устанавливаем двухпроводной режим работы
                ; (1<<USICS1)|(0<<USICS0)|(1<<USICLK) настройка режима работы счетчика
                ; (1<<USITC) исходное состояние выхода тактового сигнала
 transfer:
     out    USICR,r16       ; Посылаем полученный байт в USICR
     out    USICR,r16       ; Посылаем полученный байт в USICR
     in     r17,USISR
     sbrs   r17,6
     rjmp   transfer
     ldi    r16,(1<<USISIF)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|(0x0<<USICNT0) ; Очистка флагов
     out    USISR,r16       ; Посылаем полученный байт в USISR
     ret
 ;========================================================================================
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах