lightradar
Fork of Laster_Radar_test by
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Wed Jul 13 2022 19:27:57 by
1.7.2
