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 ;========================================================================================