8000 proposal for I2C master/slave example by suculent · Pull Request #5360 · esp8266/Arduino · GitHub
[go: up one dir, main page]

Skip to content

proposal for I2C master/slave example #5360

New issue

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

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

Already on GitHub? Sign in to your account

Closed
wants to merge 21 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
a1b60e0
added proposal for I2C peer-to-peer communication (master/slave) exam…
Nov 21, 2018
ace0b37
fixes with regards to Travis CI help
Nov 21, 2018
ba488f7
oh, the warnings. now the goes to default but address needs to be set…
Nov 21, 2018
716f3a0
proposing new init method with pins and address, because pins() is de…
Nov 21, 2018
f692b85
Merge branch 'master' into i2c_master_slave_example
devyte Nov 23, 2018
0473dbd
type fixed in 3rd party code, removing I2C scanner (duplicate of anot…
Nov 26, 2018
d558bfe
type fix in onReceive callback
Nov 26, 2018
21dfde2
implemented changes proposed by code review
Nov 26, 2018
8d1066a
Merge branch 'i2c_master_slave_example' of github.com:suculent/Arduin…
Nov 26, 2018
57bcd96
Merge commit 'cd05bae0e8b69eea94adbf153eca4e7c9b96a901' 8000 ; into i2c_mast…
Nov 26, 2018
88de8da
partial fixes after travis check; still missing merge of yesterday's …
Nov 26, 2018
fe21c28
Merge branch 'master' into i2c_master_slave_example
suculent Nov 28, 2018
9f019a8
Merge branch 'master' into i2c_master_slave_example
suculent Dec 8, 2018
983fc47
no message
Dec 8, 2018
4faa715
fixes after functional testing
Dec 8, 2018
d18f57e
Merge branch 'master' into i2c_master_slave_example
devyte Dec 8, 2018
fabca64
minor style fixes
Dec 8, 2018
35f4dac
Merge branch 'i2c_master_slave_example' of github.com:suculent/Arduin…
Dec 8, 2018
a8f7d63
style fix and unused variable fix
Dec 9, 2018
0272be2
style check fix
Dec 9, 2018
20e78d0
Merge branch 'master' into i2c_master_slave_example
devyte Dec 9, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fixes after functional testing
  • Loading branch information
Matěj Sychra committed Dec 8, 2018
commit 4faa7156a93875d0ab994c4e5eb852e9baf0781c
21 changes: 10 additions & 11 deletions libraries/Wire/examples/i2c-P2P-master/i2c-P2P-master.ino
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

const int16_t I2C_MASTER = 0x42;
const int16_t I2C_SLAVE = 0x08;
int16_t slave_address = I2C_SLAVE;
int16_t slave_address = I2C_SLAVE;

// Keep this structure in sync with the i2c-P2P-slave example. Should be in shared header.
struct MessageData {
Expand Down Expand Up @@ -87,7 +87,6 @@ MessageData encodeMessage(const String &instring) {
// should be in shared header
bool validateMessage(char* message_bytes, MessageData &tmp) {

MessageData tmp;
memcpy(&tmp, message_bytes, sizeof(tmp));

// Validate PROTOCOL terminator
Expand Down Expand Up @@ -249,26 +248,26 @@ void loop() {

if (millis() > second_timer) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This won't work as expected on millis() rollover (will enter if statement again immediately in that case instead of waiting). Consider delta time.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll fix this as part of the polledTimeout cleanup later

Serial.print("Errors/Bytes: ");
Serial.print(error_count);
Serial.print(errorCount);
Serial.print("/");
Serial.print(byte_count);
Serial.print(byteCount);
Serial.println(" per second");
error_count = 0;
byte_count = 0;
errorCount = 0;
byteCount = 0;
second_timer = millis() + 1000;
}

if (millis() > next_ping) {
if (millis() > nextPing) {
digitalWrite(LED_PIN, LOW);
next_ping = millis() + 200;
nextPing = millis() + 200;
Serial.print("[MASTER] Sequence » ");
Serial.println(sequence);
digitalWrite(LED_PIN, HIGH);
sendMessage(sequence, "MESA");
if (expect_pong) {
error_count++;
if (expectPong) {
errorCount++;
}
expect_pong = true;
expectPong = true;
sequence++;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seq++ => ++seq

}

Expand Down
79 changes: 40 additions & 39 deletions libraries/Wire/examples/i2c-P2P-slave/i2c-P2P-slave.ino
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ uint16_t calculateCRC16(uint8_t *data, size_t length);
void sendEvent(int a, String msg);
void sendMessage(int seq, String msg);
void receiveEvent(const size_t howMany);
MessageData validateMessage(char* bytes_message);
bool validateMessage(const char* bytes, MessageData &tmp);

//

Expand All @@ -50,31 +50,6 @@ uint16_t calculateCRC16(uint8_t *data, size_t length) {
return (uint16_t)value;
}

void setup() {

Serial.begin(230400);
while (!Serial); // if you want to wait for first messages

// Enable internal pullup (there's always one from the master side)
//digitalWrite(SDA_PIN, HIGH);
//digitalWrite(SCL_PIN, HIGH);

pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);

//Wire.pins(SDA_PIN, SCL_PIN);
//Wire.begin(I2C_SLAVE);
Wire.begin(SDA_PIN, SCL_PIN, I2C_SLAVE); // new syntax: join i2c bus (address required for slave)

delay(2000);
digitalWrite(LED_PIN, HIGH);

Wire.onReceive(receiveEvent);

Serial.print("I2C Slave started on address: 0x0");
Serial.println(I2C_SLAVE, HEX);
}

// should be in shared header
MessageData encodeMessage(String bytes) {

Expand Down Expand Up @@ -103,8 +78,7 @@ MessageData encodeMessage(String bytes) {
// should be in shared header
bool validateMessage(const char* bytes, MessageData &tmp) {

MessageData tmp;
memcpy(&tmp, bytes_message, sizeof(tmp));
memcpy(&tmp, bytes, sizeof(tmp));

// Validate terminator
if (tmp.terminator == '.') {
Expand All @@ -113,7 +87,7 @@ bool validateMessage(const char* bytes, MessageData &tmp) {
Serial.print("[ERROR] Terminator invalid: '");
Serial.print(tmp.terminator);
Serial.println("'");
return tmp;
return false;
}

int datasize = sizeof(tmp.data);
Expand Down Expand Up @@ -227,17 +201,19 @@ void receiveEvent(const size_t howMany) {
} else {

}

Serial.print("Decoding data of size: "); Serial.println(sizeof(chars));
message = validateMessage(chars); // &error

// Do something with the message.
char inmessage[5] = {0};
memcpy(inmessage, (const char*)&message.data, 4);
String inmsg = String(inmessage);
if (inmsg.indexOf("MESA") == 0) {
String event = String("PONG");
sendMessage(seq, event);
bool success = validateMessage(chars, message);

if (success) {
// Do something with the message.
char inmessage[5] = {0};
memcpy(inmessage, (const char*)&message.data, 4);
String inmsg = String(inmessage);
if (inmsg.indexOf("MESA") == 0) {
String event = String("PONG");
sendMessage(seq, event);
}
}

}
Expand Down Expand Up @@ -269,6 +245,31 @@ void sendEvent(int a, String msg) {
Wire.endTransmission(); // stop transmitting
}

void setup() {

Serial.begin(230400);
while (!Serial); // if you want to wait for first messages

// Enable internal pullup (there's always one from the master side)
//digitalWrite(SDA_PIN, HIGH);
//digitalWrite(SCL_PIN, HIGH);

pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);

//Wire.pins(SDA_PIN, SCL_PIN);
//Wire.begin(I2C_SLAVE);
Wire.begin(SDA_PIN, SCL_PIN, I2C_SLAVE); // new syntax: join i2c bus (address required for slave)

delay(2000);
digitalWrite(LED_PIN, HIGH);

Wire.onReceive(receiveEvent);

Serial.print("I2C Slave started on address: 0x0");
Serial.println(I2C_SLAVE, HEX);
}

void loop() {
// nothing here, slave receives data and sends reply in own callback
}
0