Альтернативы библиотеке Wire для I2C

Я ищу (достаточно простые в использовании и хорошо протестированные) альтернативы библиотеке Wire. Wire работает очень хорошо, но: мне нужно, чтобы Arduino выступала в качестве мастера I2C, а библиотека Wire кажется пустой тратой ресурсов:

Моей целью является отправка данных единым блоком (например, 32 или 64 байта). Эти данные уже находятся в массиве в SRAM. Теперь, когда вы используете библиотеку Wire, вы вызываете функцию TwoWire::write, которая копирует ваши данные во второй буфер. После этого Wire использует библиотеку TWI, где twi_writeTo снова копирует данные в третий буфер. Это немного неуклюже, не так ли?

Я видел DSSCircuits/I2C-Master-Library, но не уверен, насколько она зрелая, потому что не было никаких коммитов после первоначального коммита, которому уже 3 года.

, 👍7

Обсуждение

У вас действительно есть проблемы с использованием оперативной памяти? Оптимизация чего-либо до того, как это станет проблемой, часто оказывается напрасной тратой усилий., @BrettAM

Все сводится к вопросу о желании заставить его работать *скорее* и/или *переносимо* против желания заставить его работать *оптимально*. Вы, конечно, можете получить руководство программиста ATmega и самостоятельно писать в периферийные регистры., @Chris Stratton

На веб-странице dsscircuits [основная библиотека Arduino I2C](http://www.dsscircuits.com/articles/86-articles/66-arduino-i2c-master-library) показаны пять версий библиотеки I2C, для которых предназначена ваша ссылка на github. Вероятно, это хорошая отправная точка для изменений, которые вы имеете в виду. Если в Wire были внесены исправления с января 2012 года, вам может потребоваться добавить их в I2C., @James Waldby - jwpat7

> Альтернативы библиотеке Wire для I2C пишите свои. i2c — один из самых простых протоколов для написания с нуля., @dannyf


5 ответов


4

Я не вижу возражений против использования мастер-библиотеки DSS Circuits I2C.

Возможно, он не обновлялся пару лет, но если он работает, в этом нет необходимости. Библиотеки для микроконтроллеров не должны поддерживать новые драйверы принтеров, видеодрайверы и т. д.

Если это работает, то работает.

Чип не изменился, и единственная реальная причина для обновлений в наши дни — это изменение IDE (или компилятора) таким образом, что возникают ошибки компиляции. Такие вещи произошли совсем недавно, например, в таких вещах, как PROGMEM, с более жесткими правилами.

,

Эта библиотека выглядела очень многообещающе, но обратите внимание, что она поддерживает только цели AVR. Поскольку ядра Arduino были разработаны для различных архитектур, эта библиотека не будет «просто работать» для любой платы, совместимой с Arduino. Например, он **не** совместим с Feather на базе Adafruit STM32F405., @ardnew


3

Cosa TWI - это совершенно другой подход к поддержке драйверов устройств I2C. Он вообще не использует дополнительную SRAM для буферов. Если драйвер устройства не блокирует, он должен обрабатывать необходимую буферизацию. Также класс Cosa TWI поддерживает типичное взаимодействие с устройствами I2C, такими как ведущий/ведомый, шаблоны «запись регистра-чтения данных» и транзакции при использовании многопоточности.

Доступна программно-аппаратная библиотека Arduino-TWI. Он использует библиотеку Arduino-GPIO и может использоваться на платах на основе AVR и SAM.

Некоторые примеры: сканер TWI, Часы/календарь реального времени DS3231, ЖК-адаптер I2C с PCF8574.

,

4

Также стоит проверить библиотеку Procyon AVR. Это немного устарело сейчас, но очень профессионально и немного минималистично. Не так много зависимостей, должно быть хорошо использовать только модуль I2C. С тех пор в части AVR I2C практически нет ничего нового.

,

1

Я сам сделал 2 библиотеки для простоты использования и согласованных вызовов:

один для целей AVR:
cI2C

другой, использующий те же функции для всех других целей (который, по сути, является оболочкой для библиотеки Wire):
WireWrapper

Оба варианта доступны в диспетчере библиотек IDE.
Оба они работают как ведущие без использования прерываний и тестируются на разных целях с разными подчиненными устройствами:
- UNO, Nano для cI2C
- Zero, Due & ESP8266 для WireWrapper

,

2

Вы можете использовать совершенно другой подход к главному вопросу. Запрашивая альтернативы, вы обосновали это: избавление от неиспользуемого кода в двоичном коде. Вы можете добиться удаления неиспользуемого кода, фактически не используя альтернативную библиотеку. Имейте в виду, что вы можете указать компилятору и компоновщику исключить неиспользуемый код из скомпилированного бинарного файла. Просто используйте флаги компиляции:

CFLAGS += -Wl,-static
CFLAGS += -ffunction-sections
CFLAGS += -Wl,--gc-sections

Функция Rach будет в отдельном разделе.

LDFLAGS += -Wl,-gc-sections

Это говорит GCC отправить флаг -gc-sections компоновщику, который удалит неиспользуемые разделы. И вуаля! Неиспользуемые разделы удаляются.

,