First Commit
[owSlave2.git] / common / I2C / BMP280.c
1 #define F_CPU 8000000UL
2 #include <avr/io.h>
3 #include <avr/interrupt.h>
4 #include <util/delay.h>
5 #include <avr/wdt.h>
6 #include <avr/sleep.h>
7 #include "USI_TWI_Master.h"
8
9 uint16_t dig_T1;
10 int16_t dig_T2;
11 int16_t dig_T3;
12 uint16_t dig_P1;
13 int16_t dig_P2;
14 int16_t dig_P3;
15 int16_t dig_P4;
16 int16_t dig_P5;
17 int16_t dig_P6;
18 int16_t dig_P7;
19 int16_t dig_P8;
20 int16_t dig_P9;
21
22
23
24
25 short bmp280ReadShort(unsigned char address)
26 {
27         char msb, lsb;
28         short data;
29         I2c_StartCondition();
30         I2c_WriteByte(0xEC);
31         I2c_WriteByte(address);
32         I2c_StopCondition();
33         I2c_StartCondition();
34         I2c_WriteByte(0xED);
35         lsb=I2c_ReadByte(ACK);
36         msb=I2c_ReadByte(NO_ACK);
37         I2c_StopCondition();
38         
39
40         
41         data = msb << 8;
42         data |= lsb;
43         
44         return data;
45 }
46
47 void bmp280Init(void) {
48         dig_T1=bmp280ReadShort(0x88);
49         dig_T2=bmp280ReadShort(0x8A);
50         dig_T3=bmp280ReadShort(0x8C);
51         dig_P1=bmp280ReadShort(0x8E);
52         dig_P2=bmp280ReadShort(0x90);
53         dig_P3=bmp280ReadShort(0x92);
54         dig_P4=bmp280ReadShort(0x94);
55         dig_P5=bmp280ReadShort(0x96);
56         dig_P6=bmp280ReadShort(0x98);
57         dig_P7=bmp280ReadShort(0x9A);
58         dig_P8=bmp280ReadShort(0x9C);
59         dig_P9=bmp280ReadShort(0x9E);
60         I2c_StartCondition();
61         I2c_WriteByte(0xEC);
62         I2c_WriteByte(0xF4);
63         I2c_WriteByte(0b01010111); //2x Temp over 16x Press over   Normal mode
64         I2c_WriteByte(0b11100000);  //4s time / no IIfilter
65         I2c_StopCondition();
66         
67         
68 }
69 int32_t bmp280ReadTemp(void) {
70         uint8_t msb, lsb,xlsb;
71         volatile int32_t data;
72         I2c_StartCondition();
73         I2c_WriteByte(0xEC);
74         I2c_WriteByte(0xFA);
75         I2c_StopCondition();
76         I2c_StartCondition();
77         I2c_WriteByte(0xED);
78         msb=I2c_ReadByte(ACK);
79         lsb=I2c_ReadByte(ACK);
80         xlsb=I2c_ReadByte(NO_ACK);
81         I2c_StopCondition();
82                 
83         data = (int32_t)msb << 12;
84         data |= (int16_t)lsb<<4;
85         data|=xlsb>>4;
86                 
87                 return data;
88
89         
90 }
91 int32_t bmp280ReadPressure(uint8_t oss) {
92                 uint8_t msb, lsb,xlsb;
93                 volatile int32_t data;
94                 I2c_StartCondition();
95                 I2c_WriteByte(0xEC);
96                 I2c_WriteByte(0xF7);
97                 I2c_StopCondition();
98                 I2c_StartCondition();
99                 I2c_WriteByte(0xED);
100                 msb=I2c_ReadByte(ACK);
101                 lsb=I2c_ReadByte(ACK);
102                 xlsb=I2c_ReadByte(NO_ACK);
103                 I2c_StopCondition();
104                 
105                 data = (int32_t)msb << 12;
106                 data |= (int16_t)lsb<<4;
107                 data|=xlsb>>4;
108                 
109                 return data;
110
111
112 }
113 void bmp280ConvertInt(int32_t * temperature,uint32_t *pressure,uint8_t oss) {
114         int32_t var1,var2,T,t_fine;
115         
116         
117         int32_t adc_T=bmp280ReadTemp();
118         var1 = ((((adc_T>>3) - ((int32_t)dig_T1<<1))) * ((int32_t)dig_T2)) >> 11;
119         var2 = ((((((adc_T>>4) - ((int32_t)dig_T1)) * ((adc_T>>4) - (int32_t)dig_T1))) >> 12) *((int32_t)dig_T3)) >> 14;
120         t_fine = var1 + var2;
121         T = (t_fine * 5 + 128) >> 8;
122         *temperature=T;
123         int32_t adc_P= bmp280ReadPressure(oss);
124         uint32_t p;
125         var1 = (((int32_t)t_fine)>>1) - (int32_t)64000;
126         var2 = (((var1>>2) * (var1>>2)) >> 11 ) * ((int32_t)dig_P6);
127         var2 = var2 + ((var1*((int32_t)dig_P5))<<1);
128         var2 = (var2>>2)+(((int32_t)dig_P4)<<16);
129         var1 = (((dig_P3 * (((var1>>2) * (var1>>2)) >> 13 )) >> 3) + ((((int32_t)dig_P2) * var1)>>1))>>18;
130         var1 =((((32768+var1))*((int32_t)dig_P1))>>15);
131         if (var1 == 0) {
132                 return ; // avoid exception caused by division by zero
133         }
134         p = (((uint32_t)(((int32_t)1048576)-adc_P)-(var2>>12)))*3125;
135         if (p < 0x80000000){
136                 p = (p << 1) / ((uint32_t)var1);
137                 }else{
138                 p = (p / (uint32_t)var1) * 2;
139         }
140         var1 = (((int32_t)dig_P9) * ((int32_t)(((p>>3) * (p>>3))>>13)))>>12;
141         var2 = (((int32_t)(p>>2)) * ((int32_t)dig_P8))>>13;
142         p = (uint32_t)((int32_t)p + ((var1 + var2 + dig_P7) >> 4));
143         *pressure=p;
144
145 }
146 void bmp280Convert(double * temperature, double * pressure,uint8_t oss) {
147
148         uint32_t p;
149         int32_t T;
150         bmp280ConvertInt(&T,&p,oss);
151         *temperature=T/100.0;
152         *pressure=p/100.0;
153 }
154                 
155                 
156                 
157
158