bool i2c_initialize(uint8_t i2c_interface, uint32_t i2c_mode, uint8_t slave_addr, uint32_t baud_rate, void *handler) { //puts("i2c_initialize begin...\n"); printf("i2cInterface = %d\n", i2c_interface); i2c_clear_buffer((uint8_t *) i2c_master_buffer, I2C_BUFSIZE * sizeof(uint8_t)); //activate power for I2C2 i2c_active_power(i2c_interface); //select I2C2 functionality for pins x.xx (SDAx) and x.xx (SCLx) i2c_pin_select(i2c_interface); // clear I2CCON register flags i2c_clear_control_register(i2c_interface); //set baud rate i2c_set_baud_rate(i2c_interface, baud_rate); //set slave mode if (i2c_mode == I2CSLAVE) { i2c_set_slave_mode(i2c_interface, slave_addr); } /* Install interrupt handler */ if (!i2c_irq_handler_register(i2c_interface, handler)) { return false; } i2c_initial_master_transmitter_mode(i2c_interface); //puts("...i2c_initialize ended\n"); return (true); }
bool i2c_read(uint8_t i2c_interface, uint8_t slave_addr, uint8_t reg_addr, uint8_t *rx_buff, uint8_t rx_buff_length) { i2c_clear_buffer((uint8_t *) i2c_master_buffer, I2C_BUFSIZE * sizeof(uint8_t)); i2c_write_length = 1; i2c_read_length = rx_buff_length; bool successful; uint8_t readIndex = 3; i2c_master_buffer[0] = (slave_addr << 1) & WRITE_ENABLE_BIT_MASK; i2c_master_buffer[1] = reg_addr; i2c_master_buffer[2] = ((slave_addr << 1) & WRITE_ENABLE_BIT_MASK) | READ_ENABLE_BIT_MASK; successful = i2c_transaction(i2c_interface); if (successful && (rx_buff != NULL) && (rx_buff_length < (I2C_BUFSIZE - readIndex))) { memcpy(rx_buff, (const uint8_t *)(i2c_master_buffer + readIndex), sizeof(uint8_t) * rx_buff_length); return true; } else { return false; } }
bool i2c_write(uint8_t i2c_interface, uint8_t slave_addr, uint8_t reg_addr, uint8_t *tx_buff, uint8_t tx_buff_length) { //puts("[i2c.c/i2cWrite]: entered\n"); i2c_clear_buffer((uint8_t *) i2c_master_buffer, I2C_BUFSIZE * sizeof(uint8_t)); i2c_write_length = tx_buff_length + 1; i2c_master_buffer[0] = (slave_addr << 1) & WRITE_ENABLE_BIT_MASK; i2c_master_buffer[1] = reg_addr; if ((tx_buff != NULL) && tx_buff_length < (I2C_BUFSIZE - 2)) { int32_t j = 0; for (int32_t i = 2; i < tx_buff_length + 2; i++) { i2c_master_buffer[i] = tx_buff[j]; j++; //printf("I2CMasterBuffer[%d] = %d\n", i, I2CMasterBuffer[i]); } return i2c_transaction(i2c_interface); } else { puts("[i2c.c/i2cWrite]: Invalid buffer or invalid write buffer size\n"); return false; } }
//burst mode, the first element in the array bool i2c_trans_receive(uint8_t i2c_interface, uint8_t slave_addr, uint8_t *tx_buff, uint8_t tx_buff_length, uint8_t *rx_buff, uint8_t rx_buff_length) { puts("[i2c.c/i2cTransReceive]: entered\n"); i2c_clear_buffer((uint8_t *) i2c_master_buffer, I2C_BUFSIZE * sizeof(uint8_t)); i2c_write_length = tx_buff_length; i2c_read_length = rx_buff_length; if (tx_buff != NULL && (tx_buff_length > 0)) { int32_t read_index = 0; i2c_master_buffer[0] = (slave_addr << 1) & WRITE_ENABLE_BIT_MASK; for (int32_t i = 1; i < tx_buff_length + 1; i++) { if (i < I2C_BUFSIZE) { i2c_master_buffer[i] = tx_buff[i - 1]; } } //enable I2C to read if ((rx_buff_length > 0) && (i < I2C_BUFSIZE)) { i2c_master_buffer[i] = ((slave_addr << 1) & WRITE_ENABLE_BIT_MASK) | READ_ENABLE_BIT_MASK; read_index = i + 1; } bool successful = i2c_transaction(i2c_interface); if (successful && (rx_buff != NULL) && (rx_buff_length > 0)) { memcpy(rx_buff, (const uint8_t *)(i2c_master_buffer + read_index), sizeof(uint8_t) * rx_buff_length); return true; } else { return false; } } else { puts( "[i2c.c/i2cRead]: the txBuff is not valid or has not a valid \ length value !\n"); return false; } }
static uint16_t lm75A_get_register_value(uint8_t i2c_interface, uint8_t reg_addr, uint8_t reg_size) { uint8_t rx_buff[reg_size]; i2c_clear_buffer(rx_buff, sizeof(rx_buff)); if ((reg_size > 0) && (reg_size < 3)) { bool status = i2c_read(i2c_interface, LM75A_ADDR, reg_addr, rx_buff, sizeof(rx_buff)); if (!status) { //Slave is not ready puts( "[lm75a_tempSensorI2C/lm75A_getConfigReg]: Slave is not\ ready !\n"); if (reg_size < 2) { return UCHAR_MAX; } else { return UINT16_MAX; } }