SoftI2C fork with ack fix
Diff: SoftI2C.cpp
- Revision:
- 1:05473196d133
- Parent:
- 0:fee70b6fe0e9
- Child:
- 2:9ee34b54555e
--- a/SoftI2C.cpp Tue Nov 22 20:45:35 2016 +0000 +++ b/SoftI2C.cpp Mon Nov 28 19:55:30 2016 +0000 @@ -59,11 +59,11 @@ int SoftI2C::read(int ack) { int retval = 0; + _scl.output(); // Shift the bits out, msb first for (int i = 7; i>=0; i--) { //SCL low - _scl.output(); _scl.write(0); _sda.input(); wait_us(delay_us); @@ -73,12 +73,11 @@ wait_us(delay_us); //SCL high again - _scl.input(); + _scl.write(1); wait_us(delay_us << 1); //wait two delays } // Last cycle to set the ACK - _scl.output(); _scl.write(0); if ( ack ) { _sda.output(); @@ -88,7 +87,7 @@ } wait_us(delay_us << 1); - _scl.input(); + _scl.write(1); wait_us(delay_us << 1); @@ -96,10 +95,11 @@ } int SoftI2C::write(int data) { + _scl.output(); + // Shift the bits out, msb first for (int i = 7; i>=0; i--) { //SCL low - _scl.output(); _scl.write(0); wait_us(delay_us); @@ -113,19 +113,18 @@ wait_us(delay_us); //SCL high again - _scl.input(); + _scl.write(1); wait_us(delay_us << 1); //wait two delays } // Last cycle to get the ACK - _scl.output(); _scl.write(0); wait_us(delay_us); _sda.input(); wait_us(delay_us); - _scl.input(); + _scl.write(1); wait_us(delay_us); int retval = ~_sda.read(); //Read the ack wait_us(delay_us); @@ -140,7 +139,7 @@ _scl.output(); _scl.write(0); wait_us(delay_us << 1); - _scl.input(); + _scl.write(1); wait_us(delay_us << 1); } // Pull SDA low