diff options
Diffstat (limited to 'libraries/Wire')
| -rw-r--r-- | libraries/Wire/examples/digital_potentiometer/digital_potentiometer.ino | 2 | ||||
| -rw-r--r-- | libraries/Wire/examples/i2c_scanner/i2c_scanner.ino | 75 | ||||
| -rw-r--r-- | libraries/Wire/src/Wire.cpp | 7 | ||||
| -rw-r--r-- | libraries/Wire/src/utility/twi.c | 2 | 
4 files changed, 81 insertions, 5 deletions
| diff --git a/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.ino b/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.ino index 5fb91fb..dd40a25 100644 --- a/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.ino +++ b/libraries/Wire/examples/digital_potentiometer/digital_potentiometer.ino @@ -9,8 +9,6 @@  // This example code is in the public domain. -// This example code is in the public domain. -  #include <Wire.h> diff --git a/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino b/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino new file mode 100644 index 0000000..3febbf4 --- /dev/null +++ b/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino @@ -0,0 +1,75 @@ +// -------------------------------------- +// i2c_scanner +// +// Version 1 +//    This program (or code that looks like it) +//    can be found in many places. +//    For example on the Arduino.cc forum. +//    The original author is not know. +// Version 2, Juni 2012, Using Arduino 1.0.1 +//     Adapted to be as simple as possible by Arduino.cc user Krodal +// Version 3, Feb 26  2013 +//    V3 by louarnold +// Version 4, March 3, 2013, Using Arduino 1.0.3 +//    by Arduino.cc user Krodal. +//    Changes by louarnold removed. +//    Scanning addresses changed from 0...127 to 1...119, +//    according to the i2c scanner by Nick Gammon +//    https://www.gammon.com.au/forum/?id=10896 +// Version 5, March 28, 2013 +//    As version 4, but address scans now to 127. +//    A sensor seems to use address 120. +// Version 6, November 27, 2015. +//    Added waiting for the Leonardo serial communication. +// +// +// This sketch tests the standard 7-bit addresses +// Devices with higher bit address might not be seen properly. +// + +#include <Wire.h> + +void setup() { +  Wire.begin(); + +  Serial.begin(9600); +  while (!Serial); // Leonardo: wait for serial monitor +  Serial.println("\nI2C Scanner"); +} + +void loop() { +  int nDevices = 0; + +  Serial.println("Scanning..."); + +  for (byte address = 1; address < 127; ++address) { +    // The i2c_scanner uses the return value of +    // the Write.endTransmisstion to see if +    // a device did acknowledge to the address. +    Wire.beginTransmission(address); +    byte error = Wire.endTransmission(); + +    if (error == 0) { +      Serial.print("I2C device found at address 0x"); +      if (address < 16) { +        Serial.print("0"); +      } +      Serial.print(address, HEX); +      Serial.println("  !"); + +      ++nDevices; +    } else if (error == 4) { +      Serial.print("Unknown error at address 0x"); +      if (address < 16) { +        Serial.print("0"); +      } +      Serial.println(address, HEX); +    } +  } +  if (nDevices == 0) { +    Serial.println("No I2C devices found\n"); +  } else { +    Serial.println("done\n"); +  } +  delay(5000); // Wait 5 seconds for next scan +} diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index d2146f7..58916ce 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -17,6 +17,7 @@    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA    Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts +  Modified 2017 by Chuck Todd (ctodd@cableone.net) to correct Unconfigured Slave Mode reboot  */  extern "C" { @@ -60,14 +61,14 @@ void TwoWire::begin(void)    txBufferLength = 0;    twi_init(); +  twi_attachSlaveTxEvent(onRequestService); // default callback must exist +  twi_attachSlaveRxEvent(onReceiveService); // default callback must exist  }  void TwoWire::begin(uint8_t address)  { -  twi_setAddress(address); -  twi_attachSlaveTxEvent(onRequestService); -  twi_attachSlaveRxEvent(onReceiveService);    begin(); +  twi_setAddress(address);  }  void TwoWire::begin(int address) diff --git a/libraries/Wire/src/utility/twi.c b/libraries/Wire/src/utility/twi.c index 171af73..1a35146 100644 --- a/libraries/Wire/src/utility/twi.c +++ b/libraries/Wire/src/utility/twi.c @@ -445,6 +445,7 @@ ISR(TWI_vect)      case TW_MR_DATA_ACK: // data received, ack sent        // put byte into buffer        twi_masterBuffer[twi_masterBufferIndex++] = TWDR; +      __attribute__ ((fallthrough));      case TW_MR_SLA_ACK:  // address sent, ack received        // ack if more bytes are expected, otherwise nack        if(twi_masterBufferIndex < twi_masterBufferLength){ @@ -530,6 +531,7 @@ ISR(TWI_vect)          twi_txBufferLength = 1;          twi_txBuffer[0] = 0x00;        } +      __attribute__ ((fallthrough));		          // transmit first byte from buffer, fall      case TW_ST_DATA_ACK: // byte sent, ack returned        // copy data to output register | 
