Skip to content
32 changes: 24 additions & 8 deletions cores/esp8266/core_esp8266_si2c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ class Twi
}
}

// Generate a clock "valley" (at the end of a segment, just before a repeated start)
void twi_scl_valley(void);

public:
void setClock(unsigned int freq);
Expand Down Expand Up @@ -386,13 +388,16 @@ unsigned char Twi::writeTo(unsigned char address, unsigned char * buf, unsigned
{
write_stop();
}
else
{
twi_scl_valley();
// TD-er: Also busywait(twi_dcount) here?
// busywait(twi_dcount);
}
i = 0;
while (!SDA_READ() && (i++) < 10)
{
SCL_LOW();
busywait(twi_dcount);
SCL_HIGH();
WAIT_CLOCK_STRETCH();
twi_scl_valley();
busywait(twi_dcount);
}
return 0;
Expand Down Expand Up @@ -422,13 +427,16 @@ unsigned char Twi::readFrom(unsigned char address, unsigned char* buf, unsigned
{
write_stop();
}
else
{
twi_scl_valley();
// TD-er: Also busywait(twi_dcount) here?
// busywait(twi_dcount);
}
i = 0;
while (!SDA_READ() && (i++) < 10)
{
SCL_LOW();
busywait(twi_dcount);
SCL_HIGH();
WAIT_CLOCK_STRETCH();
twi_scl_valley();
busywait(twi_dcount);
}
return 0;
Expand Down Expand Up @@ -649,6 +657,14 @@ void ICACHE_RAM_ATTR Twi::onTwipEvent(uint8_t status)
}
}

void Twi::twi_scl_valley(void)
{
SCL_LOW();
busywait(twi_dcount);
SCL_HIGH();
WAIT_CLOCK_STRETCH();
}

void ICACHE_RAM_ATTR Twi::onTimer(void *unused)
{
(void)unused;
Expand Down