i2c-imu-sensor-driver-10.ino

HPMicro HPM5100 : Microcontrôleur RISC-V 400 MHz avec analogique intégré · Fichier : i2c-imu-sensor-driver-10.ino · Langage : C · Usage : Lire les données d'un capteur MPU6050 via l'interface I2C0 pour la détection de mouvement.

Configure l'I2C0 en maître à 400kHz pour communiquer avec un accéléromètre MPU6050 standard.

Matériel : Connectez SCL à HP5100 Pin I2C0_SCL (généralement Pin 24 ou 25 selon SDK config) et SDA à I2C0_SDA. Alimentez le capteur en 3.3V. Activez l'héritage des pins I2C dans le fichier de configuration des broches du SDK. Utilisez le module 'hpm_i2c' du SDK. Vérifiez l'adresse I2C 0x68 sur le 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);
    }
}

← Retour à la fiche