i2c-bmp280-temperature-6.ino

Efinix Sapphire RV64 : Configurable 64-bit RISC-V SoC for FPGAs · File : i2c-bmp280-temperature-6.ino · Language : C · Use case : Lire la température et la pression d'un capteur BMP280 via un bus I2C.

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++);
    }
}

← Back to the board