/*************************************************************************** * NAME: I2C.h * * AUTHOR: Lennart Eriksson * * PURPOSE: Enabole the I2C Communication channel on the Revo board * * INFORMATION: * * This file initilizes the I2C communication that can be used by barometer * * communication etc. * * * * GLOBAL VARIABLES: * * Variable Type Description * * -------- ---- ----------- * ***************************************************************************/ #ifndef DRIVERS_I2C_H_ #define DRIVERS_I2C_H_ #include "stm32f4xx.h" /****************************************************************************** * BRIEF: Configure the I2C bus to be used * * INFORMATION: This function only implements I2C1 or I2C2 which are available * * on the REVO board * ******************************************************************************/ bool i2c_configure(I2C_TypeDef* i2c, I2C_HandleTypeDef* out_profile, uint32_t my_address); /****************************************************************************** * BRIEF: Get data over the I2C bus * * INFORMATION: * * Since this system uses a 7 bit addressing mode we send the slave address * * in the first bytes 7 MSbs and then the LSb is set to 1 indicating that * * it is a receive command, after that the slave responds with a 1 bit ack and * * the data is sent one byte at a time with an acknowledge in between * * every byte, as per the standard. Returns true if successful * ******************************************************************************/ bool i2c_receive(I2C_HandleTypeDef* profile, uint8_t slave_address, uint8_t* buffer, uint32_t length); /****************************************************************************** * BRIEF: Send data over the I2C bus * * INFORMATION: * * Since this system uses a 7 bit addressing mode we send the slave address * * in the first bytes 7 MSbs and then the LSb is set to 0 indicating that * * it is a send command, after that the slave responds with a 1 bit ack and * * the data is sent one byte at a time with an acknowledge in between * * every byte, as per the standard. Returns true if successful * ******************************************************************************/ bool i2c_send(I2C_HandleTypeDef* profile, uint8_t slave_address, uint8_t* data, uint32_t length); #endif /* DRIVERS_I2C_H_ */ // ---------------------- I2C Working with the compas on the REVO board ------------------------------ /* int main(void) { // Initialize the Hardware Abstraction Layer HAL_Init(); init_system(); I2C_HandleTypeDef i2c_profile; //---- COMPAS WORKING ---- i2c_configure(I2C1, &i2c_profile, 0x56); uint32_t address = 0b00011110; uint8_t start_request_1[2] = { 0b00000000, 0b01110000 }; uint8_t start_request_2[2] = { 0b00000001, 0b10100000 }; uint8_t start_request_3[2] = { 0b00000010, 0b00000000 }; uint8_t request_data[1] = { 0b00000110 }; uint8_t reset_pointer_data[1] = { 0b00000011 }; uint8_t response_data[6] = { 0x0 }; // This sequence starts the compass by first initializing it with the first 2 send // The third is there to say that the system should be continous communication i2c_send(&i2c_profile, address, &start_request_1, 2); i2c_send(&i2c_profile, address, &start_request_2, 2); i2c_send(&i2c_profile, address, &start_request_3, 2); // Delay for at least 6 ms for system startup to finish HAL_Delay(10); while (1) { i2c_send(&i2c_profile, address, &request_data, 1); i2c_receive(&i2c_profile, address, &response_data, 6); i2c_send(&i2c_profile, address, &reset_pointer_data, 1); // HAL_Delay(100); if(response_data[0] != 0) response_data[0] = 0; } } */