Skip to content

Wire: I2CSlave: move out slave->read from critical section #1061

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 1 commit into from
May 13, 2025

Conversation

pennam
Copy link
Contributor

@pennam pennam commented May 12, 2025

Fixes master writer / slave reader

Master

#include <Wire.h>

void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
}

byte x = 0;

void loop()
{
  Wire.beginTransmission(4); // transmit to device #4
  Wire.write("x is ");        // sends five bytes
  Wire.write(x);              // sends one byte  
  Wire.endTransmission();    // stop transmitting

  x++;
  delay(500);
}

Slave

#include <Wire.h>

void setup()
{
  Serial.begin(9600);           // start serial for output
  while(!Serial);
  Wire.begin(4);                // join i2c bus with address #4
  Wire.onReceive(receiveEvent); // register event
  
}

void loop()
{
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  Serial.println("REQ");
  while(1 < Wire.available()) // loop through all but the last
  {
    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
}

Tested also with Master reader / Slave writer

Master

#include <Wire.h>

void setup() {
  Wire.begin();        // join I2C bus (address optional for master)
  Serial.begin(9600);  // start serial for output
}

void loop() {
  Wire.requestFrom(16, 6);    // request 6 bytes from slave device #8

  while (Wire.available()) { // slave may send less than requested
    Serial.write(Wire.read());         // print the character
  }
  Serial.println();
  delay(500);
}

Slave

#include <Wire.h>

void setup() {
  Wire.begin(16);                // join I2C bus with address #8
  Wire.onRequest(requestEvent); // register event
}

void loop() {
  delay(1);
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
  Wire.write("hello "); // respond with message of 6 bytes
  // as expected by master
}

@pennam pennam merged commit 142f272 into arduino:main May 13, 2025
11 checks passed
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant