i2c-bmp280-temperature-6.ino
Demonstrates I2C bus initialization and raw data reading from a BMP280 sensor connected to the Sapphire SoC.
Use the Sapphire RV64 I2C0 interface. Connect SDA and SCL to GPIO pins configured in I2C mode. Ensure external pull-ups are present. The code uses XHAL drivers provided by Efinity. Execute the binary on the RISC-V core via JTAG or 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++);
}
}