i2c-imu-sensor-driver-10.ino

HPMicro HPM5100: Microcontrolador RISC-V de 400 MHz con analógica integrada · Archivo : i2c-imu-sensor-driver-10.ino · Lenguaje : C · Uso : Lire les données d'un capteur MPU6050 via l'interface I2C0 pour la détection de mouvement.

Configura I2C0 como maestro a 400kHz para comunicarse con un acelerómetro MPU6050 estándar.

Hardware: Conecte SCL al Pin I2C0_SCL de HP5100 (generalmente Pin 24 o 25 según configuración SDK) y SDA a I2C0_SDA. Alimente el sensor con 3.3V. Habilite el muxing de pines I2C en el archivo de configuración de pines del SDK. Use el módulo 'hpm_i2c' del SDK. Verifique la dirección I2C 0x68 en el 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);
    }
}

← Volver a la ficha