Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Laster_Radar_test by
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
