i2c-imu-sensor-driver-10.ino
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, ®, 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, ®, 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);
}
}