Christopher H / Mbed 2 deprecated Laster_Radar_test

Dependencies:   TextLCD mbed

Fork of Laster_Radar_test by Christopher H

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers I2C.cpp Source File

I2C.cpp

00001 #include "I2C.h"
00002 //#include "lcd.h"
00003 //#include "stm32f4xx_i2c.h"
00004 //#include "stm32f4xx_gpio.h"
00005 //#include "stm32f4xx_rcc.h"
00006 BMP180_CAL_DATA_TYPEDEF BMP180_CAL_DATA;
00007 PRESSURE_DATA_TYPEDEF PRESSURE_DATA;
00008 
00009 
00010 void PRESSURE_vInit(void){
00011 
00012   //  uint32_t temp;
00013      uint32_t temp = 0x00;
00014   uint32_t temp_2 = 0x00;
00015 #if 0
00016 RCC->AHB1ENR |= Bit1 ; // GPIOB ENABLE
00017 RCC->APB1ENR |= Bit21 ; // I2C1 clock enable
00018 
00019 GPIOB->MODER |= Bit17 | Bit19 ;  // SET PB8 & PB9 As alternating function
00020 GPIOB->MODER &= ~(Bit16 | Bit18);
00021 GPIOB->AFR[1] |= Bit2 | Bit6 ; // PB8 & PB9 AF4
00022 GPIOB->AFR[1] &= ~(Bit0 | Bit1 | Bit3 |
00023                    Bit4 | Bit5 | Bit7 );
00024 GPIOB->OTYPER |= Bit8 | Bit9 ; // OPEN TRAIN
00025 
00026 
00027 
00028 I2C1->CR2 = 0x0000; // RESET VALUE
00029 //I2C1->CR2 |= Bit1 ;  // PHERIVERIAL CLOCK = 2MHz
00030 I2C1->CR2 |= 0b101010; // SET APB SPEEZ TO 42 MHZ
00031 
00032 I2C1->CCR = 0x0000; // RESET VALUE AND SM MODE // SLOT DUTY MODE
00033 
00034 #if 1
00035 /**GESCHWINDIGKEIT SLOW MODE 100000 HZ*/
00036 I2C1->CCR |= 420; // GESCHWINDIGKEIT 100 000 Hz (42Mhz / 100000)
00037 
00038 I2C1->TRISE = 43; // MAXIMUM RISE TIME AT 42 MHZ
00039 // I2C1->TRISE |= Bit3 | Bit0 ;
00040 
00041 #else
00042 /**GESCHWINDIGKEIT 350 kHz FAST MODE MAX EINSTELLBAR IN PLL CONFIGURATION (MAX 400k nach datenblatt)*/
00043 I2C1->CCR |= Bit15 ; // FAST MODE
00044 I2C1->CCR |= 112 ; // FREQUENCY 375 kHz (42Mhz / 350000Hz) = 120
00045 I2C1->TRISE = 13; // MAXIMUM RISE TIME
00046 #endif
00047 
00048 
00049 I2C1->CR1 = 0x0000;
00050 I2C1->CR1 |= Bit10; // AKNOLAGE ENABLE
00051 
00052 
00053 I2C1->CR1 |= Bit0 ; // ENABLE
00054 I2C1->OAR1 |= Bit15;
00055 
00056 #else
00057 
00058 
00059 
00060 RCC->AHB1ENR |= Bit1 ; // GPIOB ENABLE
00061 RCC->APB1ENR |= Bit21 ; // I2C1 clock enable
00062 
00063 
00064 
00065 
00066 GPIOB->MODER |= Bit17 | Bit19 ;  // SET PB8 & PB9 As alternating function
00067 GPIOB->MODER &= ~(Bit16 | Bit18);
00068 //temp = 0;
00069 //temp
00070 
00071 GPIOB->OTYPER |= Bit8 | Bit9 ; // OPEN TRAIN
00072 GPIOB->OSPEEDR |= Bit17 | Bit19 ;
00073 GPIOB->OSPEEDR &= ~(Bit16 | Bit18 );
00074 
00075 GPIOB->PUPDR &= ~(   Bit16 | Bit17 | Bit18 | Bit19  );
00076 
00077 GPIOB->PUPDR |= Bit16 | Bit18 ;
00078 
00079 
00080 //GPIOB->AFR[1] |= Bit2 | Bit6 ; // PB8 & PB9 AF4
00081 //GPIOB->AFR[1] &= ~(Bit0 | Bit1 | Bit3 |
00082   //                 Bit4 | Bit5 | Bit7 );
00083 
00084 //PIN8
00085   temp = ((uint32_t)(0x04) << ((uint32_t)((uint32_t)0x08 & (uint32_t)0x07) * 4)) ;
00086   GPIOB->AFR[0x08 >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)0x08 & (uint32_t)0x07) * 4)) ;
00087   temp_2 = GPIOB->AFR[0x08 >> 0x03] | temp;
00088   GPIOB->AFR[0x08 >> 0x03] = temp_2;
00089 
00090 
00091 //PIN9
00092  temp = ((uint32_t)(0x04) << ((uint32_t)((uint32_t)0x09 & (uint32_t)0x07) * 4)) ;
00093   GPIOB->AFR[0x09 >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)0x09 & (uint32_t)0x07) * 4)) ;
00094   temp_2 = GPIOB->AFR[0x09 >> 0x03] | temp;
00095   GPIOB->AFR[0x09 >> 0x03] = temp_2;
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 I2C1->CR2 = 0x0000; // RESET VALUE
00104 //I2C1->CR2 |= Bit1 ;  // PHERIVERIAL CLOCK = 2MHz
00105 //I2C1->CR2 |= 0b101010; // SET APB SPEEZ TO 42 MHZ
00106 I2C1->CR2 |= 0x2A; // SET APB SPEEZ TO 42 MHZ
00107 I2C1->CCR = 0x0000; // RESET VALUE AND SM MODE // SLOT DUTY MODE
00108 
00109 #if 1
00110 /**GESCHWINDIGKEIT SLOW MODE 100000 HZ*/
00111 I2C1->CCR |= 420; // GESCHWINDIGKEIT 100 000 Hz (42Mhz / 100000)
00112 
00113 I2C1->TRISE = 43; // MAXIMUM RISE TIME AT 42 MHZ
00114 // I2C1->TRISE |= Bit3 | Bit0 ;
00115 
00116 #else
00117 /**GESCHWINDIGKEIT 350 kHz FAST MODE MAX EINSTELLBAR IN PLL CONFIGURATION (MAX 400k nach datenblatt)*/
00118 I2C1->CCR |= Bit15 ; // FAST MODE
00119 I2C1->CCR |= 112 ; // FREQUENCY 375 kHz (42Mhz / 350000Hz) = 120
00120 I2C1->TRISE = 13; // MAXIMUM RISE TIME
00121 #endif
00122 
00123 
00124 I2C1->CR1 = 0x0000;
00125 I2C1->CR1 |= Bit10; // AKNOLAGE ENABLE
00126 
00127 
00128 I2C1->CR1 |= Bit0 ; // ENABLE
00129 I2C1->OAR1 |= Bit15;
00130 
00131 
00132 
00133 #endif
00134 
00135 
00136 
00137 //PRESSURE_vget_CALDATA();
00138 }
00139 
00140 
00141 void PRESSURE_vTASK(unsigned long  bID){
00142 switch(PRESSURE_DATA.b_TASK_STATEMASCHINE){
00143 case 0:
00144 /**START TEMPERATUR MEASUREMENT*/
00145 PRESSURE_vwrite_EEPROM_REGISTER(BMP180_register_CONTROLL,0x2E); // TEMPERATUR MEASUREMENT
00146 PRESSURE_DATA.b_TASK_STATEMASCHINE = 1;
00147     break;
00148 case 1:
00149 /** REAT TEMP_DATA*/
00150 PRESSURE_DATA.i_RAW_TEMPERATUR = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_ADC_ERG);
00151 PRESSURE_DATA.b_TASK_STATEMASCHINE = 2;
00152 break;
00153 case 2:
00154 /**START PRESSURE MEASUREMENT*/
00155 PRESSURE_vwrite_EEPROM_REGISTER(BMP180_register_CONTROLL,0xB4); // HIGH RESULUTUIN
00156 PRESSURE_DATA.b_TASK_STATEMASCHINE = 3;
00157 break;
00158 case 3:
00159 /**REAT PRESSURE DATA*/
00160 PRESSURE_DATA.i_RAW_PRESSURE =   ( (PRESSURE_vread_EEPROM_REGISTER(BMP180_register_ADC_ERG))<<8 ) >>(8-BMP180_oss_high_resulution );
00161 //PRESSURE_DATA.b_TASK_STATEMASCHINE = 2;
00162 
00163 PRESSURE_DATA.b_TASK_STATEMASCHINE = 4;
00164     break;
00165 case 4:
00166 /**KALCULATE TEMPERATUR AND PRESSURE*/
00167 PRESSURE_vCALCULATE_TEMPANDPRESSURE();
00168 PRESSURE_DATA.b_TASK_STATEMASCHINE = 0;
00169     break;
00170 default: PRESSURE_DATA.b_TASK_STATEMASCHINE = 0;
00171 }
00172 
00173 
00174 }
00175 
00176 
00177 void PRESSURE_vCALCULATE_TEMPANDPRESSURE(void){
00178 long X1,X2,B5,B6,X3,B3,p ;
00179 unsigned long B4,B7;
00180 
00181 X1 = (  PRESSURE_DATA.i_RAW_TEMPERATUR - BMP180_CAL_DATA.AC6 ) * BMP180_CAL_DATA.AC5 / 0x8000 ;
00182 X2 = (  BMP180_CAL_DATA.MC * 0x800     )/(X1 + BMP180_CAL_DATA.MD);
00183 B5 = (  X1 + X2 );
00184 
00185 PRESSURE_DATA.i_TEMPERATURE = (  B5 + 8  )/ 0x10;
00186 
00187 B6 = B5 - 4000;
00188 
00189 X1  = (  BMP180_CAL_DATA.B2  *(  B6*B6/ 0x1000  )) /0x800;
00190 
00191 X2 = (  BMP180_CAL_DATA.AC2 * B6)/0x800;
00192 
00193 X3 = X1 + X2;
00194 
00195 B3 = (((   BMP180_CAL_DATA.AC1 * 4 + X3) << BMP180_oss_high_resulution)+2)/4;
00196 
00197 X1 = BMP180_CAL_DATA.AC3 * B6 / 0x2000;
00198 
00199 X2 = (   BMP180_CAL_DATA.B1 * ( B6*B6 / 0x1000))/ 0x10000;
00200 
00201 X3 = ((X1+X2)+2)/ 0x4;
00202 
00203 B4 = BMP180_CAL_DATA.AC4 * (unsigned long)(X3 + 32768)/ 0x8000  ;
00204 
00205 B7 = ( (unsigned long) PRESSURE_DATA.i_RAW_PRESSURE - B3)*(50000 >> BMP180_oss_high_resulution);
00206 
00207 //p = (B7 / B4 )*2;
00208 if( B7 <   0x80000000 ) p=(B7 * 2 )/B4;
00209 else p = (B7 / B4 )*2;
00210 
00211 X1 = ( p/0x100)*(p/0x100);
00212 
00213 X1 = (X1 * 3038)/ 0x10000;
00214 
00215 X2 = (-7357 * p)/ 0x10000;
00216 
00217 p = p + (X1 + X2 + 3791) / 0x10 ;
00218 
00219 PRESSURE_DATA.i_PRESSURE = p;
00220 }
00221 
00222 
00223 
00224 
00225 void PRESSURE_vget_CALDATA(void){
00226 //LCD_vDrawString("PRESSURE-i2C2\0",100,80,1,0x0000);
00227 
00228  BMP180_CAL_DATA.AC1 =  PRESSURE_vread_EEPROM_REGISTER(BMP180_register_AC1);
00229  //LCD_vDrawString("PRESSURE-i2C3\0",100,60,1,0x0000);
00230 
00231  BMP180_CAL_DATA.AC2 = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_AC2);
00232  BMP180_CAL_DATA.AC3 =  PRESSURE_vread_EEPROM_REGISTER(BMP180_register_AC3);
00233  BMP180_CAL_DATA.AC4 =  PRESSURE_vread_EEPROM_REGISTER(BMP180_register_AC4);
00234  BMP180_CAL_DATA.AC5 =  PRESSURE_vread_EEPROM_REGISTER(BMP180_register_AC5);
00235  BMP180_CAL_DATA.AC6 =  PRESSURE_vread_EEPROM_REGISTER(BMP180_register_AC6);
00236  BMP180_CAL_DATA.B1 =  PRESSURE_vread_EEPROM_REGISTER(BMP180_register_B1);
00237  BMP180_CAL_DATA.B2 =  PRESSURE_vread_EEPROM_REGISTER(BMP180_register_B2);
00238  BMP180_CAL_DATA.MB =  PRESSURE_vread_EEPROM_REGISTER(BMP180_register_MB);
00239  BMP180_CAL_DATA.MC =  PRESSURE_vread_EEPROM_REGISTER(BMP180_register_MC);
00240  BMP180_CAL_DATA.MD =  PRESSURE_vread_EEPROM_REGISTER(BMP180_register_MD);
00241 }
00242 
00243 
00244 /***EVT NOCH EIN ABSTURZ KRITERIUM */
00245 long PRESSURE_vread_EEPROM_REGISTER(byte b_register){
00246 
00247 /**EINLESEN VON ADC WERTEN ODER EEPORM DATEN  */
00248 uint16_t local;
00249 uint16_t MSB,LSB;
00250 I2C1->CR1 |= Bit8; // ERZEUGEN STARTKONDITION
00251  //LCD_vDrawString("START\0",2,40,1,0x0000);
00252 
00253 while((I2C1->SR1 & Bit0) == 0 );  // WHAITING START BIT GENERAITET
00254 I2C1->DR = BMP180_adress_write;
00255 
00256  //LCD_vDrawString("START-G\0",50,40,1,0x0000);
00257 
00258 
00259 while((I2C1->SR1 & Bit1) == 0 );  // WHAITING ADDR = 1
00260 
00261 local = I2C1->SR2 ; // READ SR2 for Delete ADDR
00262 
00263 I2C1->DR = b_register;
00264 
00265 while( ((I2C1->SR1 & Bit7) == 0) && ((I2C1->SR1 & Bit2) == 0 ));  // WHAITING Data register Empte
00266 
00267 I2C1->CR1 |= Bit9;
00268 
00269 // GGF WEGMACHEN
00270 for(local = 0; local <1000;local++); // WAIT TIME
00271 
00272 
00273 I2C1->CR1 |= Bit10; // AKNOLLAGE ENABLE ;
00274 
00275 I2C1->CR1 |= Bit8; // ERZEUGEN STARTKONDITION
00276 
00277 while((I2C1->SR1 & Bit0) == 0 );  // WHAITING START BIT GENERAITET
00278 
00279 I2C1->DR = BMP180_adress_read;
00280 
00281 while((I2C1->SR1 & Bit1) == 0 );  // WHAITING ADDR = 1
00282 
00283 local = I2C1->SR2 ; // READ SR2 for Delete ADDR
00284 
00285 while( (I2C1->SR1 & Bit6 )== 0 ); // WHAIT DATA TRANSMIT
00286 
00287 MSB = I2C1->DR ;
00288 I2C1->CR1 &= ~Bit10; // NO ACNOLAGE BECAUSE LAST  BYTE
00289 I2C1->CR1 |= Bit9; // STOP BETWEEN THE CURRENT TRANSFER
00290 while( (I2C1->SR1 & Bit6 )== 0 ); // WHAIT DATA TRANSMIT
00291 LSB = I2C1->DR ;
00292 
00293 return (MSB<<8)|LSB ;
00294 }
00295 
00296 
00297 
00298 
00299 void PRESSURE_vwrite_EEPROM_REGISTER(byte b_register, byte data){
00300 uint16_t local;
00301 
00302 I2C1->CR1 |= Bit8; // START KONDITION
00303 
00304 while((I2C1->SR1 & Bit0) == 0 );  // WHAITING START BIT GENERAITET
00305 /**SENDEN ADRESSE */
00306 I2C1->DR = BMP180_adress_write;
00307 
00308 while((I2C1->SR1 & Bit1) == 0 );  // WHAITING ADDR = 1
00309 
00310 local = I2C1->SR2 ; // READ SR2 for Delete ADDR
00311 
00312 
00313 /**Senden erstes PACKET*/
00314 I2C1->DR = b_register;
00315 
00316 while((I2C1->SR1 & Bit7) == 0 );  // WHAITING Data register Empte
00317 
00318 //local = I2C1->SR2 ; // READ SR2 for Delete ADDR
00319 /**SENDEN Zweites Packet */
00320 I2C1->DR = data;
00321 while( ((I2C1->SR1 & Bit7) == 0) && ((I2C1->SR1 & Bit2) == 0 ));  // WHAITING Data register Empte
00322 /**STOP CONDITION */
00323 I2C1->CR1 |= Bit9;
00324 }
00325 
00326 
00327 
00328 
00329 
00330 byte I2C_write(byte bSlaveWriteAdress, byte bRegister, byte bValue){
00331 uint16_t local;
00332 I2C1->CR1 |= Bit8; // START KONDITION
00333 
00334 while((I2C1->SR1 & Bit0) == 0 );  // WHAITING START BIT GENERAITET
00335 /**SENDEN ADRESSE */
00336 I2C1->DR = bSlaveWriteAdress;
00337 
00338 while((I2C1->SR1 & Bit1) == 0 );  // WHAITING ADDR = 1
00339 
00340 local = I2C1->SR2 ; // READ SR2 for Delete ADDR
00341 
00342 
00343 /**Senden erstes PACKET*/
00344 I2C1->DR = bRegister;
00345 
00346 while((I2C1->SR1 & Bit7) == 0 );  // WHAITING Data register Empte
00347 
00348 //local = I2C1->SR2 ; // READ SR2 for Delete ADDR
00349 /**SENDEN Zweites Packet */
00350 I2C1->DR = bValue;
00351 while( ((I2C1->SR1 & Bit7) == 0) && ((I2C1->SR1 & Bit2) == 0 ));  // WHAITING Data register Empte
00352 /**STOP CONDITION */
00353 I2C1->CR1 |= Bit9;
00354 
00355 
00356 return 1;
00357     }
00358 
00359 
00360 
00361 
00362 
00363 
00364 byte I2C_read(byte bSlaveWriteAdress,byte bSlaveReadAdress, byte bRegister, byte bNumOfBytes, byte *abArray){ 
00365 /**EINLESEN VON ADC WERTEN ODER EEPORM DATEN  */
00366 uint16_t local;
00367 byte i;
00368 
00369 /*******************************************************/
00370 // SEKTION 1 Auswahl des Registes durch write befehl
00371 /*********************************************************/
00372 I2C1->CR1 |= Bit8; // ERZEUGEN STARTKONDITION
00373 while((I2C1->SR1 & Bit0) == 0 );  // WHAITING START BIT GENERAITET
00374 I2C1->DR = bSlaveWriteAdress;
00375 while((I2C1->SR1 & Bit1) == 0 );  // WHAITING ADDR = 1
00376 local = I2C1->SR2 ; // READ SR2 for Delete ADDR
00377 I2C1->DR = bRegister;
00378 while( ((I2C1->SR1 & Bit7) == 0) && ((I2C1->SR1 & Bit2) == 0 ));  // WHAITING Data register Empte
00379 I2C1->CR1 |= Bit9;
00380 // GGF WEGMACHEN
00381 for(local = 0; local <1000;local++); // WAIT TIME
00382 
00383 
00384 /*******************************************************/
00385 // SEKTION 2 Eigentliches Auslesen der Werte 
00386 /*********************************************************/
00387 
00388 I2C1->CR1 |= Bit10; // AKNOLLAGE ENABLE ;
00389 I2C1->CR1 |= Bit8; // ERZEUGEN STARTKONDITION
00390 while((I2C1->SR1 & Bit0) == 0 );  // WHAITING START BIT GENERAITET
00391 I2C1->DR = bSlaveReadAdress;
00392 while((I2C1->SR1 & Bit1) == 0 );  // WHAITING ADDR = 1
00393 local = I2C1->SR2 ; // READ SR2 for Delete ADDR
00394 
00395 for(i=0; i< bNumOfBytes-1; i++){
00396 while( (I2C1->SR1 & Bit6 )== 0 ); // WHAIT DATA TRANSMIT
00397 abArray[i] = I2C1->DR ;
00398 }
00399 i= bNumOfBytes-1;
00400 I2C1->CR1 &= ~Bit10; // NO ACNOLAGE BECAUSE LAST  BYTE
00401 I2C1->CR1 |= Bit9; // STOP BETWEEN THE CURRENT TRANSFER
00402 while( (I2C1->SR1 & Bit6 )== 0 ); // WHAIT DATA TRANSMIT
00403 abArray[i] = I2C1->DR ;
00404 
00405 
00406 return 1;
00407 }
00408 
00409