#include "i2c.h" #include "usart.h" void i2c_init( i2c_t *i2c_dev, /*!< Pointer to I2C hardware Object */ i2cCh_t channelNo, /*!< The harware channel to be used */ i2c_mode_t mode, /*!< Master, Slave or Multymaster Modes */ uint16_t mainAddress, /*!< First and Main address of the device */ uint16_t secondAddress, /*!< Second address if dual addresse mode is configured */ i2c_address_count_t addressCount, /*!< Single or multiple */ i2c_address_size_t addressSize, /*!< 10 or 7 bit address size */ i2c_clk_speed_t speed, /*!< Bus Speed */ i2c_clk_stretching_t stretching, /*!< Clock Stretching enable onyl in slave mode */ i2c_wake_types_t wakeOn /*!< Wake up condition */ ) { i2c_dev->channelNo = channelNo; i2c_dev->mode = mode; i2c_dev->mainAddress = mainAddress; i2c_dev->secondAddress = secondAddress; i2c_dev->addressCount = addressCount; i2c_dev->addressSize = addressSize; i2c_dev->speed = speed; i2c_dev->stretching = stretching; i2c_dev->wakeOn = wakeOn; //Initial state States i2c_dev->hardwareState = i2c_hw_disabled; i2c_dev->periferalState = i2c_perif_disabled; i2c_hardware_enable(i2c_dev); i2c_periferal_disable(i2c_dev); // Just to be sure as periferal configuration can not be dont when active. i2c_set_filter(i2c_dev,1); i2c_set_clk_stretch(i2c_dev, stretching); i2c_set_clk_speed(i2c_dev, speed); i2c_set_mode(i2c_dev, mode); i2c_set_address_lenght(i2c_dev, addressSize); i2c_set_address(i2c_dev, mainAddress); i2c_set_address_second(i2c_dev, mainAddress); i2c_periferal_enable(i2c_dev); print_Usart(usart2, "\n\rI2C -> periferal enabled\n\r"); } void i2c_read(i2c_t *i2c_dev, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght) { i2c_dev->periferalState = i2c_perif_read; // Arch nemesis ! We only setn the address // but the counter allso socunt the bits that we have recieved // and we want to read one byte // every transaction counts i2c_set_transfer_counter(i2c_dev,1); i2c_send_address_for_write(i2c_dev, slaveAddress); i2c_send_reg_address(i2c_dev, registerAddress); while(!i2c_is_transfer_complete(i2c_dev)); //i2c_set_transfer_counter(i2c_dev,2); i2c_send_address_for_read(i2c_dev, slaveAddress); i2c_get_input_register(i2c_dev, data); while(!i2c_is_transfer_complete(i2c_dev)); i2c_send_nack(i2c_dev); i2c_send_stop(i2c_dev); while(!i2c_is_perif_ready(i2c_dev)); } void i2c_write(i2c_t *i2c_dev, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght) { uint8_t i = *dataLenght + 1 ; i2c_dev->periferalState = i2c_perif_write; i2c_set_transfer_counter(i2c_dev,i); i2c_send_address_for_write(i2c_dev, slaveAddress); i2c_send_reg_address(i2c_dev, registerAddress); for(i = 0; i < *dataLenght; i++) { i2c_send_data(i2c_dev, data); } while(!i2c_is_transfer_complete(i2c_dev)); i2c_send_stop(i2c_dev); while(!i2c_is_perif_ready(i2c_dev)); } uint8_t i2c_check_device(i2c_t *i2c_dev, uint16_t *device) { i2c_dev->periferalState = i2c_perif_write; i2c_set_transfer_counter(i2c_dev,0); i2c_send_address_for_write(i2c_dev, device); if(i2c_check_nack(i2c_dev)) { i2c_dev->hardwareState = i2c_hw_got_nack; i2c_throw_error(i2c_dev,1); return 0; } i2c_dev->hardwareState = i2c_hw_got_ack; return 1; } uint8_t i2c_discover_devices(i2c_t *i2c_dev) { uint16_t i = 0; for(i = 0x03; i <= 0x77; i++) { i2c_check_device(i2c_dev,&i); } return 1; } void i2c_throw_error(i2c_t *i2c_dev, uint8_t error) { print_Usart(usart2, "\n\r"); print_Usart(usart2, "I2C : Error"); print_Usart(usart2, "\n\r"); if(error == 1) { print_Usart(usart2, " -> Device not Found "); print_Usart(usart2, "\n\r"); } }