USI - Universal Serial Interface ist eigentlich eine Hardware zum seriellen Senden und Empfangen von Daten. Diese Schnittstelle ist keine vorgefertigte Lösung für ein bestimmtes Datenübertragungsprotokoll, ermöglicht aber eine komfortablere Datenübertragung als bei einer reinen Softwarelösung.
Die Essenz dieser Schnittstelle besteht darin, dass sie eine Hardwareebene zum Senden und Empfangen von seriellen Informationen bietet und die Logik des Protokolls bereits der Softwareimplementierung zugeordnet ist.
Beschreibung der USI-Register
Diese Schnittstelle enthält nur vier Register, die für ihren Betrieb verantwortlich sind:
- USIDR - Datenregister
- USIBR - Datenpufferregister
- USISR - Schnittstellenstatusregister
- USICR - Register der Steuerungs- und Schnittstelleneinstellungen
USIDR - USI-Datenregister
Auf Daten aus diesem Register kann direkt zugegriffen werden, während eine Kopie der Daten im Register USIBR zu finden ist. Dieses Register wird gleichzeitig zum Empfangen und Übertragen von Informationen verwendet.
USIBR – USI-Datenpuffer
Dieses Register ist schreibgeschützt, im Gegensatz zu USIDR In dieses Register werden Daten kopiert, die in das USIDR Register fallen, wenn Informationen von außen empfangen werden. Auf diese Weise können Sie den Informationsverlust durch eine erhöhte Belastung des Systems zum Empfangen und Übertragen von Informationen minimieren und dem Prozessor des Mikrocontrollers Zeit geben, die vorherigen Aufgaben zu erledigen, mit denen er beschäftigt ist.
USISR – USI-Statusregister
Das USI-Schnittstellenstatusregister enthält Unterbrechungsflags, Datenleitungsstatusflags und einen Zähler, der die Anzahl der Bits zählt, die an die Datenleitung übertragen werden müssen.
- Bit 7 - USISIF : Startbedingungs-Interrupt-Flag - Flag zum Bestimmen der Startnachricht. Wird im Zweidrahtmodus verwendet. Durch das Schreiben eines gelöscht.
- Bit 6 - USIOIF : Zählerüberlauf-Unterbrechungsflag - Zählerüberlauf-Unterbrechungsflag. Dieses Flag wird gesetzt, wenn alle Bits auf die Datenleitung übertragen wurden. Durch das Schreiben eines gelöscht.
- Bit 5 - USIPF: Stop Condition Flag - Flag zur Bestimmung der Stoppbedingung, die auch im Zweidrahtmodus verwendet wird. Interessanterweise ist dieses Flag kein Interrupt-Flag. Durch das Schreiben eines gelöscht.
- Bit 4 - USIDC : Datenausgangskollision - Dieses Bit wird verwendet, wenn der Master im Zweidrahtmodus arbitriert wird.
- Bits 3: 0 - USICNT3: 0 : Zählerwert - Zählerbits. Der Zähler nimmt einen Wert von 0 bis 15 an, um 8 Bit zu übertragen. Der Zähler kann durch einen externen Einfluss, durch einen Timer oder durch einen Programmschalter inkrementiert werden, nämlich durch Setzen des USITC Bits im USICR Register. Was wird in diesem Artikel verwendet.
USICR – USI-Kontrollregister
Das Steuer- und Einstellungsregister enthält die Bits zum Aktivieren des Interrupts, Einstellen des Betriebsmodus, Auswählen der Quelle des Zählerstrobes für die Datenübertragung.
- Bit 7 - USISIE : Startbedingungs-Interrupt-Freigabe - Aktiviert die Unterbrechung durch Startnachricht.
- Bit 6 - USIOIE : Zählerüberlaufunterbrechung aktivieren - Aktiviert Zählerüberlaufunterbrechung.
- Bit 5: 4 - USIWM1, USIWM0 : Drahtmodus - Einstellen des Datenübertragungsmodus.
- Bit 3: 2 - USICS1, USICS0 : Taktquellenauswahl - Einstellungsbits der Zähler-Strobe-Quelle.
- Bit 1 - USICLK : Clock Strobe - Strobe-Signalbit zum Verschieben von Daten in die Kommunikationsleitung.
- Bit 0 - USITC : Toggle Clock Port Pin - Wenn dieses Bit auf 1 gesetzt ist, ändert sich der Zustand des ausgewählten Pins von 0 auf 1 oder von 1 auf 0 (was im Zweidrahtmodus wie ein SCL funktioniert). Linie).
Arbeiten mit der USI-Schnittstelle
In diesem Artikel wird eine Option zum Übertragen eines Informationsbytes an ein Zielgerät vorgestellt. Das Informationsbit wird weitergeschaltet, wenn sich der Zustand der SCL-Leitung von 0 auf 1 ändert. Die Schnittstelle selbst arbeitet im Zweidrahtbetrieb. Die Daten werden über die SDA-Leitung übertragen. Da der Zähler mit jeder Einstellung des USITC-Bits inkrementiert wird, ist es zur Übertragung von 8 Informationsbits erforderlich, das USITC-Bit 16-mal zu setzen, da die folgende Einstellung eine Option zeigt, bei der das Bit auf die Datenleitung übertragen wird nur wenn sich der Leitungszustand von 0 auf 1 ändert.
;======= Процедура инициализации 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 ;========================================================================================