Evgenii Legotckoi
Evgenii LegotckoiТам. 21, 2015, 9:30 Т.Қ.

AVR Atmega микроконтроллерлеріндегі TWI интерфейсі

Мен бірнеше жыл бұрын жасаған TWI интерфейсі бар аппараттық құралдағы біршама хардкорды есіме түсірдім. Кім не айтса да, Ассемблер сананы тазарту және алгоритмдер туралы түсінікті дамыту үшін тамаша. Assembler бағдарламасында AVR микроконтроллерлерімен жұмыс істеу барысында мен үйренген ең маңызды нәрсе - барлық операциялар, барлық директивалар, барлық функциялар нақты реттілікпен жазылуы керек. Ақыр соңында, егер сіз тізілімге деректерді қате ретпен жазсаңыз, онда контроллер микробағдарламасы мүлдем жұмыс істемейді. Бағдарлама кодын жоғары деңгейлі тілдерде жазғанда, кейде сіз функциялар мен әдістерді шақыру тізбегінде толық немқұрайлылықты көре аласыз, дегенмен кітапханаларға арналған нұсқауларды жиі оқуға болады, ол үшін сол немесе басқа функционалдылықты қандай ретпен инициализациялау керек. жұмыс істеу үшін бәрі. Бірақ оларды кім мұқият оқиды? Егер сіз, құрметті оқырман, осы абзацты оқып шықсаңыз және төменде келтірілген кітапхананың бағдарламалық кодын бірден көшіріп-қоймасаңыз.


TWI интерфейс

Схема ішіндегі интерфейстің бұл түрі 1980 жылдары Philips жасаған I2C интерфейсіне ұқсас. Бұл интерфейс Atmega микроконтроллерлері үшін аппараттық модуль ретінде пайдаланылады және басқа құрылғылар пайдаланатын I2C шинасымен жұмыс істеуді айтарлықтай жеңілдетеді. I2C атауынан басқа атау патенттік құқықтың нәтижесі болып табылады.

I2C шинасы сияқты, TWI интерфейсі де екі екі бағытты байланыс желісі арқылы жұмыс істейді: SDA (ағылшынша сериялық деректер) және SCL (ағылшынша сериялық сағат). Екі байланыс желісі де тізбекте резисторлар арқылы қуат көзіне тартылады, ол әдетте +5 және +3,3 вольтты құрайды. Классикалық нұсқадағы мекенжай кеңістігі 128 мекенжайды, кеңейтілген стандартты 1024 мекенжайды құрайды.

Интерфейс жұмысын құрайтын шинада мағыналы күйлердің төрт түрі бар:

  • БАСТАУ - SDA жолының күйін 1-ден 0-ге өзгерту, SCL күйін 1-де өзгерту
  • STOP - SDA сызығының күйін 0-ден 1-ге өзгерту, SCL күйін 1-ге өзгерту
  • Тасымалдау биті 1-ге тең - SDA 1 күйінде, SCL 0-1-0 күйін өзгертеді
  • Тасымалдау биті 0-ге тең - SDA 1 күйінде, SCL 0-1-0 күйін өзгертеді

SDA күйін SCL 1-ге тең өзгерту ешқандай рөл атқармайды және еленбейді.

TWI автобусы Master-Slave принципі бойынша жұмыс істейді. Хост бастапқы хабарды жібереді, содан кейін ол бір байтты ақпаратты жібере бастайды. Құл ақпаратты алғаннан кейін, ол растау битін жібереді. Деректерді тасымалдаудың соңы тоқтату хабарламасымен анықталады.

TWI интерфейсімен жұмыс істеуге арналған кітапхана

Бұл мақала Atmega48 , Atmega88 , Atmega168 , Atmega328 микроконтроллерлеріне арналған TWI интерфейсімен жұмыс істеуге арналған кітапхананы ұсынады. Кітапхананы TWI интерфейсі бар басқа Atmega микроконтроллерлерімен жұмыс істеу үшін де пайдалануға болады.

Назар аударыңыз. Әртүрлі үлгілердегі регистрлердің атаулары әртүрлі болуы мүмкін.

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

Назар аударыңыз. Сондай-ақ, кітапхана жұмыс істеуі үшін Микроконтроллер стекін инициализациялау қажет. Мысалы, келесідей:

 ;======= Макросы =========================================================================
 ; Макрос вывода в порт или регистр
 .macro outi             
        ldi r16, @1 
        out @0,R16
 .endm
 ;=========================================================================================
 RESET:
    outi    SPL,Low(RAMEND)    ; Инициализация стека
    outi    SPH,High(RAMEND)
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз