Evgenii Legotckoi
27 серпня 2015 р. 07: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
 ;========================================================================================

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

Коментарі

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