From d5444c4aa38bff01269cfbd98a13a1454d0c62df Mon Sep 17 00:00:00 2001 From: Andrej Pala <78907070+xpalaa00@users.noreply.github.com> Date: Sun, 28 Nov 2021 16:33:01 +0100 Subject: [PATCH] I2C clock phase correction in START condition (#8383) * A clock phase correction in write_start(void) Some devices require the data wire SDA to be held down at the moment while the clock wire is pulled down too to execute the start condition (e.g. devices using "TinyWires.h" library). This change follows a behaviour of Arduino Wire.h library, where the SCL signal is pulled down in half of period of start condition. * Formatting of modification restyled * Removing mathematical operations from delay * Comments added --- cores/esp8266/core_esp8266_si2c.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cores/esp8266/core_esp8266_si2c.cpp b/cores/esp8266/core_esp8266_si2c.cpp index e4bb1c2b0..e01dffe08 100644 --- a/cores/esp8266/core_esp8266_si2c.cpp +++ b/cores/esp8266/core_esp8266_si2c.cpp @@ -247,8 +247,12 @@ bool Twi::write_start(void) return false; } busywait(twi_dcount); + // A high-to-low transition on the SDA line while the SCL is high defines a START condition. SDA_LOW(twi_sda); busywait(twi_dcount); + // An additional delay between the SCL line high-to-low transition and setting up the SDA line to prevent a STOP condition execute. + SCL_LOW(twi_scl); + busywait(twi_dcount); return true; } @@ -260,6 +264,7 @@ bool Twi::write_stop(void) SCL_HIGH(twi_scl); WAIT_CLOCK_STRETCH(); busywait(twi_dcount); + // A low-to-high transition on the SDA line while the SCL is high defines a STOP condition. SDA_HIGH(twi_sda); busywait(twi_dcount); return true;