Evgenii Legotckoi
Там. 22, 2015, 7: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 микроконтроллерлерімен жұмыс істеу үшін де пайдалануға болады.

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

  1. /*
  2. * i2c\_lib.asm
  3. *
  4. * Библиотека процедур для шины i2c (Atmega48)
  5. * Библиотека предназначена для использования в качестве подключаемого модуля
  6. * к другим проектам.
  7. *
  8. * Библиотека работает с интерфейсом TWI в avr микроконтроллерах
  9. *
  10. * Библиотека работает с регистром r16
  11. *
  12. * Created: 15.07.2013 23:51:32
  13. * Author: Евгений Легоцкой
  14. */
  15.  
  16. ;======= Стартовая посылка по шине i2c =================================================
  17. i2c\_start:
  18. push r16
  19. ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ; Выполняем посылку стартовой комбинации
  20. sts TWCR,r16 ; Посылаем полученный байт в TWCR
  21. rcall i2c\_wait ; Ожидание формирования start в блоке TWI
  22. pop r16 ; Возвращаем данные в r16 из стека
  23. ret
  24. ;======= Стоповая посылка по шине i2c ==================================================
  25. i2c\_stop:
  26. push r16
  27. ldi r16,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) ; Отправляем стоповую посылку
  28. sts TWCR,r16 ; Посылаем полученный байт в TWCR
  29. pop r16 ; Возвращаем данные в r16 из стека
  30. ret
  31. ;======= Посылка байта информации по шине i2c ==========================================
  32. i2c\_send:
  33. push r16
  34. sts TWDR,r16 ; Записываем передаваемый байт в регистр TWDR
  35. ldi r16,(1<<TWINT)|(1<<TWEN) ; Формируем байт, отвечающий
  36. ; за пересылку информационного байта
  37. sts TWCR,r16 ; Посылаем полученный байт в TWCR
  38. rcall i2c\_wait ; Ожидание окончания пересылки байта
  39. pop r16 ; Возвращаем данные в r16 из стека
  40. ret
  41. ;======= Приём информационного байта по шине i2c =======================================
  42. i2c\_receive:
  43. ; Принятый байт помещается в регистр r16, поэтому рекомендуется
  44. ; продумать программу так, чтобы в этот момент в нём не было
  45. ; важной информации, байт не сохраняется в стеке в коде данной
  46. ; процедуры
  47. ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWEA) ; Формируем байт, отвечающий за прием
  48. sts TWCR,r16 ; Посылаем полученный байт в TWCR
  49. rcall i2c\_wait ; Ожидание окончания приёма байта
  50. lds r16,TWDR ; Считываем полученную информацию из TWDR
  51. ret
  52. ;======= Приём последнего байта (NACK) =================================================
  53. i2c\_receive\_last:
  54. ; Принятый байт помещается в регистр r16, поэтому рекомендуется
  55. ; продумать программу так, чтобы в этот момент в нём не было
  56. ; важной информации, байт не сохраняется в стеке в коде данной
  57. ; процедуры
  58. ldi r16,(1<<TWINT)|(1<<TWEN) ; Формируем байт, отвечающий за прием информационного байта
  59. sts TWCR,r16 ; Посылаем полученный байт в TWCR
  60. rcall i2c\_wait ; Ожидание окончания приёма байта
  61. lds r16,TWDR ; Считываем полученную информацию из TWDR
  62. ret
  63. ;======= Ожидание готовности TWI =======================================================
  64. i2c\_wait:
  65. lds r16,TWCR ; Загружаем значение из TWCR в r16
  66. sbrs r16,TWINT ; Функция ожидания выполняется до тех пор, пока поднят флаг
  67. ; прерывания в 1
  68. rjmp i2c\_wait
  69. ret
  70. ;=======================================================================================

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

  1. ;======= Макросы =========================================================================
  2. ; Макрос вывода в порт или регистр
  3. .macro outi
  4. ldi r16, @1
  5. out @0,R16
  6. .endm
  7. ;=========================================================================================
  8. RESET:
  9. outi SPL,Low(RAMEND) ; Инициализация стека
  10. outi SPH,High(RAMEND)

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

Пікірлер

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