Аппаратная и программная поддержка I2C

Тема в разделе "Arduino & Shields", создана пользователем alex_kart, 14 май 2015.

  1. alex_kart

    alex_kart Нуб

    В спецификации к arduino nano написано что только выводы A4/A5 аппаратно поддерживают работу с устройствами по I2C протоколу.
    Попробовал подключить 4х цифровой индикатор на TM1637 через данный интерфейс, так вот в либе для работы с ним можно использовать любые 2 пина. И действительно, все работает при указании любых двух выводов, а не только А4/А5, причем выводы не требуется при этом подтягивать к 5V как указано в спецификации I2C (ну это видимо потому что они и так подтягиваются встроенными резисторами)
    Правильно ли я понимаю - в данном случае библиотека реализует программную поддержку протокола I2C, т.е комбинируя уровни сигналов на линиях SDA, SLC делает СТАРТ, затем передает номер устройства, затем передает данные, затем делает СТОП и т.д.? Т.е даже если бы Atmega поддерживала только pinMode можно было бы таким образом эмулировать данный протокол?

    В случае с аппаратной поддержкой вместо установки уровней вручную на SDA /SLC процессору посылаются готовые команды типа "начать передачу", "выбрать устройство", "послать данные", и он сам устанавливает нужные уровни сигналов на соотв. выводах ?
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Все правильно. Посмотрите на код функции TM1637Display::writeByte, там как раз и теребятся пины для формирования сигналов интерфейса. Программно можно сделать и SPI, и serial, и все остальное. Разница только в количестве времени, требуемого для выполнения пересылки. В случае аппаратного интерфейса можно запустить передачу и продолжать выполнять другие задачи, а об окончании передачи можно узнать по прерыванию либо периодически проверяя флаги в статусном регистре. В случае же программного формирования сигналов контроллер занят в течение всей пересылки и других действий в это время выполнять не может.