From dc6e7c6ea0f6666bb521be66dcb00f1d1200f8c2 Mon Sep 17 00:00:00 2001 From: alanbjohnston Date: Sat, 6 Apr 2019 10:22:40 -0400 Subject: [PATCH 1/2] Create i2c_slave_register_read.ino --- arduino/i2c_slave_register_read.ino | 61 +++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 arduino/i2c_slave_register_read.ino diff --git a/arduino/i2c_slave_register_read.ino b/arduino/i2c_slave_register_read.ino new file mode 100644 index 00000000..a4890778 --- /dev/null +++ b/arduino/i2c_slave_register_read.ino @@ -0,0 +1,61 @@ +#include +#define I2C_ADDRESS 0x4B +#define REGISTER_0 0x00 +#define REGISTER_1 0x01 +#define REGISTER_2 0x02 +#define REGISTER_3 0x03 + +uint8_t reg; // I2C read register +unsigned int reg_0_value = 41151; +unsigned int reg_1_value = 53124; +unsigned int reg_2_value = 65535; +unsigned int reg_3_value = 0; + +void setup() { + + Wire.begin(I2C_ADDRESS); + Wire.onRequest(requestEvent); + Wire.onReceive(receiveEvent); + pinMode(LED_BUILTIN, OUTPUT); + Serial.begin(9600); // start serial for output + Serial.println(); + Serial.println("Starting"); +} + +void loop() { + Serial.println("Waiting for register read"); + delay(5000); +} + +void receiveEvent(int bytes) { + // Read the first byte to determine which register is concerned + reg = Wire.read(); + Serial.print("Read register "); + Serial.println(reg); +} + +void requestEvent() { + // Read from the register variable to know what to send back + digitalWrite(LED_BUILTIN, HIGH); + if (reg == REGISTER_0) { + Wire.write((uint8_t *)®_0_value, sizeof(reg_0_value)); + Serial.print("Writing value "); + Serial.println(reg_0_value); + } else if (reg == REGISTER_1) { + Wire.write((uint8_t *)®_1_value, sizeof(reg_1_value)); + Serial.print("Writing value "); + Serial.println(reg_1_value); + } else if (reg == REGISTER_2) { + Wire.write((uint8_t *)®_2_value, sizeof(reg_2_value)); + Serial.print("Writing value "); + Serial.println(reg_2_value); + } else if (reg == REGISTER_3) { + Wire.write((uint8_t *)®_3_value, sizeof(reg_3_value)); + Serial.print("Writing value "); + Serial.println(reg_3_value); + } else { + Serial.println("Unknown register"); + } + delay(50); + digitalWrite(LED_BUILTIN, LOW); +} From 4f38f31d6c937c2b59ca4aafd2c47acfbac8528b Mon Sep 17 00:00:00 2001 From: alanbjohnston Date: Sat, 6 Apr 2019 10:24:02 -0400 Subject: [PATCH 2/2] Create i2c_master_register_read.ino --- arduino/i2c_master_register_read.ino | 53 ++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 arduino/i2c_master_register_read.ino diff --git a/arduino/i2c_master_register_read.ino b/arduino/i2c_master_register_read.ino new file mode 100644 index 00000000..e8c7f1a4 --- /dev/null +++ b/arduino/i2c_master_register_read.ino @@ -0,0 +1,53 @@ +// Wire Master Reader +// by Nicholas Zambetti + +// Demonstrates use of the Wire library +// Reads data from an I2C/TWI slave device +// Refer to the "Wire Slave Sender" example for use with this + +// Created 29 March 2006 + +// This example code is in the public domain. + +// modified by Alan Johnston to show reading registers 0 - 3 +// code based on https://forum.arduino.cc/index.php?topic=211587.0 + +#include +#define I2C_ADDRESS 0x4B +#define REGISTER_0 0x00 +#define REGISTER_1 0x01 +#define REGISTER_2 0x02 +#define REGISTER_3 0x03 + +uint8_t reg; // I2C read register + +void setup() { + Wire.begin(); // join i2c bus (address optional for master) + Serial.begin(9600); // start serial for output + pinMode(LED_BUILTIN, OUTPUT); + Serial.println("Starting"); +} + +void loop() { + for (reg=0; reg < 4; reg++) { + delay(5000); + digitalWrite(LED_BUILTIN, HIGH); + Wire.beginTransmission(I2C_ADDRESS); + Wire.write(reg); + Wire.endTransmission(); + delay(100); + digitalWrite(LED_BUILTIN, LOW); + + + Wire.requestFrom(I2C_ADDRESS, 2); // request 2 bytes from I2C device + byte LSB = Wire.read(); + byte MSB = Wire.read(); + + uint16_t register_value = ((MSB << 8) | LSB); + + Serial.print("Read "); + Serial.print(register_value); + Serial.print(" from register "); + Serial.println(reg); + } +}