I2C slave



  • Hi, I am having problems in communication between Wemos D1 mini and Wemos XI via I2C.

    Whenever I send I2C packet from D1 to XI, the program on XI gets stucked.

    I'm using this example to test it:

    // Wire Slave Receiver
    // by Nicholas Zambetti <http://www.zambetti.com>
    
    // Demonstrates use of the Wire library
    // Receives data as an I2C/TWI slave device
    // Refer to the "Wire Master Writer" example for use with this
    
    // Created 29 March 2006
    
    // This example code is in the public domain.
    
    
    #include <Wire.h>
    
    void setup()
    {
      Wire.begin(0x7F);                // join i2c bus with address #8
      Wire.onReceive(receiveEvent); // register event
      Serial.begin(9600);           // start serial for output
    }
    
    void loop()
    {
      delay(100);
      Serial.print(".");
    }
    
    // function that executes whenever data is received from master
    // this function is registered as an event, see setup()
    void receiveEvent(int howMany)
    {
        Serial.print("x");
      while (1 < Wire.available()) // loop through all but the last
      {
          Serial.print("*");
        char c = Wire.read(); // receive byte as a character
        Serial.print(c);         // print the character
      }
      int x = Wire.read();    // receive byte as an integer
      Serial.println(x);         // print the integer
    } 
    

    And get this output:

    ..................
    

    I'm having D1, D2 and A4, A5 (+GNDs), connected with pullups 4k7 to 3V3.

    Any thoughts?

    The documentation for XI is shit as it doesn't exists :( No schematics, no API

    Thanks



  • I don't think you should be using Serial.print inside an interrupt.



  • Hi, thanks for the response.

    It's not working even without Serial.

    And on the top it's an "official" example.

    But as you propose I've tried it once more.

    #include <Wire.h>
    
    volatile uint8_t val;
    
    void setup()
    {
      Wire.begin(0x7f);
      Wire.onReceive(receiveEvent);
    
      pinMode(13, OUTPUT);
    
      val = 1;
    }
    
    void loop() {}
    
    void receiveEvent(int count)
    {
      digitalWrite(13, val);
      val = 1 - val;
    }
    

    It should blink, but nothing happens :(

    The script I want to run is this one: https://github.com/letscontrolit/ESPEasySlaves/blob/master/MiniProExtender/MiniProExtender.ino



  • @majklovec Do you have pullup resistors on your i2c lines?



  • Yes, 4k7 to 3v3 on SDA and SDC



  • I can't see anything else suspicious. Seems like there might be an error in the library or even in the hardware.



  • I've tried 2 pcs of Wemos XI, then I gave up. I'm gonna test anothers but I'm kind of disapointed about that hardware.

    Thanks for your time.


Log in to reply
 

Looks like your connection to WEMOS Forum was lost, please wait while we try to reconnect.