GyverLibs
GyverLibs copied to clipboard
Зависание microWire.cpp при обрыве питания на I2C устройстве
Как и у оригинальной библиотеки, обрыв питания на управляемом устройстве приводит к зависанию arduino. Происходит это из-за бесконечных циклов в методах библиотеки, например:
void TwoWire::start()
{ // сервисная функция с нее начинается любая работа с шиной
TWCR = _BV(TWSTA) | _BV(TWEN) | _BV(TWINT); // start + TwoWire enable + установка флага "выполнить задачу"
-------> while (!(TWCR & _BV(TWINT))); // Ожидание завершения
}
Чтобы избежать такого поведения, можно использовать что-то типа такого:
void TwoWire::start()
{
unsigned long startingTime = millis();
TWCR = _BV(TWSTA) | _BV(TWEN) | _BV(TWINT);
while (!(TWCR & _BV(TWINT)))
{
if((millis() - startingTime) >= timeOutDelay)
{
lockUp()
return;
}
}
}
void TwoWire::lockUp()
{
TWCR = 0; //releases SDA and SCL lines to high impedance
TWCR = _BV(TWEN) | _BV(TWEA); //reinitialize TWI
}