i2c-bmp280-temperature-6.ino

Efinix Sapphire RV64: SoC RISC-V de 64 bits configurable para FPGA · Archivo : i2c-bmp280-temperature-6.ino · Lenguaje : C · Uso : Lire la température et la pression d'un capteur BMP280 via un bus I2C.

Demuestra la inicialización del bus I2C y la lectura de datos sin procesar desde un sensor BMP280 conectado al SoC Sapphire.

Utilice la interfaz I2C0 de Sapphire RV64. Conecte SDA y SCL a los pines GPIO configurados en modo I2C. Asegúrese de que haya resistencias de pull-up externas. El código utiliza los controladores XHAL proporcionados por Efinity. Ejecute el binario en el núcleo RISC-V mediante JTAG o 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++);
    }
}

← Volver a la ficha