Christopher H
/
Laster_Radar_test
lightradar
Fork of Laster_Radar_test by
I2C.cpp
- Committer:
- chrish
- Date:
- 2015-11-23
- Revision:
- 2:4d8ef1799adc
- Parent:
- 0:36109edfc712
File content as of revision 2:4d8ef1799adc:
#include "I2C.h" //#include "lcd.h" //#include "stm32f4xx_i2c.h" //#include "stm32f4xx_gpio.h" //#include "stm32f4xx_rcc.h" BMP180_CAL_DATA_TYPEDEF BMP180_CAL_DATA; PRESSURE_DATA_TYPEDEF PRESSURE_DATA; void PRESSURE_vInit(void){ // uint32_t temp; uint32_t temp = 0x00; uint32_t temp_2 = 0x00; #if 0 RCC->AHB1ENR |= Bit1 ; // GPIOB ENABLE RCC->APB1ENR |= Bit21 ; // I2C1 clock enable GPIOB->MODER |= Bit17 | Bit19 ; // SET PB8 & PB9 As alternating function GPIOB->MODER &= ~(Bit16 | Bit18); GPIOB->AFR[1] |= Bit2 | Bit6 ; // PB8 & PB9 AF4 GPIOB->AFR[1] &= ~(Bit0 | Bit1 | Bit3 | Bit4 | Bit5 | Bit7 ); GPIOB->OTYPER |= Bit8 | Bit9 ; // OPEN TRAIN I2C1->CR2 = 0x0000; // RESET VALUE //I2C1->CR2 |= Bit1 ; // PHERIVERIAL CLOCK = 2MHz I2C1->CR2 |= 0b101010; // SET APB SPEEZ TO 42 MHZ I2C1->CCR = 0x0000; // RESET VALUE AND SM MODE // SLOT DUTY MODE #if 1 /**GESCHWINDIGKEIT SLOW MODE 100000 HZ*/ I2C1->CCR |= 420; // GESCHWINDIGKEIT 100 000 Hz (42Mhz / 100000) I2C1->TRISE = 43; // MAXIMUM RISE TIME AT 42 MHZ // I2C1->TRISE |= Bit3 | Bit0 ; #else /**GESCHWINDIGKEIT 350 kHz FAST MODE MAX EINSTELLBAR IN PLL CONFIGURATION (MAX 400k nach datenblatt)*/ I2C1->CCR |= Bit15 ; // FAST MODE I2C1->CCR |= 112 ; // FREQUENCY 375 kHz (42Mhz / 350000Hz) = 120 I2C1->TRISE = 13; // MAXIMUM RISE TIME #endif I2C1->CR1 = 0x0000; I2C1->CR1 |= Bit10; // AKNOLAGE ENABLE I2C1->CR1 |= Bit0 ; // ENABLE I2C1->OAR1 |= Bit15; #else RCC->AHB1ENR |= Bit1 ; // GPIOB ENABLE RCC->APB1ENR |= Bit21 ; // I2C1 clock enable GPIOB->MODER |= Bit17 | Bit19 ; // SET PB8 & PB9 As alternating function GPIOB->MODER &= ~(Bit16 | Bit18); //temp = 0; //temp GPIOB->OTYPER |= Bit8 | Bit9 ; // OPEN TRAIN GPIOB->OSPEEDR |= Bit17 | Bit19 ; GPIOB->OSPEEDR &= ~(Bit16 | Bit18 ); GPIOB->PUPDR &= ~( Bit16 | Bit17 | Bit18 | Bit19 ); GPIOB->PUPDR |= Bit16 | Bit18 ; //GPIOB->AFR[1] |= Bit2 | Bit6 ; // PB8 & PB9 AF4 //GPIOB->AFR[1] &= ~(Bit0 | Bit1 | Bit3 | // Bit4 | Bit5 | Bit7 ); //PIN8 temp = ((uint32_t)(0x04) << ((uint32_t)((uint32_t)0x08 & (uint32_t)0x07) * 4)) ; GPIOB->AFR[0x08 >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)0x08 & (uint32_t)0x07) * 4)) ; temp_2 = GPIOB->AFR[0x08 >> 0x03] | temp; GPIOB->AFR[0x08 >> 0x03] = temp_2; //PIN9 temp = ((uint32_t)(0x04) << ((uint32_t)((uint32_t)0x09 & (uint32_t)0x07) * 4)) ; GPIOB->AFR[0x09 >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)0x09 & (uint32_t)0x07) * 4)) ; temp_2 = GPIOB->AFR[0x09 >> 0x03] | temp; GPIOB->AFR[0x09 >> 0x03] = temp_2; I2C1->CR2 = 0x0000; // RESET VALUE //I2C1->CR2 |= Bit1 ; // PHERIVERIAL CLOCK = 2MHz //I2C1->CR2 |= 0b101010; // SET APB SPEEZ TO 42 MHZ I2C1->CR2 |= 0x2A; // SET APB SPEEZ TO 42 MHZ I2C1->CCR = 0x0000; // RESET VALUE AND SM MODE // SLOT DUTY MODE #if 1 /**GESCHWINDIGKEIT SLOW MODE 100000 HZ*/ I2C1->CCR |= 420; // GESCHWINDIGKEIT 100 000 Hz (42Mhz / 100000) I2C1->TRISE = 43; // MAXIMUM RISE TIME AT 42 MHZ // I2C1->TRISE |= Bit3 | Bit0 ; #else /**GESCHWINDIGKEIT 350 kHz FAST MODE MAX EINSTELLBAR IN PLL CONFIGURATION (MAX 400k nach datenblatt)*/ I2C1->CCR |= Bit15 ; // FAST MODE I2C1->CCR |= 112 ; // FREQUENCY 375 kHz (42Mhz / 350000Hz) = 120 I2C1->TRISE = 13; // MAXIMUM RISE TIME #endif I2C1->CR1 = 0x0000; I2C1->CR1 |= Bit10; // AKNOLAGE ENABLE I2C1->CR1 |= Bit0 ; // ENABLE I2C1->OAR1 |= Bit15; #endif //PRESSURE_vget_CALDATA(); } void PRESSURE_vTASK(unsigned long bID){ switch(PRESSURE_DATA.b_TASK_STATEMASCHINE){ case 0: /**START TEMPERATUR MEASUREMENT*/ PRESSURE_vwrite_EEPROM_REGISTER(BMP180_register_CONTROLL,0x2E); // TEMPERATUR MEASUREMENT PRESSURE_DATA.b_TASK_STATEMASCHINE = 1; break; case 1: /** REAT TEMP_DATA*/ PRESSURE_DATA.i_RAW_TEMPERATUR = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_ADC_ERG); PRESSURE_DATA.b_TASK_STATEMASCHINE = 2; break; case 2: /**START PRESSURE MEASUREMENT*/ PRESSURE_vwrite_EEPROM_REGISTER(BMP180_register_CONTROLL,0xB4); // HIGH RESULUTUIN PRESSURE_DATA.b_TASK_STATEMASCHINE = 3; break; case 3: /**REAT PRESSURE DATA*/ PRESSURE_DATA.i_RAW_PRESSURE = ( (PRESSURE_vread_EEPROM_REGISTER(BMP180_register_ADC_ERG))<<8 ) >>(8-BMP180_oss_high_resulution ); //PRESSURE_DATA.b_TASK_STATEMASCHINE = 2; PRESSURE_DATA.b_TASK_STATEMASCHINE = 4; break; case 4: /**KALCULATE TEMPERATUR AND PRESSURE*/ PRESSURE_vCALCULATE_TEMPANDPRESSURE(); PRESSURE_DATA.b_TASK_STATEMASCHINE = 0; break; default: PRESSURE_DATA.b_TASK_STATEMASCHINE = 0; } } void PRESSURE_vCALCULATE_TEMPANDPRESSURE(void){ long X1,X2,B5,B6,X3,B3,p ; unsigned long B4,B7; X1 = ( PRESSURE_DATA.i_RAW_TEMPERATUR - BMP180_CAL_DATA.AC6 ) * BMP180_CAL_DATA.AC5 / 0x8000 ; X2 = ( BMP180_CAL_DATA.MC * 0x800 )/(X1 + BMP180_CAL_DATA.MD); B5 = ( X1 + X2 ); PRESSURE_DATA.i_TEMPERATURE = ( B5 + 8 )/ 0x10; B6 = B5 - 4000; X1 = ( BMP180_CAL_DATA.B2 *( B6*B6/ 0x1000 )) /0x800; X2 = ( BMP180_CAL_DATA.AC2 * B6)/0x800; X3 = X1 + X2; B3 = ((( BMP180_CAL_DATA.AC1 * 4 + X3) << BMP180_oss_high_resulution)+2)/4; X1 = BMP180_CAL_DATA.AC3 * B6 / 0x2000; X2 = ( BMP180_CAL_DATA.B1 * ( B6*B6 / 0x1000))/ 0x10000; X3 = ((X1+X2)+2)/ 0x4; B4 = BMP180_CAL_DATA.AC4 * (unsigned long)(X3 + 32768)/ 0x8000 ; B7 = ( (unsigned long) PRESSURE_DATA.i_RAW_PRESSURE - B3)*(50000 >> BMP180_oss_high_resulution); //p = (B7 / B4 )*2; if( B7 < 0x80000000 ) p=(B7 * 2 )/B4; else p = (B7 / B4 )*2; X1 = ( p/0x100)*(p/0x100); X1 = (X1 * 3038)/ 0x10000; X2 = (-7357 * p)/ 0x10000; p = p + (X1 + X2 + 3791) / 0x10 ; PRESSURE_DATA.i_PRESSURE = p; } void PRESSURE_vget_CALDATA(void){ //LCD_vDrawString("PRESSURE-i2C2\0",100,80,1,0x0000); BMP180_CAL_DATA.AC1 = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_AC1); //LCD_vDrawString("PRESSURE-i2C3\0",100,60,1,0x0000); BMP180_CAL_DATA.AC2 = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_AC2); BMP180_CAL_DATA.AC3 = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_AC3); BMP180_CAL_DATA.AC4 = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_AC4); BMP180_CAL_DATA.AC5 = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_AC5); BMP180_CAL_DATA.AC6 = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_AC6); BMP180_CAL_DATA.B1 = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_B1); BMP180_CAL_DATA.B2 = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_B2); BMP180_CAL_DATA.MB = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_MB); BMP180_CAL_DATA.MC = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_MC); BMP180_CAL_DATA.MD = PRESSURE_vread_EEPROM_REGISTER(BMP180_register_MD); } /***EVT NOCH EIN ABSTURZ KRITERIUM */ long PRESSURE_vread_EEPROM_REGISTER(byte b_register){ /**EINLESEN VON ADC WERTEN ODER EEPORM DATEN */ uint16_t local; uint16_t MSB,LSB; I2C1->CR1 |= Bit8; // ERZEUGEN STARTKONDITION //LCD_vDrawString("START\0",2,40,1,0x0000); while((I2C1->SR1 & Bit0) == 0 ); // WHAITING START BIT GENERAITET I2C1->DR = BMP180_adress_write; //LCD_vDrawString("START-G\0",50,40,1,0x0000); while((I2C1->SR1 & Bit1) == 0 ); // WHAITING ADDR = 1 local = I2C1->SR2 ; // READ SR2 for Delete ADDR I2C1->DR = b_register; while( ((I2C1->SR1 & Bit7) == 0) && ((I2C1->SR1 & Bit2) == 0 )); // WHAITING Data register Empte I2C1->CR1 |= Bit9; // GGF WEGMACHEN for(local = 0; local <1000;local++); // WAIT TIME I2C1->CR1 |= Bit10; // AKNOLLAGE ENABLE ; I2C1->CR1 |= Bit8; // ERZEUGEN STARTKONDITION while((I2C1->SR1 & Bit0) == 0 ); // WHAITING START BIT GENERAITET I2C1->DR = BMP180_adress_read; while((I2C1->SR1 & Bit1) == 0 ); // WHAITING ADDR = 1 local = I2C1->SR2 ; // READ SR2 for Delete ADDR while( (I2C1->SR1 & Bit6 )== 0 ); // WHAIT DATA TRANSMIT MSB = I2C1->DR ; I2C1->CR1 &= ~Bit10; // NO ACNOLAGE BECAUSE LAST BYTE I2C1->CR1 |= Bit9; // STOP BETWEEN THE CURRENT TRANSFER while( (I2C1->SR1 & Bit6 )== 0 ); // WHAIT DATA TRANSMIT LSB = I2C1->DR ; return (MSB<<8)|LSB ; } void PRESSURE_vwrite_EEPROM_REGISTER(byte b_register, byte data){ uint16_t local; I2C1->CR1 |= Bit8; // START KONDITION while((I2C1->SR1 & Bit0) == 0 ); // WHAITING START BIT GENERAITET /**SENDEN ADRESSE */ I2C1->DR = BMP180_adress_write; while((I2C1->SR1 & Bit1) == 0 ); // WHAITING ADDR = 1 local = I2C1->SR2 ; // READ SR2 for Delete ADDR /**Senden erstes PACKET*/ I2C1->DR = b_register; while((I2C1->SR1 & Bit7) == 0 ); // WHAITING Data register Empte //local = I2C1->SR2 ; // READ SR2 for Delete ADDR /**SENDEN Zweites Packet */ I2C1->DR = data; while( ((I2C1->SR1 & Bit7) == 0) && ((I2C1->SR1 & Bit2) == 0 )); // WHAITING Data register Empte /**STOP CONDITION */ I2C1->CR1 |= Bit9; } byte I2C_write(byte bSlaveWriteAdress, byte bRegister, byte bValue){ uint16_t local; I2C1->CR1 |= Bit8; // START KONDITION while((I2C1->SR1 & Bit0) == 0 ); // WHAITING START BIT GENERAITET /**SENDEN ADRESSE */ I2C1->DR = bSlaveWriteAdress; while((I2C1->SR1 & Bit1) == 0 ); // WHAITING ADDR = 1 local = I2C1->SR2 ; // READ SR2 for Delete ADDR /**Senden erstes PACKET*/ I2C1->DR = bRegister; while((I2C1->SR1 & Bit7) == 0 ); // WHAITING Data register Empte //local = I2C1->SR2 ; // READ SR2 for Delete ADDR /**SENDEN Zweites Packet */ I2C1->DR = bValue; while( ((I2C1->SR1 & Bit7) == 0) && ((I2C1->SR1 & Bit2) == 0 )); // WHAITING Data register Empte /**STOP CONDITION */ I2C1->CR1 |= Bit9; return 1; } byte I2C_read(byte bSlaveWriteAdress,byte bSlaveReadAdress, byte bRegister, byte bNumOfBytes, byte *abArray){ /**EINLESEN VON ADC WERTEN ODER EEPORM DATEN */ uint16_t local; byte i; /*******************************************************/ // SEKTION 1 Auswahl des Registes durch write befehl /*********************************************************/ I2C1->CR1 |= Bit8; // ERZEUGEN STARTKONDITION while((I2C1->SR1 & Bit0) == 0 ); // WHAITING START BIT GENERAITET I2C1->DR = bSlaveWriteAdress; while((I2C1->SR1 & Bit1) == 0 ); // WHAITING ADDR = 1 local = I2C1->SR2 ; // READ SR2 for Delete ADDR I2C1->DR = bRegister; while( ((I2C1->SR1 & Bit7) == 0) && ((I2C1->SR1 & Bit2) == 0 )); // WHAITING Data register Empte I2C1->CR1 |= Bit9; // GGF WEGMACHEN for(local = 0; local <1000;local++); // WAIT TIME /*******************************************************/ // SEKTION 2 Eigentliches Auslesen der Werte /*********************************************************/ I2C1->CR1 |= Bit10; // AKNOLLAGE ENABLE ; I2C1->CR1 |= Bit8; // ERZEUGEN STARTKONDITION while((I2C1->SR1 & Bit0) == 0 ); // WHAITING START BIT GENERAITET I2C1->DR = bSlaveReadAdress; while((I2C1->SR1 & Bit1) == 0 ); // WHAITING ADDR = 1 local = I2C1->SR2 ; // READ SR2 for Delete ADDR for(i=0; i< bNumOfBytes-1; i++){ while( (I2C1->SR1 & Bit6 )== 0 ); // WHAIT DATA TRANSMIT abArray[i] = I2C1->DR ; } i= bNumOfBytes-1; I2C1->CR1 &= ~Bit10; // NO ACNOLAGE BECAUSE LAST BYTE I2C1->CR1 |= Bit9; // STOP BETWEEN THE CURRENT TRANSFER while( (I2C1->SR1 & Bit6 )== 0 ); // WHAIT DATA TRANSMIT abArray[i] = I2C1->DR ; return 1; }