Evgenii Legotckoi
Evgenii Legotckoi21. August 2015 21:30

TWI-Schnittstelle in Mikrocontrollern AVR Atmega

Erinnerte mich an ein bisschen Hardcore in Hardware mit einer TWI -Schnittstelle, was ich vor ein paar Jahren gemacht habe. Wer auch immer etwas sagt, Assembler ist großartig, um den Kopf freizubekommen und ein Verständnis für Algorithmen zu entwickeln. Das Wichtigste, was ich bei der Arbeit mit AVR -Mikrocontrollern auf Assembler gelernt habe, ist, dass alle Operationen, alle Anweisungen, alle Funktionen in einer klaren Reihenfolge geschrieben werden müssen. Wenn Sie Daten in der falschen Reihenfolge in das Register schreiben, funktioniert Ihre Controller-Firmware überhaupt nicht. Und beim Schreiben von Programmcode in Hochsprachen sieht man manchmal eine völlige Gleichgültigkeit in der Reihenfolge der Aufrufe von Funktionen und Methoden, obwohl man oft in den Anleitungen der Bibliotheken nachlesen kann, in welcher Reihenfolge das eine oder andere Funktional initialisiert werden muss, damit alles zu arbeiten. Aber wer würde sie sorgfältig lesen? Es ist gut, wenn Sie, lieber Leser, diesen Absatz gelesen und nicht gleich den unten aufgeführten Bibliotheksprogrammcode kopiert und eingefügt haben.


TWI-Schnittstelle

Diese Art der In-Circuit-Schnittstelle ist analog zur I2C -Schnittstelle, die in den 1980er Jahren von Philips entwickelt wurde. Diese Schnittstelle wird als Hardware-Modul von Atmega -Mikrocontrollern verwendet und erleichtert die Arbeit mit dem I2C -Bus, über den andere Geräte arbeiten, erheblich. Ein anderer Name als I2C ist das Ergebnis des Einflusses von Patentgesetzen.

Wie der I2C -Bus arbeitet auch die TWI -Schnittstelle über zwei bidirektionale Kommunikationsleitungen: SDA (Serial DAta) und SCL (Serial CLock). Beide Kommunikationsleitungen werden im Stromkreis durch Widerstände zur Stromversorgung hochgezogen, die normalerweise +5 und +3,3 Volt beträgt. Der Adressraum beträgt in der klassischen Version 128 Adressen, im erweiterten Standard 1024 Adressen.

Es gibt vier Arten von signifikanten Zuständen auf dem Bus, die den Betrieb der Schnittstelle ausmachen:

  • START - Änderung des Zustands der SDA-Leitung von 1 auf 0, bei unverändertem Zustand von SCL auf 1
  • STOP - Änderung des Zustands der SDA-Leitung von 0 auf 1, bei unverändertem Zustand von SCL auf 1
  • Sendebit gleich 1 - SDA im Zustand 1, SCL ändert den Zustand 0-1-0
  • Sendebit gleich 0 - SDA im Zustand 1, SCL ändert den Zustand 0-1-0

SDA-Zustandsänderung mit SCL gleich 1 spielt keine Rolle und wird ignoriert.

Der TWI -Bus arbeitet nach dem Master-Follower-Prinzip. Der Präsentator sendet eine Startnachricht, wonach die Übertragung des Informationsbytes beginnt. Sobald der Slave die Information erhalten hat, sendet er ein Bestätigungsbit. Das Ende der Datenübertragung wird durch eine Stoppnachricht bestimmt.

Bibliothek zum Arbeiten mit der TWI-Schnittstelle

Dieser Artikel stellt eine Bibliothek zum Arbeiten mit der TWI -Schnittstelle vor, die für Mikrocontroller entwickelt wurde Atmega48 , Atmega88 , Atmega168 , Atmega328 . Außerdem kann die Bibliothek verwendet werden, um mit anderen Atmega-Mikrocontrollern zu arbeiten, die über eine TWI-Schnittstelle verfügen.

Aufmerksamkeit. Die Registernamen können sich von Modell zu Modell unterscheiden.

/*
 * i2c_lib.asm
 *
 * Библиотека процедур для шины i2c (Atmega48)
 * Библиотека предназначена для использования в качестве подключаемого модуля 
 * к другим проектам. 
 *
 * Библиотека работает с интерфейсом TWI в avr микроконтроллерах
 *
 * Библиотека работает с регистром r16
 *
 *  Created: 15.07.2013 23:51:32
 *   Author: Евгений Легоцкой
 */ 

 ;======= Стартовая посылка по шине i2c =================================================
 i2c_start:
    push    r16                 
    ldi     r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)  ; Выполняем посылку стартовой комбинации
    sts     TWCR,r16      ; Посылаем полученный байт в TWCR
    rcall   i2c_wait      ; Ожидание формирования start в блоке TWI
    pop     r16           ; Возвращаем данные в r16 из стека
        ret
 ;======= Стоповая посылка по шине i2c ==================================================
 i2c_stop:
    push    r16                 
    ldi     r16,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)  ; Отправляем стоповую посылку
    sts     TWCR,r16      ; Посылаем полученный байт в TWCR
    pop     r16           ; Возвращаем данные в r16 из стека
    ret
 ;======= Посылка байта информации по шине i2c ==========================================
 i2c_send:
    push    r16                 
    sts     TWDR,r16      ; Записываем передаваемый байт в регистр TWDR
    ldi     r16,(1<<TWINT)|(1<<TWEN)  ; Формируем байт, отвечающий 
                                      ; за пересылку информационного байта
    sts     TWCR,r16      ; Посылаем полученный байт в TWCR
    rcall   i2c_wait      ; Ожидание окончания пересылки байта
    pop     r16           ; Возвращаем данные в r16 из стека
    ret
 ;======= Приём информационного байта по шине i2c =======================================
 i2c_receive:
 ; Принятый байт помещается в регистр r16, поэтому рекомендуется    
 ; продумать программу так, чтобы в этот момент в нём не было 
 ; важной информации, байт не сохраняется в стеке в коде данной 
 ; процедуры
    ldi     r16,(1<<TWINT)|(1<<TWEN)|(1<<TWEA)  ; Формируем байт, отвечающий за прием 
    sts     TWCR,r16      ; Посылаем полученный байт в TWCR
    rcall   i2c_wait      ; Ожидание окончания приёма байта
    lds     r16,TWDR      ; Считываем полученную информацию из TWDR
    ret
 ;======= Приём последнего байта (NACK) =================================================
 i2c_receive_last:
 ; Принятый байт помещается в регистр r16, поэтому рекомендуется    
 ; продумать программу так, чтобы в этот момент в нём не было 
 ; важной информации, байт не сохраняется в стеке в коде данной 
 ; процедуры
    ldi     r16,(1<<TWINT)|(1<<TWEN) ; Формируем байт, отвечающий за прием информационного байта
    sts     TWCR,r16      ; Посылаем полученный байт в TWCR
    rcall   i2c_wait      ; Ожидание окончания приёма байта
    lds     r16,TWDR      ; Считываем полученную информацию из TWDR
    ret
 ;======= Ожидание готовности TWI =======================================================
 i2c_wait:
    lds     r16,TWCR      ; Загружаем значение из TWCR в r16
    sbrs    r16,TWINT     ; Функция ожидания выполняется до тех пор, пока поднят флаг 
                          ; прерывания в 1
    rjmp    i2c_wait
    ret
 ;=======================================================================================

*Aufmerksamkeit. Damit die Bibliothek funktioniert, müssen Sie außerdem den Mikrocontroller-Stack initialisieren. Zum Beispiel wie folgt: *

 ;======= Макросы =========================================================================
 ; Макрос вывода в порт или регистр
 .macro outi             
        ldi r16, @1 
        out @0,R16
 .endm
 ;=========================================================================================
 RESET:
    outi    SPL,Low(RAMEND)    ; Инициализация стека
    outi    SPH,High(RAMEND)
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken