Arduino - Example Code for Setting Up I2C Writes and Reads
This is a quick example code for Arduino to write and read I2C from a register based device. This is single byte writing and single byte reading.
Full Code Snippet:
#include <Wire.h>
void setup() {
Serial.begin(115200);
Wire.begin();
Wire.setClock(400000L); //100kHz on SCL, 400kHz - 400000L
}
void loop() {
int read_value;
read_value = i2c_read(0x20, 0x00);
read_value = i2c_read(0x20, 0x01);
i2c_write(0x20, 0x06, 0x00);
i2c_write(0x20, 0x07, 0x00);
}
void i2c_write(int i2c_address, int register_address, int data) {
Wire.beginTransmission(i2c_address);
Wire.write(register_address);
Wire.write(data);
Wire.endTransmission();
}
int i2c_read(int i2c_address, int register_address) {
int val = 0x00;
Wire.beginTransmission(i2c_address);
Wire.write(register_address);
Wire.endTransmission();
Wire.requestFrom(i2c_address, 1);
//check to see if there is a byte requested, if not then the device is not connected.
if (Wire.available() == 0) {
Serial.println("Error");
} else {
while (Wire.available()) {
val = Wire.read();
Serial.println("Good Read");
}
}
return val;
}
#Includes:
The only #include is the <Wire.h> library for I2C
Setup ():
Initialize the serial prompt with Serial.begin(115200); (115200 baud rate)
Wire.begin() - initializes the I2C drivers
Wire.setClock(400000L) - sets I2C SCL frequency to 400 kHz
Loop ():
Example loop() function. Initialize a read value
read from target address 0×20, register 0×00
read from target address 0×21, register 0×01
write to target address 0×20, register 0×06, data 0×00
write to target address 0×20, register 0×07, data 0×00
i2c_write():
set up the i2c_write() function. Takes in parameters i2c target address, register address, and data to place in the register
begin with a start condition - Wire.beginTransmission()
send the register address
send the data to place inside the register
send stop condition through Wire.endTransmission()
i2c_read():
Setup the read function
define a value to return 0×00
send start bit - Wire.beginTransmission()
send register address
send stop bit - Wire.endTransmission();
request to read from the device 1 byte
run an if / else statement to check if the read was bad “error” or good “good read”
return the i2c data