Зависит не от языка а от библиотек и от возможности правильно и просто написать обработку событий.А на луа этой проблемы с удержанием SDA не было бы? Это же не зависит от языка вообще.
Луа отличается от дурины тем, что дурина лишь в дурине, а луа встроена не только в eSP и игры но и в кучу микроконтроллеров для управления пром линиями.Хм. Выглядит сильно короче. Но сильно непонятнее. Ардуиновский С я как-то уже понимаю что делает. А нет ли какого-то учебника или ресурса по ЛУА именно для ЕСП и для чайников? Я пытался что-то искать, но натыкался в основном на использование луа для моддинга игр.
Не слушайте вредных советов, держитесь подальше от Lua. Это маргинальный язык, каких сейчас расплодилось тысячи, случайно появившийся в ESP8266 благодаря какому-то румынскому энтузиасту. Во встроенных системах никакого будущего у него нет. Вы сделали правильный выбор, знания С и Ардуино вам пригодятся не только с ESP8266, но и с другими платформами.А нет ли какого-то учебника или ресурса по ЛУА именно для ЕСП и для чайников? Я пытался что-то искать, но натыкался в основном на использование луа для моддинга игр.
Невооруженным глазом видны ошибки в библиотеке. Функци RTC_DS3231::now() и RTC_DS3231::readSqwPinMode() не посылают завершающий I2C STOP (т.е Wire.endTransmission() в конце обмена), из-за чего шина остается в подвешенном состоянии.@Сергей_Ф, я давал ссылку на библиотеку, но она видимо затерялась в потоке GitHub - adafruit/RTClib: A fork of Jeelab's fantastic RTC library
Там тоже есть места, где шина остается брошенной после чтения в неопределенном состоянии, без STOP.Если не ошибаюсь, там все на месте.
Завершать любую транзакцию должен тот же, кто ее начал, т.е. мастер. Безотносительно к тому, читает он данные или пишет.Сразу вопрос, завершать передачу разве должен не источник данных?
Костыли - это Hanging I2C on DUE, SDA Low SCL High permanent.Угу. Только причем тут "костыли"? Библиотеки написаны чайниками. Кое-как работают только в случае, когда на I2C шине находится всего один чип.
Wire.endTransmission() в конец функции, перед return? .
Если там нет каких-то боковых эффектов, то должно быть достаточно. Это вообще-то альфа и омега I2C - любую транзакцию начинать со СТАРТ, а заканчивать СТОП.И достаточно ли в библиотеках от "чайников" прописать
Заставил себя посмотреть, как устроена ардуиновская I2C либа Wire, на основе которой делаются специализированные либы под конкретные чипы. Она сделана не бит-бангом, а сидит на I2C железяке.а не получится так, что мы пошлем СТОП до окончания приема данных от RTC? Мы же не отслеживаем окончание приема. Только в этом могут быть подводные камни.
Я ардуиновскими либами для I2C вообще никогда не пользовался, впервые их вижу.И Вы не ответили, есть ли правильные либы для rtc, на С. Не обязательно, под Wire. Не знаете?
DateTime RTC_DS3231::now()
{
Wire.beginTransmission(DS3231_ADDRESS);
Wire._I2C_WRITE((byte)0);
Wire.endTransmission();
Wire.requestFrom(DS3231_ADDRESS, 7, true); // читать 7 байт, завершить СТОПом
while(7 > Wire.available()) // пока все 7 байт не прочитаны
{
delay(0); // ждем-с
}
uint8_t ss = bcd2bin(Wire._I2C_READ() & 0x7F);
uint8_t mm = bcd2bin(Wire._I2C_READ());
uint8_t hh = bcd2bin(Wire._I2C_READ());
Wire._I2C_READ();
uint8_t d = bcd2bin(Wire._I2C_READ());
uint8_t m = bcd2bin(Wire._I2C_READ());
uint16_t y = bcd2bin(Wire._I2C_READ()) + 2000;
return DateTime (y, m, d, hh, mm, ss);
}