Как избежать многократного вызова Wire.begin() в библиотеках?

все в названии; я разрабатываю библиотеку и использую указатели *TwoWire в этой библиотеке; но я использую внешнюю библиотеку, которая вызывает Wire.begin(). Я видел что-то о регистре TWCR в arduino, но я не знаю, что это такое точно.

Заранее спасибо :)

, 👍1


1 ответ


Лучший ответ:

1

Вас интересует эта часть библиотеки Wire:

TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);

Важным битом является бит TWEN — включение TwoWire.

Если этот бит установлен в регистре TWCR, то Wire.begin() уже был вызван, и вам не нужно вызывать его снова:

if (TWCR & _BV(TWEN) == 0) {
    Wire.begin();
}

Однако на самом деле не имеет значения, если вы позвоните несколько раз.

,

Другое дело, если вы делаете 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