i2c-imu-sensor-driver-10.ino

HPMicro HPM5100: 400 MHz RISC-V MCU with Integrated Analog Peripherals · File : i2c-imu-sensor-driver-10.ino · Language : C · Use case : Lire les données d'un capteur MPU6050 via l'interface I2C0 pour la détection de mouvement.

Configures I2C0 as master at 400kHz to communicate with a standard MPU6050 accelerometer.

Hardware: Connect SCL to HP5100 Pin I2C0_SCL (usually Pin 24 or 25 per SDK config) and SDA to I2C0_SDA. Power sensor with 3.3V. Enable I2C pin muxing in SDK pin configuration file. Use 'hpm_i2c' SDK module. Verify I2C address 0x68 on bus.

i2c-imu-sensor-driver-10.ino

#include "board.h"
#include "driver/i2c.h"
#include "driver/i2c_pins.h"
#include <stdlib.h>

// MPU6050 I2C Address
#define MPU6050_ADDR 0x68
#define I2C_CLK_FREQ 400000 // 400kHz

void i2c0_init(void) {
    /* Enable clock */
    clock_add_to_group(clock_i2c0, 0);
    /* Configure I2C Pins */
    i2c_pin_init(I2C0, GPIOI, GpiPins);
    /* Configure I2C Mode */
    i2c_mode_t mode;
    i2c_mode_init(&mode);
    mode.bus_speed = I2C_CLK_FREQ;
    mode.slave_address = 0; /* Master mode */
    i2c_mode_config(I2C0, mode);
    i2c_enable(I2C0, true);
}

uint8_t i2c_read_reg(uint8_t reg) {
    uint8_t data;
    uint32_t i2c_err;
    
    i2c_err = i2c_write(I2C0, MPU6050_ADDR << 1, &reg, 1, kStatus_I2C_Busy, NULL);
    if (i2c_err != kStatus_I2C_Success) return 0xFF;
    
    i2c_err = i2c_read(I2C0, (MPU6050_ADDR << 1) | 1, &data, 1, kStatus_I2C_Busy, NULL);
    if (i2c_err != kStatus_I2C_Success) return 0xFF;
    return data;
}

void i2c_write_reg(uint8_t reg, uint8_t data) {
    i2c_write(I2C0, MPU6050_ADDR << 1, &reg, 1, kStatus_I2C_Busy, NULL);
    i2c_write(I2C0, MPU6050_ADDR << 1, &data, 1, kStatus_I2C_Busy, NULL);
}

int main(void) {
    uint8_t whoami;
    board_init();
    hpm_clock_init();
    i2c0_init();
    
    // Wake up MPU6050
    i2c_write_reg(0x6B, 0x00);
    
    while(1) {
        whoami = i2c_read_reg(0x75); // WHO_AM_I register
        if (whoami == 0x68) {
            // Sensor found, read Accel X High
            uint8_t accel_high = i2c_read_reg(0x3B);
            // Process data...
        }
        delay_ms(100);
    }
}

← Back to the board