Spi protokol za senzor bmp280

SPI_MJERENJE.cpp

Committer:
robert_musulin
Date:
2021-01-18
Revision:
0:37ca398d1b7f

File content as of revision 0:37ca398d1b7f:



#include "mbed.h"
#include "SPI_MJERENJE.h"
 
SPI_mjeri::SPI_mjeri(PinName MOSI, PinName MISO, PinName SCL, PinName SS)  // definiranje konstruktora
    :
    spi(MOSI, MISO, SCL),
    ss(SS)  
       

 { inicijalizacija(); // opoziv funkcije za inicijaliziranje
}

void SPI_mjeri::inicijalizacija()       // konstruktor za inicijalizaciju
{
    
    spi.format(8, 0); // 8-bitni podatak, mod 0
    
    spi.frequency(100000); // 100 khhz frekvencija rada
    ss=0;
    spi.write(0xF5); // Registar „config“ postavlja brzinu, filtar i opcije sučelja uređaja.
    spi.write(0b11000000); // Standby 2000ms, bez filtra, 4-zicni SPI sučelje
    spi.write(0xF4); //Registar „ctrl_meas“ postavlja mogućnosti prikupljanja podataka uređaja
     spi.write(0b01100011); // Temparature oversampling x4, Normal mode
    spi.write(0xF3); //Registar „status“ postavlja bitove za indikaciju
     spi.write(0b0);
    ss = 1;
    
    }
 
float SPI_mjeri::izmjeri() //funkcija sa kompenzacijskom formulom iz datasheeta sa stranice 22
{
    
    int32_t temp_raw, var1, var2, temp,t_fine;
    float tempf;
    char dat[3];
    char reg[6];
    
     ss = 0;
    spi.write(0x88); // citanje dig_T registara temperetare 0x88 je adresa LSBa
    for(int i = 0; i < 6; i++)
        reg[i] = spi.write(0); // slanje dummy podataka
    ss = 1;
 
 
    dig_T1 = (reg[1] << 8) | reg[0]; //zapisivanje 8 bitnog podatka u 16 bitova
     dig_T2 = (reg[3] << 8) | reg[2];
      dig_T3 = (reg[5] << 8) | reg[4];
    
    
    
    ss = 0;
    spi.write(0xFA); // adresa registra MSB raw dijela podatka
    for(int i = 0; i < 3; i++)
        dat[i] = spi.write(0);
    ss = 1;
    temp_raw = (dat[0] << 12) | (dat[1] << 4) | (dat[2] >> 4);
    var1 = ((((temp_raw >> 3) - (dig_T1 << 1))) * dig_T2) >> 11;
    var2 = (((((temp_raw >> 4) - dig_T1) * ((temp_raw >> 4) - dig_T1)) >> 12) * dig_T3) >> 14;
    t_fine = var1 + var2;
    temp = (t_fine * 5 + 128) >> 8;
    tempf = (float)temp;
    return (tempf/100.0f);
}