Arduino - Basic I2C Write
Writing to I2C Device
#include <Wire.h>
#define DEVICE_ADDRESS 0x68 // Example: DS1307 RTC
void setup() {
Serial.begin(9600);
Wire.begin(); // Initialize I2C as master
Serial.println("I2C Master initialized");
}
void writeRegister(uint8_t reg, uint8_t value) {
Wire.beginTransmission(DEVICE_ADDRESS);
Wire.write(reg); // Register address
Wire.write(value); // Data to write
byte error = Wire.endTransmission();
if (error == 0) {
Serial.println("Write successful");
} else {
Serial.print("Write failed, error: ");
Serial.println(error);
}
}
void loop() {
writeRegister(0x00, 0x45); // Write 0x45 to register 0x00
delay(1000);
}
Arduino - Basic I2C Read
Reading from I2C Device
#include <Wire.h>
#define DEVICE_ADDRESS 0x68
uint8_t readRegister(uint8_t reg) {
Wire.beginTransmission(DEVICE_ADDRESS);
Wire.write(reg); // Register to read from
Wire.endTransmission(false); // Repeated start
Wire.requestFrom(DEVICE_ADDRESS, 1); // Request 1 byte
if (Wire.available()) {
return Wire.read();
}
return 0;
}
void readMultipleBytes(uint8_t reg, uint8_t *buffer, uint8_t length) {
Wire.beginTransmission(DEVICE_ADDRESS);
Wire.write(reg);
Wire.endTransmission(false);
Wire.requestFrom(DEVICE_ADDRESS, length);
for (int i = 0; i < length && Wire.available(); i++) {
buffer[i] = Wire.read();
}
}
void loop() {
uint8_t value = readRegister(0x00);
Serial.print("Register value: 0x");
Serial.println(value, HEX);
delay(1000);
}
STM32 - HAL I2C Implementation
STM32 HAL I2C Configuration
/* I2C1 initialization - Configure via CubeMX */
void I2C_Init(void) {
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // 100 kHz
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c1);
}
/* Write single byte to register */
void I2C_WriteRegister(uint8_t devAddr, uint8_t reg, uint8_t data) {
uint8_t buffer[2];
buffer[0] = reg;
buffer[1] = data;
HAL_I2C_Master_Transmit(&hi2c1, devAddr << 1, buffer, 2, HAL_MAX_DELAY);
}
/* Read single byte from register */
uint8_t I2C_ReadRegister(uint8_t devAddr, uint8_t reg) {
uint8_t data;
HAL_I2C_Mem_Read(&hi2c1, devAddr << 1, reg,
I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY);
return data;
}
/* Read multiple bytes from consecutive registers */
void I2C_ReadMultiple(uint8_t devAddr, uint8_t reg, uint8_t *buffer, uint8_t length) {
HAL_I2C_Mem_Read(&hi2c1, devAddr << 1, reg,
I2C_MEMADD_SIZE_8BIT, buffer, length, HAL_MAX_DELAY);
}
MPU6050 Accelerometer Example
Complete MPU6050 Integration
#include <Wire.h>
#define MPU6050_ADDR 0x68
#define PWR_MGMT_1 0x6B
#define ACCEL_XOUT_H 0x3B
void setup() {
Serial.begin(9600);
Wire.begin();
// Wake up MPU6050
Wire.beginTransmission(MPU6050_ADDR);
Wire.write(PWR_MGMT_1);
Wire.write(0); // Set to zero to wake up
Wire.endTransmission(true);
Serial.println("MPU6050 initialized");
}
void readAccelData(int16_t *ax, int16_t *ay, int16_t *az) {
Wire.beginTransmission(MPU6050_ADDR);
Wire.write(ACCEL_XOUT_H);
Wire.endTransmission(false);
Wire.requestFrom(MPU6050_ADDR, 6, true);
*ax = (Wire.read() << 8) | Wire.read();
*ay = (Wire.read() << 8) | Wire.read();
*az = (Wire.read() << 8) | Wire.read();
}
void loop() {
int16_t ax, ay, az;
readAccelData(&ax, &ay, &az);
Serial.print("X: "); Serial.print(ax);
Serial.print(" | Y: "); Serial.print(ay);
Serial.print(" | Z: "); Serial.println(az);
delay(500);
}