Как избежать многократного вызова Wire.begin() в библиотеках?
все в названии; я разрабатываю библиотеку и использую указатели *TwoWire в этой библиотеке; но я использую внешнюю библиотеку, которая вызывает Wire.begin(). Я видел что-то о регистре TWCR в arduino, но я не знаю, что это такое точно.
Заранее спасибо :)
@Storca, 👍1
1 ответ
Лучший ответ:
▲ 1
Вас интересует эта часть библиотеки Wire:
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);
Важным битом является бит TWEN
— включение TwoWire.
Если этот бит установлен в регистре TWCR, то Wire.begin() уже был вызван, и вам не нужно вызывать его снова:
if (TWCR & _BV(TWEN) == 0) {
Wire.begin();
}
Однако на самом деле не имеет значения, если вы позвоните несколько раз.
,
@Majenko
Смотрите также:
- Wire.h не найден!
- Альтернативы библиотеке Wire для I2C
- Заменить библиотеку Wire на TinyWireM
- Вопросы о библиотеке HMC5883L
- Отправка и получение различных типов данных через I2C в Arduino
- Как получить исходные файлы для библиотек Arduino?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
Другое дело, если вы делаете setFrequency(400000L), а затем какая-то другая библиотека вызывает Wire.begin(), @Juraj
Если говорить точнее, это было сделано для того, чтобы избежать таких проблем https://github.com/esp8266/Arduino/issues/2607 Не знаю, касается ли это меня, но я посмотрю с прототипом., @Storca
@Storca Обратите внимание, что это для совершенно другой архитектуры, поэтому "исправление", которое я описал выше, не имеет к ней никакого отношения. Правильное место для исправления - библиотека Wire. Мы делаем это правильно chipKIT: https://github.com/chipKIT32/chipKIT-core/blob/master/pic32/libraries/Wire/Wire.cpp#L122 - разрешаем begin запускаться только при первом вызове., @Majenko