i2c-bmp280-temperature-6.ino
Démontre l'initialisation du bus I2C et la lecture de données brutes depuis un capteur BMP280 connecté au SoC Sapphire.
Utilisez l'interface I2C0 du Sapphire RV64. Connectez SDA et SCL aux broches GPIO configurées en mode I2C. Assurez-vous que les pull-ups externes sont présents. Le code utilise les drivers XHAL fournis par Efinity. Exécutez le binaire sur le RISC-V core via JTAG ou UART.
i2c-bmp280-temperature-6.ino
#include <stdio.h>
#include "xhal_i2c.h"
#include "xhal_gpio.h"
#define I2C_INSTANCE XHAL_I2C0
#define BMP280_ADDR 0x76
#define REG_TEMP_MSB 0xFA
#define REG_PRESS_MSB 0xF7
#define REG_CALIB 0x88
static void bmp280_init(void) {
uint8_t calib[24];
// Lire les données de calibration
xhal_i2c_read(I2C_INSTANCE, (uint8_t[]){REG_CALIB}, 1, calib, 24, 10);
// Configurer le mode forcé (simulé ici par un registre de contrôle simplifié pour l'exemple)
uint8_t ctrl_meas = 0x27; // OSRS=16, OSS=1, MODE=Normal
xhal_i2c_write(I2C_INSTANCE, (uint8_t[]){0xF4, ctrl_meas}, 2, 10);
}
float bmp280_read_temp(void) {
uint8_t data[3];
xhal_i2c_read(I2C_INSTANCE, (uint8_t[]){REG_TEMP_MSB}, 1, data, 3, 10);
uint32_t adc_p = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4);
// Formule simplifiée pour l'exemple (nécessite la formule précise du datasheet avec calibration)
return (adc_p / 100.0f) - 50.0f;
}
int main(void) {
xhal_gpio_init();
xhal_i2c_init(I2C_INSTANCE, 400000, 100); // 400kHz, 50% duty
bmp280_init();
while(1) {
float temp = bmp280_read_temp();
printf("Temp: %.2f C\n", temp);
// Delay simplifié
for(volatile int i=0; i<1000000; i++);
}
}